找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 500|回复: 1

下断点游戏出错,等待高手指点!

[复制链接]

1

主题

0

回帖

0

积分

新手上路

积分
0
发表于 2013-6-28 09:11:36 | 显示全部楼层 |阅读模式
OD附加成功了,但一下断点,游戏就退出了。这是因为od下软件断点,是写入一个0xcc的指令,也就是int3,但是游戏线程在启动时,调用过ZwSetInformationThread,使用了其中0x11号的功能,这个函数的作用可以使调试器接收不到这个线程的调试信息,因为调试器接收不到,游戏就自己处理了这个中断,当然会出错。解决办法就是提前hook住内核函数ZwSetInformatonThread,如果发现有调用这个函数的,并且是0x11功能的,直接给他返回成功就行了。

上面是某位大牛说的, 我复制过来的。  我想问下 怎么HOOK住内核函数ZwSetInformatonThread, 又怎么看 是谁在调用他并使用0X11功能。 还有怎么直接给他返回? 高手指点一二谢谢!~

3

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2013-7-4 00:16:16 | 显示全部楼层
如果是zw打头的,要写驱动ssdt hook
ZwSetInformationThread (
    __in HANDLE ThreadHandle,
    __in THREADINFOCLASS ThreadInformationClass,
    __in_bcount(ThreadInformationLength) PVOID ThreadInformation,
    __in ULONG ThreadInformationLength
    );

其中第二个参数 __in THREADINFOCLASS中ThreadInformationClass的定义有很多,有一条是ThreadHideFromDebugger。即$11,作用就是隐藏线程,让调试器接收不到信息

假设我想让自己的程序反调试,那么应该这样写:
ZwSetInformationThread(GetCurrentThread, ThreadHideFromDebugger, nil, 0);

而你需要做的就是ssdt hook ZwSetinfomationThread
注:要在游戏启动之前hook
跟平常hook是一样的 区别就是一个是r3层 一个是r0层
具体代码由于所用语言环境不同就不写了,大概意思是:
function myZwSetInformationThread..............................:NTSTATUS;stdcall;
var
  fanhui:NTSTATUS;
begin
  fanhui:=myZwSetInformationThread..............................:;
  if ThreadInformationClass=$11(或者ThreadHideFromDebugger也可以)  then
  begin
    fanhui:=STATUS_SUCCESS;
  end;
  result:=fanhui;
end;

ps:如果觉得以上方法较复杂,也可以尝试用od打开游戏,在启动的时候暂停,跳到ZwSetInformationThread,然后看第二个参数是$11的话,在自己修改处理也可。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 12:33 , Processed in 0.082270 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

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