TenProtect(TP) 驱动保护原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
免责声明: 此文仅作为技术交流,有心之人切记不要拿来做坏事,尤其是不要拿来做伤天害理,或者伤害 企鹅利益的事情, 对于那些有心要做坏事的,则所有后果或者反正是坏的方面的责任都与我无关, 如果此文伤害了某些公司的利益或者之类的,请站内消息或者留言联系我,本人看到后会第一 时间关闭此文。
02. 环境及工具准备:
我先来装回逼科普下 TP 吧,直接从百度百科抄袭点过来:
TP 系统全称 TenProtect,是由腾讯自主研发推出的安全系统,可以有效保护游戏不受外挂侵犯,同时具备反木马盗号功能,
能有效的防止用户游戏帐号和虚拟财产被窃取。腾讯 TP 系统主要作用为外挂检测、反盗号、反非法工作室、防非法消息。
具体功能如下: 反注入:TP系统能有效的阻止非法模块对游戏进行注入; 反加速:TP系统能防止游戏客户端的非法加速功能; 反模拟按键:TP系统能有效阻止模拟按键程序; 反脱机: TP系统能针对非正常登录游戏的行为进行检测; 反调试: TP系统采用内核级反调试技术,保护游戏进程不被调试和分析; 反木马: TP系统可以保护玩家帐号不被木马程序窃取; 检测外挂功能:TP系统能对外挂功能进行检测; 指令混淆: TP系统能对正常指令进行虚拟和变形,加大外挂作者逆向难度; 特征匹配: TP系统采用特征码匹配技术,能准确检测到外挂的使用; 文件校验:TP系统可以准确检测游戏目录下的文件是否被第三方程序篡改; 游戏内存数据校验: TP系统所特有技术手段可以准确感知到游戏关键数据的异常; 游戏进程保护: TP系统可以保护游戏进程不被第三方程序读写; 游戏虚拟财产保护: 在玩家因不当操作引起帐号泄漏情况下,TP系统也可以保护玩家帐号内虚拟财产不被不法份子转移;
TP 启动之前,也就是 Hook 之前的伪代码:
1: push dword ptr[ebp-38]
2: push dword ptr[ebp-24]
3: call ObOpenObjectByPointer
4: mov edi,eax
5: lea eax,dword ptr[ebp-B8]
TP 启动之后,也就是 Hook 之后的伪代码:
03. 分析 TP 所做的保护:
如果真要分析 TP 所做的保护的话,还是比较麻烦的,不过好在各种论坛里面,各种前辈给指 出了明路, 比如堕落天才有一篇极好的文章,不过这篇文章是 2010 年 12 月份的了,中间 TP 也不是吃 饭的,肯定是有更新了,
(继续为堕落天才打广告) 文章名称:《散谈游戏保护那点事~就从_TP开始入手吧》 文章地址:http://bbs.pediy.com/showthread.pFra Baidu bibliotekp?t=126802
那么如何实现干掉 TP 对 NtOpenProcess 所做的 Hook 呢 ? 一般干掉的意思就是恢复 Hook,但是恢复 Hook 有一个很严重的问题,那就是很容易就被 TP 检测到了, 其实可以换个思路,为什么一定要干掉 TP 对 NtOpenProcess 所做的 Hook 呢 ? 就算被干掉了,还得干掉 TP 用来检测 NtOpenProcess 的 Hook 是否被干掉的线程之类的,
不过这篇文章的参考价值还是很大的,比如在 NtOpenProcess,NtOpenThread 等等系统服 务的 Hook 上, TP 也还是差不多的,也就是变化不大,甚至很多的代码都可以拿过来直接用,而至于 TP 更新 的一些内核函数的 Hook 的话, 也可以从其他论坛里面找到一些,所以最主要的一点就是放狗搜索,放狗搜索到一些资料以后, 可以用 WinDbg 或者 Kernel Detective 来验证这个内核 API 是否真的被 TP 所干掉了。 具体的俺也不晓得要怎么说了,总结一句就是放狗搜索。 下面放出几张截图,我是用 Xuetr 进行扫描的,
这种 Hook 方式是很容易被干掉的,直接 SSDT Hook 就可以干掉,
对于用 SSDT Hook 干掉浅层的 InLine Hook 可以参考看雪上堕落天才的文章: 文章名称:《SSDT Hook 的妙用 - 对抗 Ring0 InLine Hook》 文章地址:http://bbs.pediy.com/showthread.php?t=40832
不过 TP 是做的 Deep InLine Hook,也就是 Hook 的是 NtOpenProcess 深层的地址, 而不是函数头, 要想用 SSDT Hook 来干掉的话,除非自己重写 NtOpenProcess,否则很难干掉, 而且 TP 在对 NtOpenProcess 上还有检测,所以即使是重写 NtOpenProcess 也很麻烦, 因为在重写中也必须要绕过 TP 可以被 TP 检测到,从而弹出经典的 TP 警告框。
04. 干掉 NtOpenProcess 中的 Deep InLine Hook:
TP Hook NtOpenProcess 的直接效果就是咱在应用层里面调用 OpenProcess(DNF 进程) 失败, 并且在 OD 或者 CE 里面也根本找不到 DNF 游戏的进程,更别提什么打开或者附加了, 这使得咱根本对 DNF 无从下手。研究过 TP 的都知道,TP 在 NtOpenProcess 中是下了深 层的 InLine 钩子, 这个也早已经不是什么秘密,各个论坛上的都知道,是 Hook 的 ObOpenObjectByPointer, 对于这个,可以使用 Xuetr 扫描内核钩子扫描出来(TP 对 Xuetr 好像敏感,在 XP 机上可 能蓝屏)。 在一些简单的 InLine Hook 中,咱都是直接拿内核 API 的头 5 个或者头 7 个字节做 Hook,
//这里代表 TP
绕过 TP 所做的 Hook 的伪代码(DNF 检测不出来自己被绕过了,要是能检测出来也就不叫 绕过了):
1: push dword ptr[ebp-38] 2: push dword ptr[ebp-24]
3: if(是 DNF 进程)
4: {
5:
call TPHookedObOpenObjectByPointer
主要是看雪,一蓑烟雨,DebugMan 等论坛,这里对我所借鉴的那些哥们说 Many Thanks。 同时也得特别感谢刘总,很多地方若没有刘总的指导,则还指不定何时能够弄出来呢。
值得一提的是,我现在所做的过 TP 驱动保护只支持 32 位 XP,在所有的 32 位 XP 上都可 以正常运行, 不过 Win7 的话还不行,因为里面用到了搜索特征码来定位未导出 API,而我只针对 XP 做了 处理。
这样就比较麻烦了,为何不直接绕过 TP 的 Hook 呢 ? 要想绕过 TP 的保护的话,我们也可以下一个 InLine Hook,如果发现是 DNF 进程的话, 那好啊, 咱直接跳到 TP 下的 InLine Hook 中执行(这样 TP 还是执行它原来的代码,从而检测不出 来被改变了) 而如果不是 DNF 进程的话,那咱就跳过 TP 下的 InLine Hook 就好了, 上面这样说是说不清楚的,来点干脆的,写点伪代码比较容易看懂:
前面也提过了,此次过 TP 的驱动保护仅仅只适用于 XP 系统,所以,首先你得准备个虚拟机, 然后装个 XP 的系统,至于是 XP SP2 还是 XP SPxxx 就随便了,当然,如果你喜欢 BSOD 的 话, 也完全可以装个其他的系统,然后的话,就得准备几个专业工具了,首先一个当然是 Xuetr 了, 不过 TP 能够检测出 Xuetr,所以 Xuetr 在 XP 机器上和 TP 同时运行时, 轻则导致 TP 弹出警告框,重则蓝屏,这个看个人运气了。 然后还有一个工具也很重量级,也是 Rootkit 检测工具,叫做 Kernel Detective, 并且更重要的是 TP 和 Kernel Detective 是可以并存的,不会像 Xuetr 那样会被 TP 检 测出来, 不过 Kernel Detective 想比与 Xuetr 来说,Xuetr 能够扫描内核的 InLine Hook, 这个很强大, 这两个工具都很重要,其次就是 WinDbg 和 OD 以及 CE 了。 至于 WinDbg 的话自然是用来调试 Windows 内核或者调试驱动程序了, 而 OD 和 CE 的话可以用来测试咱所写的驱动是否真正的有效果,也就是测试是否真正的过了 TP 保护。 最后就是开发环境了,我的是 Visual Studio 2010 + Visual DDK + WDK,这个可以随 意搭建。
1: push dword ptr[ebp-38] 2: push dword ptr[ebp-24]
3: call TPHookedObOpenObjectByPointer
Hook ObOpenObjectByPointer 的函数 4: mov edi,eax 5: lea eax,dword ptr[ebp-B8]
在这里咱可以在 Kernel Detective 中看到它所做的 InLine Hook, 首先是启动 Kernel Detective,然后在 SSDT 子菜单中,找到 NtOpenProcess, 然后在上面右键,在右键菜单中选择反汇编当前地址,从而就会跳转到 NtOpenProcess 的反 汇编代码中了, 由于我的电脑太烂了,开个虚拟机,再跑个 DNF,再主机里面开个 Visual Studio 的话, 估计半天会没反应, 所以这里截图截的都是没有启动 DNF 的图,也就是在 TP 还没有进行 Hook 时候的截图, 对于电脑配置好的朋友,可以自己去测试,测试结果除了地址外,其他基本都是一样的,
过 DNF TP 驱动保护(一)
文章目录:
01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProcess 中的 Deep InLine Hook: 05. 干掉 NtOpenThread 中的 Deep InLine Hook: 06. 干掉 NtReadVirtualMemory 中的 InLine Hook: 07. 干掉 NtWriteVirtualMemory 中的 InLine Hook: 08. 干掉 KiAttachProcess 的 InLine Hook: 09. 干掉 NtGetContextThread 中的 InLine Hook: 10. 干掉 NtSetContextThread 中的 InLine Hook: 11. 干掉 DbgkpQueueMessage 中的 InLine Hook: 12. 干掉 DbgkpSetProcessDebugObject 中的 InLine Hook: 13. 干掉 Debug 清零:
6: }
7: else
8: {
9:
call ObOpenObjectByPointer
10: }
11: mov edi,eax
12: lea eax,dword ptr[ebp-B8]
有了伪代码以后,我们要做的也就比较清楚了,要想实现“绕过 TP 所做的 Hook 的伪代码”的 话, 咱得自己也下一个 InLine Hook,至于我们在哪里下 InLine Hook 的话,也很明白, 至少得再 call ObOpenObjectByPointer 之前吧,否则都已经进入 TP 的 Hook 了,还 谈什么绕过呢 ? 下面给出一副截图来标记将要下我们自己的 InLine Hook 的位置,
我几个日子弄了过 TP 的驱动保护,算下来前前后后也弄了半来个月, 虽然比较累,但还是收获了蛮多东西,这篇博文就是将如何过掉 TP 做的一个总结而已, 在这篇文章中我会一一介绍过掉 TP 所 Hook 的各种 API 的思路,并附上简要的代码, 在过 TP 驱动保护的过程中以及一些思路和一些代码也很大程度上都是来自国内的几大论坛,
共四篇,本篇为第一篇。
01. 博文简介:
本篇博文仅仅是我对过 TP 保护所作的一个总结,里面没有啥高深的技术, 仅仅是 Hook 而已,并且只有些 InLine Hook 和 SSDT Hook 的代码, 这些对大牛而言都是小菜一碟,所以大牛们可以直接飘过咯 ^_^ 然后就是关于本篇博文,估计会比较长,所以我会按照上面的目录分出来一,二,三,四篇相 继发表。
相关文档
最新文档