胡扯游戏的反调试

来源:互联网 发布:苹果keynote在windows 编辑:程序博客网 时间:2024/04/29 20:49
现在看论坛里还有人在发愁游戏的反调试,我总觉这块已经没意思了,反来复去就那么点东西了。今天来说一下,先r3: fC".K Yjp  
有人发过一个贴子,说没驱动,没钩子,OD附加成功了,但一下断点,游戏就退出了。这是因为od下软件断点,是写入一个0xcc的指令,也就是int3,但是游戏线程在启动时,调用过ZwSetInformationThread,使用了其中0x11号的功能,这个函数的作用可以使调试器接收不到这个线程的调试信息,因为调试器接收不到,游戏就自己处理了这个中断,当然会出错。解决办法就是提前hook住内核函数ZwSetInformatonThread,如果发现有调用这个函数的,并且是0x11功能的,直接给他返回成功就行了。还有一个WS的反调试就是驱动的,遍历线程内核对象,然后直接在HideFromDebugger上写入1。这是驱动的反调试,以后再讨论。 fC".K Yjp  
还有一种反调试就是调用ZwQueryProcessInformation,这个函数在kernel32.dll里还有一个包装函数,这是查进程内核对象DebugPort处的,解决办法也是写个驱动,钩住内核函数ZwQueryProcessInformation,如果发现有调用的,且是那个功能号的,直接返回空就行了。 fC".K Yjp  
以上两种反调试,在《加密和解密》上都有,现在OD的插件太强大了,像检测IsBeingDebugger位的,直接插件就能解决了。一般的游戏调试,还会钩住DbgBreakPointDbgUiRemoteBreakPoint这两个函数,这个解决方法就太简单了,瞬间秒杀。 fC".K Yjp  
我比较欣赏的有两款游戏的反调试,都是r3下的,神魔大陆和大唐无双。神魔大陆创建过一个线程,里面加入了SEH,并且不断触发int1,这不是r3下可以调用的中断,所以是个错误,然后SHE就会去处理,如果调试器附加上,就会干扰这个过程,然后就出错了。还有就是它设置了TLS,然后其中一个tls callback放在了DbgBreakPointDbgUiRemoteBreakPoint上了,然后将这某个函数的开头改成了ret 0xc,如果你敢恢复这个函数,就使使tls callback不正常,游戏会卡死,有木有,大家有木有碰上。如果不恢复,调试器会附加不上,怎么解决?大家自己想去吧。再说大唐无双,它会不停地检测IsBeginDebugger位,如果发现了,就会关闭游戏,设置了插件,有时候附加的时候,还会被它抓住,十次附加游戏,总有那么三四次游戏会关闭,大家有木有碰上。这个游戏每十分钟,这个时间是我掐着表数出来的,会调用BlockInput这个函数,来阻塞键盘与鼠标的输入,然后主线程触发一个异常来取消。这个东西真WS fC".K Yjp  
就扯这么多吧,其实没啥好说的。今天阳光灿烂,春暖花开,大家都空多出去走走。 fC".K Yjp 
0 0
原创粉丝点击