本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,拒绝转载,若有侵权请联系我删除!
目标app:5Lqs5LicYXBwMTEuMy4y
目标接口:aHR0cHM6Ly9hcGkubS5qZC5jb20vY2xpZW50LmFjdGlvbj9mdW5jdGlvbklkPXNlYXJjaA==
一、引言
今天来研究下某东的搜索接口,尝试将加密的参数还原出来。
二、抓包分析
1、在模拟器或者真机上安装app
2、配置Fiddler代理,安装证书
3、点击app上方的输入框,输入关键字,成功抓到关键词搜索的包,我们发现请求url中有个sign参数,这个经过我分析是调用的so中的方法,这个参数放到下篇文章,通过Unidbg主动调用来生成该参数。今天我们主要来研究下请求体中加密参数的生成。
三、调试
1、定位关键代码
使用jadx打开apk文件,搜索关键字cipher、body等。我们会发现出来的结果特别多,这对于我们分析非常不友好。
这时候不妨搜索下周边的几个参数名称,如:hdid,其他几个参数很多时候都是在附近的,搜索结果明显少了很多,我们依次点开分析
定位到如下位置,果然关键代码就在附近
2、我们尝试hook上层方法,看下入参和返回值。
let e = Java.use("com.jd.phc.e");
e["b"].implementation = function (map, bVar) {
console.log(`e.b is called: map=${map}, bVar=${bVar}`);
let result = this["b"](map, bVar);
console.log(`e.b result=${result}`);
return result;
};
入参是个map,再通过JSONObject转一下,成功打印出入参字符串。和我们抓包抓到的信息比对,一模一样!
var jsonObj = Java.use('org.json.JSONObject').$new(map);
console.log("map : " + jsonObj.toString())
3、仔细分析代码,cipher是由这一段代码赋值
jSONObject2.put("cipher", jSONObject);
查看上方代码:jSONObject是这边生成的,map就是这个方法 的入参,都是明文。
我们hook到bVar的值是5,和b.MODIFIED_BASE64.value()值相等
所以最终执行的代码是这一段,我们扣出来尝试还原。
for (String str2 : map.keySet()) {
String str3 = map.get(str2);
String b2 = d.b(str3.getBytes());
com.jd.phc.i.b.a("PHCEngine", "brian Encoded str of " + str3 + " is :" + b2);
jSONObject.put(str2, b2);
}
四、还原
1、删除无效代码:
com.jd.phc.i.b.a("PHCEngine", "brian Encoded str of " + str3 + " is :" + b2);
2、需要补全d.b(),跟进去把代码扣出来
3、补全缺少的数组f7339a
private static char[] f7339a = {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
五、最后
将入参封装成一个HashMap,成功还原出加密的body,效果如下:
收工!