首页
社区
课程
招聘
[原创]ssdt hook 的一个小插曲
发表于: 2014-8-24 14:02 9058

[原创]ssdt hook 的一个小插曲

2014-8-24 14:02
9058
在做一个游戏保护,32 位下用了 ssdt hook ,钩住了 NtReadVirtualMemory  和 NtWriteVirtualMemory,经过玩家反馈,发现有很大几率触发一个Bug,导致被保护进程一直 CPU 100%

  步骤一:锁定Bug范围

    我先把 NtReadVirtualMemory 的 hook 取消,那名玩家测试过后发现问题依旧,之后把 NtWriteVirtualMemory 的 hook 取消了,经过测试,发现这个 Bug 神秘失踪了

  步骤二:对比

    由于本人调试技术太差,所以只能用比较笨的方式来进行排错,我下载了 HackShield 的 SDK (不用Demo的话,hs保护的游戏直接非法后退出...),而后看见 hs 利用 inline hook 处理了跟我相同的地方,但是有意思的是,多了 NtOpenProcess 和 NtProtectVirtualMemory



  步骤三:解决

    我立即就想起了一段著名的代码, 就是看雪的 《 x64 下保护进程的方法》(大概是这个,忘记了),里面需要对 OpenProcess 的操作位做一些处理,然后马上将 NtOpenProcess 加入 ssdt hook范围,对被保护的进程去掉 PROCESS_VM_OPERATION 、PROCESS_VM_READ、PROCESS_VM_WRITE 标志,再发给测试玩家后,Bug 解除



总结:在内核中,想把功能做出来很容易,但是想做稳定,非常的难!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
这些总结应该写给你们老大看才是。。。
2014-8-24 14:33
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
做保护真好啊,羡慕嫉妒
2014-8-24 14:44
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
从利益来看,不发出来对我没什么损失,但如果别人因为这个小问题浪费时间,那是对全人类的不负责
2014-8-24 14:52
0
雪    币: 126
活跃值: (651)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
u add a hook to avoid the bug, but u do not get the key point of the bug!

i do agree with u, stability and compatibility are very important!
2014-8-25 10:36
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我恢复了 HackShield 的 NtOpenProcess 钩子出现了同样的 Bug,只是这个步骤忘记写了,所以这并不是增加钩子避免Bug,而是Windows 内部机制导致的问题
2014-8-25 12:26
0
雪    币: 126
活跃值: (651)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
In your inline-hook function, do nothing but call the original function, i don't think the bug will be reproduced!
2014-8-25 15:16
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
是的,这样不会出现Bug,但这样进行挂钩有什么意义吗?我要拒绝我的程序不被其他程序获取内存,所以我得拒绝返回,如果这时候句柄的权限没有处理,Windows 内部就会进行一些处理,导致CPU 100 %。而且我跟你说过了,HackShield 处理的方法跟我一摸一样,取消掉 NtOpenProcess 后都会出现这个bug,我实在不清楚,你在跟我拗什么?
2014-8-25 19:04
0
雪    币: 116
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
学习了。
2014-8-27 08:52
0
雪    币: 2290
活跃值: (2180)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
10
明显不是这个bug的根本原因。
2014-8-27 08:57
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
恭喜LZ解决了这个问题,但就bug的根源来说LZ还可以深究下。为什么不hook NtOpenProcess该bug就会出现,100% cpu被占用在哪了?
2014-8-28 10:38
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
累觉不爱,我分享一些偏门的东西,先跳出来一个假洋鬼子指指点点,又跳出个版主来,代码、Demo又不拿出来,还指责你的分享代码有问题。觉得我的代码有问题,请拿出一些客观依据,是对是错我也愿意承认,都是成年人,有什么好害羞的?
2014-8-28 22:13
0
雪    币: 2290
活跃值: (2180)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
13
这有什么偏门的?
在游戏保护中hook NtOpenProcess 和 NtProtectVirtualMemory等函数本身就是很标准的做法。
你去掉了PROCESS_VM_OPERATION 、PROCESS_VM_READ、PROCESS_VM_WRITE等标识你再调试下hook_NtProtectVirtualMemory等函数,看看和你原来的逻辑还一样吗?
2014-8-28 22:25
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
14
我觉得应该把所有的钩子全去了,那就非常稳定,而且耗系统资源少,CPU不会100%,也不会无缘无故蓝屏了。
2014-8-28 23:11
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
表示十分支持楼主的做法!!给楼主顶了!!谢谢楼主的分享精神,没用SSDT Hook做过保护,以后有了问题可以参考这篇帖子了。希望楼主别太在意别人说的了,终究有感谢您的人。
2014-12-27 21:57
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
这个应该是你代码的问题  跟是哪些操作标识没关系
回帖说到底是热心   何必那么偏激
2014-12-29 17:00
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
表不示不懂不发表意见
2014-12-30 02:03
0
游客
登录 | 注册 方可回帖
返回
//