朋友搞个刷步数软件 叫帮忙找下解密的内容
下载下来发现通过jni加载so的方法进行加密
hook下
Java.perform(function() {
var array_list = Java.use("java.util.ArrayList");
var ApiClient = Java.use('com.android.org.conscrypt.TrustManagerImpl');
var okhttp = Java.use('com.codoon.common.http.HttpSignatureUtil');
okhttp.calHttpSignatureString.overload('android.content.Context', 'java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(a1,a2,a3,a4,a5){
console.log(a1);
console.log(a2);
console.log(a3);
console.log(a4);
console.log(a5);
return this.calHttpSignatureS1(a1,a2,a3,a4,a5);
}
ApiClient.checkTrustedRecursive.implementation = function(a1,a2,a3,a4,a5,a6) {
console.log('Bypassing SSL Pinning');
var k = array_list.$new();
return k;
}
},0);
一堆乱七八糟的东西。。。
在import com.codoon.jni.JNIUtils;这个类里面
跟进去发现加载一个encrypt的so文件
反编译apk找到它
用ida反编译
从exports导出函数发现方法 Java_com_codoon_jni_encryptHttpSignature
跟到代码 F5里发现加密方法
尝试hook下传入参数
这里有个坑 安卓的ps 是-A 大写的A。。。。
ps -A找到pid
然后查看映射的内存地址
cat /proc/15308/maps | grep libencrypt.so |
找到对应地址为c90c4000
加密函数为548C
那么hook对应地址为
c90c4000 (3373023232) + 548c (21644)+1 = c90c948d
hook传入参数
var nativePointer = new NativePointer(0xC90C948D);
console.log("net native pointers:"+nativePointer);
var result_pointer;
Interceptor.attach(nativePointer, {
onEnter: function(args) {
// result_pointer = args[2].toInt32();
console.log("netcrypt so args: "+Memory.readCString(args[0])+", "+args[1]+", "+args[2]+", "+args[3]);
},
});
传参是对应16进制地址