看流星社区

 找回密码
 注册账号
查看: 3461|回复: 2

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

[复制链接]

该用户从未签到

发表于 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。
就扯这么多吧,其实没啥好说的。今天阳光灿烂,春暖花开,大家都空多出去走走。

该用户从未签到

发表于 2013-3-29 16:46:03 | 显示全部楼层
沙发

该用户从未签到

发表于 2013-4-7 09:36:05 | 显示全部楼层
学习了,。。。。。。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-4 17:18

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表