Android 某东Sign与cipher解密
本帖最后由 胡家二少 于 2022-12-21 17:13 编辑## Android 某东Sign与cipher解密
> 最近疫情原因,哎,又沦落到了抢抢抢的境地,洋洋洒洒的网页端一气呵成写了个小助手哈,想要买莲花清瘟,一看只能手机APP购买。我去!真无语!那么再拿手机端开个刀吧,作如下记录。
> 本人所发布的文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。如有侵权请联系我删除处理。
主要功能涉及如下:
1.解密sign
2.解密cipher
### 1.APP版本:
------
**For Android V11.3.2 build98450**
### 2.工具
------
预先善其事,必先利其器!请先准备如下分析工具
1. (https://github.com/skylot/jadx.git)
2. (https://hex-rays.com/IDA-pro/)
3. (https://frida.re/)
4. (https://github.com/zhkl0228/unidbg)
5. (https://www.charlesproxy.com/)
6. (https://www.jetbrains.com/)(可选)
7. (https://code.visualstudio.com/)(可选)
### 3.分析
> 手机环境配置抓包请大家自己解决。下面演示购物车数据的抓取功能。从手机到PC端代码实现。
#### Charles抓包
打开手机app,然后再点击购物车功能
`https://api.m.*.com/client.action`
我们在Charles会看到很多这个地址的请求,我们可以找一下购物车的包,地址中包含 **functionid=cart** 的就是购物车的请求
我们详细的看一下这个请求所携带的数据如下:
经过多次抓包查看,发现这三个值是变化的。因此我们开始分析APP。
#### Sign-Jadx静态分析
把app导入到jadx,我们要追踪st,sign,sv这三个参数的来源,那么我们线搜索一下,大概找下sign的位置
看到我标注的那个方法,**addQueryParameter** 翻译一下不就是添加sign参数嘛。点进去分析看看。
经过frida注入调试,分析出确实是这个方法 但是他是不进这个if的,不是这上半部分的代码,而是下半部分的代码
最终定位到是下面的这行代码生成的sign,而且还有其他的2个参数 st与sv
我们继续点击这个函数进去看一下发现是个接口。有接口必然有实现!
那么如何去找它的实现类呢?我们继续搜索搜索这个类的完整路径`com.jingdong.jdsdk.d.c.s`
我们继续点击进去第一个,发现果真找到了接口的实现类如下:
最终我们看到sign是调用的so....白瞎了之前的一顿操作。至此分析结束。那么我们用frida来验证下是不是这样。
#### Sign-Frida注入验证
注意新版京东有检测frida的,需要改个进程名跟端口。
用frida注入如下函数` BitmapkitUtils.getSignFromJni(context, str, str2, str3, str4, str5);`
```javascript
function HookHandle(clazz) {
clazz.getSignFromJni.implementation = function (a, b, c, d, e, f) {
console.log("=======================================")
var r = this.getSignFromJni(a, b, c, d, e, f);
console.log("param1: ", a)
console.log("param2: ", b)
console.log("param3: ", c)
console.log("param4: ", d)
console.log("param5: ", e)
console.log("param6: ", f)
console.log("result: ", r)
return r;
}
console.log("HookHandle ok")
}
Java.perform(function () {
Java.choose("dalvik.system.PathClassLoader", {
onMatch: function (instance) {
try {
var clazz = Java.use('com.jingdong.common.utils.BitmapkitUtils');
HookHandle(clazz)
return "stop"
} catch (e) {
console.log("next")
console.log(e)
}
},
onComplete: function () {
console.log("success")
}
})
})
```
请使用上面这种注入方法,不然会发生找不到类的错误。
如上,我们可以看出,st sign sv都是从so来的。
至此,sign的来源已理清。
但是我们还有一个body的加密字段
我们继续重复上面的分析。
#### cipher-Jadx静态分析
继续搜索”cipher“字段
可以看到就一个类,那么就很简单的可以得出加密算法了
通过frida注入这个b函数会发现b参数==MODIFIED_BASE64 就是进入的这个if,而且加密算法就在d.b()这个方法。直接用java还原就行了。
### 4.调用
sign签名用(https://github.com/zhkl0228/unidbg)模拟调用so就可以了。cipher这个直接复制d这个类就包含了加解密。然后模拟登录再请求购物车信息就ok啦。
结果展示获取购物车数据:
XUEXIxuexi学习了 谢谢分享 ermuya 发表于 2023-3-26 23:40
额,刚才找到了,看到下面loadBMP 方法中有一个jdbitmapkit字符,找到了。
我也找到了jdbitmapkit这个
public static synchronized void loadBMP() {
synchronized (BitmapkitUtils.class) {
if (b || isBMPLoad) {
return;
}
c.a(JdSdk.getInstance().getApplication(), "jdbitmapkit");
b = true;
isBMPLoad = true;
}
}
然后呢,咋去找so文件啊。。。。 牛逼!!!!!!!!!! 厉害厉害👍,一遍没看明白,回帖继续看 一遍没看明白,回帖继续看 最想学app爬虫的逆向!! 谢谢分享 挺强的 这个要好好学习 京东还是看账号的,挂也没用。。。 好好学习,期待 十分感谢楼主分享