需求: meiyanxiangji登录界面, 利用账密登录确认手机号是否是注册用户
一, 查找参数位置
看到只有sig参数需要破解, jadx打开apk, 搜索参数,
使用zentracer(https://blog.csdn.net/qq_38851536/article/details/103755407?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242)
结果:
二, 确定参数加密位置, 就看是怎么加密的
看com.xxx.secret.SigEntity这个类, 很明显是so native方法(nativeGeneratorSigOld), 把手机里的apk导入电脑(https://blog.csdn.net/jss4j/article/details/88891334),改成.zip, 解压, 进入lib/arm64-v8a,找到librelease_sig.so, 拖进IDA,
三, Frida hook so(方法一)
jsCode_so_1="""
Interceptor.attach(Module.findExportByName("librelease_sig.so" , "_Z13MD5_CalculatePKcjPc"), {
onEnter: function(args) {
send("open11111(" + Memory.readCString(args[0])+","+args[1]+")");
},
onLeave:function(retval){
}
});
"""
运行, 结果, 可以看到手机号和密码在里面, 剩下的都是写死的:
[*] open11111(oauth/access_token.json010898676081531385131625285601843.3.03.3.0.1534de2e7cf5b4d236.0.1868676860238407299.9.20Nexus 6PNexus 6PQQ64WIFIandroiddbc1fbc3e4cc39057304kkkk1234567phonezh-HansqA#QH=M+Ns&q+Z&J1623831095656Tw5AY783H@EU3#XC,0xe6)
# 加密结果:
917b383ad72c978d14fdbe9a14898579
#这里最后的坑, 他把结果每2位颠倒了一下
19b783a37dc279d841dfeba941985897
三, Frida hook so(方法二,通过偏移)
jsCode_so="""
Java.perform(function () {
var base_addr = Module.findBaseAddress("librelease_sig.so");
var offset = 0x8874;
console.log("base_addr: " + base_addr);
var func_addr=null;
if(base_addr!=null) {
func_addr = base_addr.add(offset);
if (Process.arch == 'arm')
var aaaa111 = func_addr.add(1); //如果是32位地址+1
else
var aaaa111 = func_addr;
}
Interceptor.attach(func_addr, {
onEnter: function(args){
send("open(" + Memory.readCString(args[0])+","+args[1]+")");
},
});
});
"""
里面的offset就是ida里的值