# 第一题 java 层加密
packagename: com.yuanrenxue.challenge
搜索题目一,定位到如下位置
使用 r0capture 抓包
# attach 模式 | |
python r0capture.py -U com.yuanrenxue.challenge -v -p iqiyi.pcap | |
# spawn 模式 | |
python r0capture.py -U -f com.yuanrenxue.challenge -v |
抓完后用 wireshark 打开 pcap 文件,发现,这里就是发送数据的地方, source 为 192.168.0.100 发送的了请求,携带了 page、sign、t 三个参数
发送参数
返回数据
通过参数的值,我们很容易就能猜测到,page 就是页面,t 就是时间戳,sign 就是加密参数,接下来就跟进 jadx 中分析具体逻辑
在这里很容易看到,page 和时间戳的生成逻辑,即这个 OooO2 就是对应的 sign 参数,点进去发现涉及到了个复杂的算法,相当于将 page 和时间戳拼接到了个 StringBuider 中,然后在转化为 byte 数组,经过这一系列加密,拿到了最后的加密结果。
用将加密算法放入 idea 中,写一个 demo,最后拿到对应的参数
# okhttp3 使用
在 xml 中加入依赖
<dependencies> | |
<dependency> | |
<groupId>com.squareup.okhttp3</groupId> | |
<artifactId>okhttp</artifactId> | |
<version>3.8.1</version> | |
</dependency> | |
<dependency> | |
<groupId>com.google.code.gson</groupId> | |
<artifactId>gson</artifactId> | |
<version>2.8.9</version> | |
</dependency> | |
</dependencies> |
下面哪个是 gson 用于解析 json 的
然后编写如下代码
// 需要单独建一个类用于将 gson 解析的字符串与其对应,然后用。访问 | |
public class YrxData { | |
public String status; | |
public String state; | |
public List<Datalist> data; | |
public static class Datalist { | |
String value; | |
} | |
} |
# 采集
public static String getSign(int page, long currentTimeMillis){ | |
StringBuilder sb = new StringBuilder(); | |
sb.append("page="); | |
sb.append(page); | |
sb.append(currentTimeMillis); | |
String sign = new Oooo000().OooO(sb.toString().getBytes(StandardCharsets.UTF_8)); | |
return sign; | |
} | |
public static void main(String[] args) throws IOException { | |
Integer result = 0; | |
OkHttpClient client = new OkHttpClient.Builder().build(); | |
String url1 = "https://www.python-spider.com/api/app1"; | |
for (int page = 1; page <= 100; page++) { | |
long currentTimeMillis = System.currentTimeMillis(); | |
String sign = getSign(page,currentTimeMillis); | |
RequestBody body = new FormBody.Builder() | |
.add("page", String.valueOf(page)) | |
.add("sign", String.valueOf(sign)) | |
.add("t", String.valueOf(currentTimeMillis)) | |
.build(); | |
Request request = new Request.Builder() | |
.url(url1) | |
.post(body) | |
.build(); | |
try (Response response = client.newCall(request).execute()) { | |
String resStr = response.body().string(); | |
System.out.println(page +" ===> "+ resStr); | |
Gson gson = new Gson(); | |
YrxData yrxdata = gson.fromJson(resStr,YrxData.class); | |
for(int i=0; i<10; i++){ | |
Integer nowvalue = Integer.parseInt(yrxdata.data.get(i).value.trim()); | |
System.out.println(nowvalue); | |
result += nowvalue; | |
} | |
System.out.println(result); | |
} catch (IOException e){ | |
System.out.println(e); | |
} | |
} | |
System.out.println(result); | |
} | |
// 结果 5137931 |