一个android crackme的逆向
crackme难度不高,主要是为了熟悉逆向分析apk的步骤。
脱壳
反编译apk发现加了360的壳,主Activity为com.kanxue.test.MainActivity

frida-dexdump一把梭,dump的dex需要修复checksum和signature。修复完成后jadx反编译dex,程序会调用native函数test检测flag是否正确。

去字符串加密
ida打开so文件先看一下init/init_array,发现了标准的ollvm字符串加密函数。

利用unicorn模拟执行加密函数datadiv_decode4192348989750430380并将加密的字符串修复。

函数解密
so导出函数中先搜索test并未找到说明是动态注册,查看Jni_OnLoad发现其被动态注册为ooxx。

查看ooxx发现函数部分代码被加密无法反编译,其首先调用的应该是解密函数。

sub_8930函数通过找到ooxx函数的起始地址后将其加密部分代码进行解密,解密完成后调用cacheflush刷新。

通过frida来hookcacheflush将解密后的函数打印出来.
function main(){
var module_base = Module.findBaseAddress("libnative-lib.so");
var mprotect_add = Module.findExportByName("libc.so", "cacheflush");
Interceptor.attach(mprotect_add,{
onEnter: function(args){
if(args[0] > module_base && args[0] < module_base.add(0x100000)){
console.log("\nargs :", args[0], args[1], args[2]);
console.log(args[0].sub(1).readByteArray(args[1] - args[0]));
console.log("called cacheflush");
}
},
onLeave: function(){}
})
}
setImmediate(main)
hook 发现其会调用两次cacheflush,也就是先解密函数并刷新,执行完之后再次加密函数并刷新。

用打印的数据修复so文件中被加密的函数,得到flag就是kanxuetest。


浙公网安备 33010602011771号