一次安卓逆向

Posted by bfpiaoran on March 11, 2019

朋友搞个刷步数软件  叫帮忙找下解密的内容

下载下来发现通过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进制地址