现在的网络游戏,几乎就没有不对辅助深恶痛绝的,对应而生的就是众多的反调试技术,根据我对多个游戏的研究,发现现在的游戏的反调试技术无外乎以下几种方式.(当然,游戏游戏本生无反调试代码,但是游戏加了壳,壳中有反调试机制)我在这里就把这些方法列出来,同时尽量给出解决方案,欢迎大家探讨.
1. 通过调用API BOOL IsDebuggerPresent(VOID)来检测程序是否是处于调试状态.
push offset "KERNEL32"
call GetModuleHandleA
test eax,eax
jz error
push offset "IsDebuggerPresent"
push eax
call GetProcAddress
test eax,eax
jz error
call eax
test eax,eax
jz NotFoundDebuger
使用该种检测方式是一种比较简单的检测调试器的途径.游戏一般以以上方式调用该函数,通过检测返回值来判断.解决方法有2中,其一为修改jz NotFoundDebuger为 jmpNotFoundDebuger类似的暴力破解法,其二为直接在OD中使用插件.
2. 使用SEH来自定义异常处理.
一般游戏会调用SetHandleExceptionFilter 函数来定义结构化异常处理,一旦调用了该异常处理函数载入了自定义异常处理,在游戏发生异常时(包括int 3异常),游戏会先通过调试器处理异常,处理完之后,异常处理标志位已经被置,那游戏本来自己需要进行的异常处理就不会再调用,如果在游戏程序中,关键处理函数是被放到了该异常处理函数中,那么游戏就会崩溃.
解决方法一般为手动修改Windows共享内存代码段或者使用OD的UhandleExceptionFilter补丁插件.
3. 查看FS:[20H].
这种方式其实和第一种方式比较接近,其实就是自己做了IsDebugPresent这个函数应该做的事情.
mov eax,fs:[20h]
test eax,eax
jz NotFoundDebuger ;未找到调试器跳转
相比于第一种方式就是不会留下API的字符串线索,并且OD的插件不能屏蔽他.所以解决方式就是直接暴力修改跳转代码.
小黑屋|手机版|Archiver|鱼C工作室
( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2025-5-29 05:35
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.