上篇的Unity3d DLL通用解密方法分享后,有同学反馈说,某讯的手游使用烧饼修改器搜索内存会强制退出。去年看的时候还没有反修改器功能的,应该是后来有功能升级了。
针对这种反修改器搜索的情况,我们来研究个新的对抗方法。这个方法相比上一个稍微复杂一点,不过如果有一定逆向基础,也是比较浅显易懂的。当然也可以通过zygote中转DLL进去HOOKmono_image_open_from_data_with_name方法来解密,不过门槛相对比较高。
先思考一下他反修改器搜索的原理,必定是通过某个线程来检测修改器的,如果把所有线程都给卡住,他的检测也就失效了。
如何把线程卡住呢?有个比较简单的方法,就是用IDA attach到游戏上。
attach上去后,再打开烧饼修改器,再搜索就正常了。
搜索是正常的了,还能继续使用memdump来dump内存么?先来试一下
会提示ptrace attach failed,由于IDA已经attach到该游戏进程,就不能再被其它进程ptrace了。尝试pid使用线程tid,也是一样的提示。基本上memdump的方法,这里就不用再用了。
从烧饼修改器搜索9460301获取到的地址中选取一个,在IDA的Hex View窗口GO到该地址。如下图所示
能看到这是一个标准的PE文件,就是待DUMP的DLL内存了。
很显然,写个IDC脚本就可以把这个DLL给拷贝出来了, 这里贴一下IDC脚本。
auto currentEA = ScreenEA();
auto lastRawSize = Dword(currentEA+0x1d8);
auto lastRawOff = Dword(currentEA+0x1dc);
auto dllSize = lastRawSize+lastRawOff;
Message("u3d dll size:%d\n",dllSize);
if(dllSize > 2000000)
{
auto fp = fopen("d:\\u3d.dll","wb");
if(fp!=0)
{
savefile(fp,0,currentEA,dllSize);
fclose(fp);
}
}
由于这里的DLL脚本最小3M以上,IDC脚本里加了个大小判断,小于2000000的就不DUMP了。窗口如下图:
几个地址尝试一下就可以把这两个DLL脚本DUMP下来
拖到Reflector里
可以正常解析,并自动识别原始DLL名字
这个方法可以过掉带有修改器对抗的手游保护,对于没有修改器检测的U3D也是通用的。
(有兴趣的同学可以关注我的微信公众号:sybaohu,或者加入QQ群:606228104)