一个android crackme的逆向

crackme难度不高,主要是为了熟悉逆向分析apk的步骤。

脱壳

反编译apk发现加了360的壳,主Activity为com.kanxue.test.MainActivity

frida-dexdump一把梭,dump的dex需要修复checksumsignature。修复完成后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

posted @ 2023-03-05 03:03  怎么可以吃突突  阅读(285)  评论(0编辑  收藏  举报