网站上面已经有很多关于dex文件脱壳的资料,在工作中刚好遇到这游戏对dex,so都加处理,就抱着试试的态度。就有了这个贴。废话不多说了! 大小牛就路过吧。全文如下:
1: 首先来看看这游戏dex文件,很明显的dex大小不对,java代码也对应不上
。这肯定有猫腻呀。。就附加游戏试试,想不到游戏一直崩溃。只好看看游戏状态怎样
,想不到竟然有传说中TracerPid。其实你也可以用某大神的hook的status方法,我hook这open方法打印的出来的log如下
2:好了,既然知道是游戏附加在被调试被检查,就会通过fopen,fget获得程序的状态以判断。都知道fopen,fget函数都是在对应的libc.so里面的,现在我们把手机上面的libc.so拿出来(ps:adb pull /system/lib/libc.so //Users).好了,,用IDA打开在fopen,fget下好断点
。准备工作做的差不多了。接下来就是调试部分。首先把ida软件对应的android_server。push到手机上面去。我放在手机/data/local/tmp/目录下面的,记得给android_server加权限。OK,现在就可以执行android_server了
。现在服务端已经有了,就差客户端了,用ida打开下好断点libc.so,在自己电脑实现消息转发,因我mc机开启另外一个命令行执行adb forward tco:23946 tcp:23946。下一步在ida里面进行配置来接受调试,在ida依次选择Debuger->process options进行配置
。好了,如果前面都没有设置错误应该在开始调试时debugger->attach to process就能看到手机里面的进程了
。一切准备工作差不多了,就差启动游戏进行调试了。刚开始的我们已经知道了如果让游戏起来再附加是不行的,用ida附加会崩溃,所以用了网上说了一种用am方式。就是不让游戏的so跑起来,要不然。。OK,用am启动游戏,adb shell am start -D -n 包名/activity,,如果没什么意外的话,手机上面的游戏已经处在带待调试状态
;接着用ida附加上去就Ok,一直跳过那些什么符号表啥的,最后你就不能再执行了。不是游戏死掉了,而是要等待java层继续继续,好,,再开启一个命令窗口执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700,,这时候游戏就完全可以了,游戏自然就会断在刚开始fopen这函数这里
。这时候就完全可以控制,同时记得在模块那里对模块libdvm.so里面的dvmDexFileOpenPartial下断,游戏不断的fopen于fget之间跑呀跑,直到等到fget的值r0的b包含了TracerPid信息
,可以明显pid不为0,修改之,继续跑,这游戏会连续两次检查TracerPid,都把他修改掉,等两次改完后,一直执行下去,过段时间调试就在libdvm.so库函数dvmDexFileOpenPartial下断点,大家都这知道是干嘛用的。r0就是只是指向dex在内存中基地址,r1就是dex文件的大小。只要把断点处的内存dump出来就可以了。
。。
现在只要在ida中执行一段代码 :
auto fp,dexaddress;
fp = fopen("/Users/Documents/123456.dex","wb");
for(dexaddress=0x702bf608;dexaddress<0x7040C52C;dexaddress++)
{
fputc(Byte(dexaddress),fp);
}
fclose(fp);
就OK了
最后反编译123456.dex就能完全看见代码了!!
到这里也就差不多了,,完全是让跟我一样菜的人能学习下调试而已。
-----------------------------------------
ps:其实这游戏的so文件也做了处理,用ida完全打不开的,后面的so文件我不知道脱掉,只有等大神来搞定~~
发个so文件图:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)