# 第一题 java 层加密

packagename: com.yuanrenxue.challenge

搜索题目一,定位到如下位置

image-20220803114427625

使用 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 三个参数

image-20220803144525277

发送参数

image-20220803144418271

返回数据

image-20220803144632863

通过参数的值,我们很容易就能猜测到,page 就是页面,t 就是时间戳,sign 就是加密参数,接下来就跟进 jadx 中分析具体逻辑

image-20220803144936909

在这里很容易看到,page 和时间戳的生成逻辑,即这个 OooO2 就是对应的 sign 参数,点进去发现涉及到了个复杂的算法,相当于将 page 和时间戳拼接到了个 StringBuider 中,然后在转化为 byte 数组,经过这一系列加密,拿到了最后的加密结果。

image-20220803145223487

用将加密算法放入 idea 中,写一个 demo,最后拿到对应的参数

image-20220803154213156

# 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
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay