本文为看雪论坛优秀文章
看雪论坛作者ID:那年没下雪
很明显这里面要分析的就是这个p_sign,那么直接把APK扔jadx看看,果然没那么简单加壳了还是某数字企业壳,这下难度增高了、这里省略脱壳的步骤。数字企业壳懂得都懂不可能全部脱下来的只能用哪些类就脱哪些了,略微麻烦点。
这里直接通过p_sign是很难搜索到对应代码块的,这里大概尝试了N种方法都没有找到有价值的信息。想着通过url的地址去找对应的发请求的位置是不是可以,于是通过搜索url路径找到了一个类。
通过Hook AppUrlConstant类的getAPPDomain方法找到、然后打印堆栈信息找到跟这个方法相关的一些类,截图如下:
那么接下来就从图上这几个类分析了,最终定位在BaseRequest这个类,在这个类里找到了我们需要分析的p_sign,下面的事情就简单了看看它是怎么生成的了。
这是具体的加密方法,没啥难度了。
frida hook下入参。
D291A30K cityid 430100 kw 宝马X5 lat28.233212lon112.958713 p_appid price.android p_appversion7.4.5 p_chanel tecentmarket p_deviceid 0ac783fa_2b73_4185_871c_84c380da38d7 p_osversion 10 p_timestamp 1649402430107 type 0 D291A30K
基本上一目了然就是把appKey和请求参数加固定参数拼接起来做MD5运算,然后在对md5结果做一些处理。
frida代码也贴上:
Java.perform(function(){
let AppUrlConstant = Java.use("com.cubic.choosecar.data.AppUrlConstant");
AppUrlConstant.getAPPDomain.implementation = function(){
console.log('getAPPDomain is called');
let ret = this.getAPPDomain();
console.log('getAPPDomain ret value is ' + ret);
printStack();
return ret;
};
let EncryptionHelper = Java.use("com.autohome.baojia.baojialib.tools.EncryptionHelper");
EncryptionHelper.md5s.overload('java.lang.String').implementation = function(str){
console.log('md5s is called str ',str);
let ret = this.md5s(str);
console.log('md5s ret value is ' + ret);
return ret;
};
})
}
function printStack() {
Java.perform(function () {
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
});
}
function print(maps){
var JSONObject = Java.use("org.json.JSONObject")
var result = JSONObject.$new(maps)
console.log(result.toString())
}
setImmediate(main)
看雪ID:那年没下雪
https://bbs.kanxue.com/user-home-884888.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!