1.使用IDA打开libjuan.so,可以查看到很多函数,其中__gnu_armfini_26这个函数,功能是进行一些反调试,并解密JNI_Onload的代码。那么在__gnu_armfini_26的入口处,修改代码为FE FF FF EA EA,而后将APK重新打包并签名,adb install安装;
2.启动./android_server,开启端口转发(adb forward tcp:23946 tcp:23946);
3.启动APP的调试模式(#am start -D -n com.droider.ndkapp/com.droider.ndkapp.MainActivity);
4.打开IDA,远程连接,修改debuger options;
5.运行,并开启jdb(>jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700);
6.G到__gnu_armfini_26地址,下断;
7.将原始代码修改回去(01 00 2D E9),然后在__gnu_arm_message函数下断,运行;
8.第一次是JNI_LOAD的解密;
解密前:
解密后:
9.接下来是对elf文件的解密,在__gnu_Unwind_0,函数入口处下断(偏移为D1E4),F9运行,走到下方的(BLX LR)步进,会在其上方看到“JNI_OnLoad”,在(BLX R4)处下断
10.继续F9,走到BLX R4后步进,然后在(BLX R3,据说是mmap的地方?)下断,F8继续,走到(BL unk——5C6128CC)处时,R0可以看到解密后的lfx数据,将lfx文件整个dump出来,然后与解密后的.so文件做对比,发现仅头部字段不同,修改头部字段,so脱壳完毕。