游戏反调试技术研究

现在的网络游戏,几乎就没有不对外挂深恶痛绝的,对应而生的就是众多的反调试技术,根据我对多个游戏的研究,发现现在的游戏的反调试技术无外乎以下几种方式.(当然,游戏游戏本生无反调试代码,但是游戏加了壳,壳中有反调试机制)我在这里就把这些方法列出来,同时尽量给出解决方案,欢迎大家探讨.

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的插件不能屏蔽他.所以解决方式就是直接暴力修改跳转代码.

 

猜你喜欢

转载自blog.csdn.net/ArtX/article/details/1876567