目标
安卓版本10.0.2,对其进行抓包并探索sign签名算法
分析
通过全局搜索sign=
在com.jingdong.sdk.gatewaysign和com.jingdong.jdsdk.network.toolbox中发现对sign的操作
由此直接hook最先的加密的class,即javax.crypto.spec.SecretKeySpec
hook构造函数,和普通的函数是有区别的,要用$init这种形式,并且要return this.$init(arg1,arg2)调用原始的函数实现
function hook(){
Java.perform(function (){
var hookclass = Java.use("javax.crypto.spec.SecretKeySpec");
hookclass.$init.overload('[B','java.lang.String').implementation = function (a,b){
var result = this.$init(a,b);
console.log("算法为: "+ b);
console.log(a);
return result;
}
});
}
setImmediate(hook);
通过返回得知
>>>算法为: HmacSHA256
>>>51,52,54,54,57,99,54,54,97,101,56,51,52,53,55,97,57,97,56,101,55,98,52,100,48,52,49,55,102,48,50,102
>>>算法为: AES
>>>92,71,-78,37,6,27,-125,-92,21,103,84,15,88,-112,-80,45
将算法为HmacSHA256进行加密得到
aed1ebaab9e61fcc51ec0ab97fb522f13deea2b57958533c4bd511871806d5b0
这与抓到的位数不同
另寻他路
通过全局搜索没有找到组装reqest参数的代码,判断组装代码在so文件中。在so文件libjdbitmapkit.so,通过全局搜索sign的关键词,得到了
在逐一查看的时候,发现地址00012EB0和00012C4E都写到了该调用的代码
1最终
在方法中发现其调用者
即Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni
在这个function中追踪到了代码包com.jingdong.common.utils,而调用该方法的getSignFromJni
因此,hook为
function hook(){
Java.perform(function (){
var hookclass = Java.use('com.jingdong.common.utils.BitmapkitUtils');
hookclass.getSignFromJni.implementation = function(a,b,c,d,e,f){
var result = this.getSignFromJni(a,b,c,d,e,f);
console.log(">>> hook = " + b + ' / ' + c + ' / ' + d + ' / ' + d + ' / ' + f + ' \n rc= ' + result);
return result;
}
});
}
setImmediate(hook);