反调试技术研究发表评论(0)编辑词条
现在的网络游戏,几乎就没有不对外挂深恶痛绝的,对应而生的就是众多的反调试技术,根据我对多个游戏的研究,发现现在的游戏的反调试技术无外乎以下几种方式.(当然,游戏游戏本生无反调试代码,但是游戏加了壳,壳中有反调试机制)我在这里就把这些方法列出来,同时尽量给出解决方案,欢迎大家探讨.
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的插件不能屏蔽他.所以解决方式就是直接暴力修改跳转代码
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的插件不能屏蔽他.所以解决方式就是直接暴力修改跳转代码
→如果您认为本词条还有待完善,请 编辑词条
收藏到:
同义词: 暂无同义词
关于本词条的评论 (共0条)发表评论>>
编辑实验
创建词条