一、目标

一、目标

分析某段子App的通讯协议,实现段子爬虫。

  • 某段子App版本 5.5.10

二、分析

上一篇文章我们已经分析出了 某段子App的签名sign计算方法,但是签名之前的数据是二进制的密文,所以我们首先要定位明文的数据。

  • 这里介绍一个用frida定位的方式:堆栈定位法,通过打印被hook函数的堆栈来定位调用的函数。
        var threadef = Java.use('java.lang.Thread');
        var threadinstance = threadef.$new();

        function Where(stack){
            var at = ""
            for(var i = 0; i < stack.length; ++i){
                at += stack[i].toString() + "\n"
            }
            return at
        }

		// 被hook的函数体中使用
        var stack = threadinstance.currentThread().getStackTrace();
        console.log("Full call stack:" + Where(stack));
  • 运行 python3 run.py hook, 输出结果
Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1538)
com.izuiyou.network.NetCrypto.sign(Native Method)
com.izuiyou.network.NetCrypto.a(SourceFile:1)
y04.intercept(SourceFile:42)
jp5.a(SourceFile:11)
jp5.a(SourceFile:2)
c40.intercept(SourceFile:8)
jp5.a(SourceFile:11)

可以看到调用签名函数NetCrypto.a的位置是 y04.intercept

  • 这次我们使用一个新的反编译工具 JEB 3.19.1 PRO 来反编译某段子App的apk,然后搜索 y04
jebcode
1:jadxcode

可以看到在调用 NetCrypto.a 之前入参的byte数组先经过了 NetCrypto.encodeAES 来加密,加密之前的数据类型也是一个byte数组 v1_2,但是仔细从前面的几行代码里找一下,发现 v1_2其实是String变量,现在我们需要把这个String打印出来。

  • hook NetCrypto.encodeAES函数来打印入参字符串
		ZYNetCrypto.encodeAES.implementation = function(arg1){
			console.log("\nNetCrypto.encodeAES\n");

			var strIn = Java.use('java.lang.String');
			var outStr = strIn.$new(arg1);
			console.log(outStr);

			var result = this.encodeAES(arg1);
			return result;
		}

这里有个小技巧,入参是byte数组,如何转换成String呢?

//string 转 byte[]
String str = "Hello";
byte[] srtbyte = str.getBytes();

// byte[] 转 string
String res = new String(srtbyte);
System.out.println(res);

这次协议的明文显示出来了。

NetCrypto.encodeAES

{"h_av":"5.5.10","h_dt":0,"h_os":27,"h_app":"zuiyou","h_model":"Redmi 6A","h_did":"7011dadb0bff95b1","h_nt":1,"h_m":231231186,"h_ch":"xiaomi","h_ts":1602637244846,"token":"TfKcNnqg13_aFV9JwkfuiZtvPrbLuJ1ypraRae1vujr2MHJrhnuhgvnVTXOVyr5V2M3gh","android_id":"8018dadb0bff13b1","h_ids":{"imei2":"869839142239784","meid":"99002284061989","imei1":"868939032239776","imei":"99002284063389"},"h_os_type":"miui"}

三、总结

某段子App的通讯协议流程是, 请求参数→AES加密→密文做sign签名,下一篇文章我们就来实现这个爬虫。

100

关注微信公众号,最新技术干货实时推送

100