快手sig参数逆向分析
1. 捉包分析一下api
sig参数在app会校验, 错误会显示
![](https://img.haomeiwen.com/i13570404/3fae6b0be4531c4e.png)
2. 静态分析代码
jadx打开apk, 搜索关键词: "sig"
全局搜索sign相关的关键词
如: &sign= "sign' sign= ......等等
![](https://img.haomeiwen.com/i13570404/159c04bdab12db37.png)
进入调用的方法中, 看到sig的值是CPU.a()这个方法的返回值
![](https://img.haomeiwen.com/i13570404/0ae45f554ca1740d.png)
进入CPU.a(), 发现最后是调用了native方法
![](https://img.haomeiwen.com/i13570404/82610d74a48cfea8.png)
3. frida + objection 查看调用的参数hook住CPU.a()
![](https://img.haomeiwen.com/i13570404/64eeea974625e516.png)
调用栈如下:
(agent) [r0aofowzhsa] Backtrace:
com.yxcorp.gifshow.util.CPU.a(Native Method)
g.a.a.g6.d0.a(kSourceFile:50987168)
g.a.w.n.a(kSourceFile:69468173)
g.a.a.g6.x.a(kSourceFile:68943983)
g.a.w.f.a(kSourceFile:18612728)
..
..
..
试试hook g.a.a.g6.d0.a这个方法
![](https://img.haomeiwen.com/i13570404/1a72f1953b8a421b.png)
貌似只能看到参数类型, 换种思路解决
4. 编写frida脚本, 重写这个方法
js代码
![](https://img.haomeiwen.com/i13570404/80fdd22138e4aad9.png)
运行结果
![](https://img.haomeiwen.com/i13570404/dba2342753b3ddcc.png)
分析方法的三个参数
第一个是 okhttp3.Request请求实例
第二个是url中的get参数 , map形式
![](https://img.haomeiwen.com/i13570404/75ca84574c02f862.png)
第二个是url中的post参数, map形式
![](https://img.haomeiwen.com/i13570404/85abc20ae627b651.png)
5. 分析方法的逻辑
![](https://img.haomeiwen.com/i13570404/747033c149746c35.png)
5. native方法, so文件分析
查看 jni_onload
![](https://img.haomeiwen.com/i13570404/cd56c070e366c595.png)
本人汇编不是很熟, 借鉴了网上大神的文章, 发现so中是md5 + salt的方式加密
ida分析内存, 获取sign的salt盐, salt是经过内存动态加载的
![](https://img.haomeiwen.com/i13570404/e16bd3daa057f8ce.png)
![](https://img.haomeiwen.com/i13570404/7258b91670a6142b.png)
切换回汇编代码
![](https://img.haomeiwen.com/i13570404/66e608318c3dc269.png)
偏移量是0x5070
使用frida通过内存地址获取salt值
js代码
Java.perform(function () {
//读取基址并加上偏移,就是该字符串在内存中的地址
var soAddr = Module.findBaseAddress("libcore.so");
console.log(soAddr);
//基址 + 偏移,就是动态时的内存地址
var saltAddr = soAddr.add(0x5070);
//观察内存中的值
console.log(hexdump(saltAddr , {
offset: 0,
length: 64,
header: true,
ansi: true
}));
}
运行得到以下结果:
![](https://img.haomeiwen.com/i13570404/15f5db3ffd06dd4e.png)
试下打印出上述获得的内存地址
console.log(hexdump(new ptr(0xa9b62730) ,{
offset: 0,
length: 64,
header: true,
ansi: true
}));
![](https://img.haomeiwen.com/i13570404/9a1b9fb325a12ad0.png)
使用frida自带的api打印出salt
![](https://img.haomeiwen.com/i13570404/b72a6eb54ee5c6a2.png)
![](https://img.haomeiwen.com/i13570404/218bec05f6e01bef.png)
还原成python方法, 算出的加密sig参与捉包的一致