最近一直在研究百度壳,发现网上这方面的资料非常少。所以我把自己做的发出来跟大家分享,共同学习进步。
下面开始:
一、init_array
我们发现init_array中存在多个函数地址,JNI_Onload为加密状态
动态调试在init_array上下断跟着进入一个大循环。发现他在此处对so进行了抹头操作。
之后遇到反调试崩溃退出。后来发现反调试检测了以下字段:
android_server
gdbserver
gdb
TracePid:
/proc/self/task/%s/status
isDebuggerConnected等。。
二、bypass
编写了一个loader程序调用该so中的JNI_Onload函数bypass壳代码和反调试。
此时R0为dlsym返回的JNI_Onload地址.我们跳转过去,按C将字节码转成代码,发现此时JNI_Onload已经解密。
这时候我们将so从内存中dump出来。将原来的so头部和section修复回去。代码的解密已经完成。
3、字符串解密
这时候我们发现so的字符串还是加密状态,每个字符串对应一个解密函数。
经过分析发现。解密算法是一样的,只是异或的偏移地址不一样。
分析完解密算法后,写了个ida py解密脚本。由于初次写ida脚本。借鉴了一些网上的代码。写的很糟糕。
运行之后可以看到字符串已解密成功。
之后就可以继续分析so对dex的保护过程,我目前还未分析完成。大家有兴趣的可以一起分析。
不管你是安卓逆向的初学者还是有一定基础的人,我们都需要时刻的进步,不停地去学习,大家可以加QQ群:321255184
或者直接点击链接:https://jq.qq.com/?_wv=1027&k=5VTVnLe 群里有不同层次但都热爱这项技术的人,还有教学老师可以问问题,可以互相学习、交流 提升自己的技能知识哦。
本文转载 侵权立删