大夫 发表于 2013-3-14 15:42:23

胡扯游戏的反调试 神魔大陆和大唐无双

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

q_360 发表于 2013-3-29 16:46:03

:lol:lol沙发

a22401750 发表于 2013-4-7 09:36:05

学习了,。。。。。。
页: [1]
查看完整版本: 胡扯游戏的反调试 神魔大陆和大唐无双