【原创】TP驱动保护分析系列一 定位TenProtect保护
本帖最后由 lyl610abc 于 2021-7-10 19:04 编辑# 系列索引
[【原创】TP驱动保护分析系列一 定位TenProtect保护](https://www.52pojie.cn/thread-1426244-1-1.html)
[【原创】TP驱动保护分析系列二 代码定位内核函数 ](https://www.52pojie.cn/thread-1470385-1-1.html)
[【原创】TP驱动保护分析系列三 SSDT定位内核函数](https://www.52pojie.cn/thread-1473840-1-1.html)
------
# 前言
很早之前就打算出一个TenProtect保护分析系列,一直鸽到现在
关于TenProtect研究过游戏安全的朋友们肯定不陌生,可谓是业界标杆
但再强大的保护也肯定有破绽,本着**学习研究**的目的,写下自己与TenProtect斗智斗勇的记录,也希望TenProtect能够更进一步
------
# TenProtect保护分析
## TenProtect简介
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424200638170.png)
TenProtect,是由腾讯自主研发推出的**安全系统**,可以有效保护游戏不受外挂侵犯,同时具备反木马盗号功能,能有效的防止用户游戏帐号和虚拟财产被窃取
腾讯 TenProtect 系统主要作用为:**外挂检测、反盗号、反非法工作室、防非法消息**
该系列**不提供任何成品**,伸手党可以退出了,**仅供学习交流研究**,**严禁用于任何非法途径**
## 分析的环境
本人采用的分析环境为**XP 32位**,使用的为论坛的虚拟机镜像
首先32位驱动和64位驱动还是有不少差别的
WIN64引入了两个内核保护机制,**KPP和DSE**
- KPP:循环检查几个重要驱动数据段和代码段是否被修改,如果被修改,则触发0x109蓝屏;**防止内核修改**
- DSE:驱动签名强制,禁止加载不正确签名的驱动;**签名验证**
在WIN64上限于上面两个保护机制使得驱动保护相比XP环境下变得薄弱
而**本着学习和研究**的目的,选择XP系统作为范例
------
## 研究成果图
研究成果放的是之前的截图,时间是:2021/2/25(懒得再搞一遍了)
可以看到OD可以正常地附加游戏(仅研究游戏的**保护机制**,本人**没有参与过也不打算**参与**任何网游**的外挂开发销售,**勿扰!!!**)
![过检测](https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/%E8%BF%87%E6%A3%80%E6%B5%8B.jpg)
------
## TenProctect的保护
分析保护之前,首先要明确TenProtect提供了哪些保护
下面给出TenProtect的保护:
- 针对Windbg的双机调试的保护
- 针对打开进程的NtOpenProcess的保护
- 针对读内存的NtReadVirtualMemory的保护
- 针对写内存的NtWriteVirtualMemory的保护
- 针对打开线程的NtOpenThread的保护
- 针对附加进程的KeAttchProcess的保护
- 针对附加进程的KeStackAttachProcess的保护
- 针对附加进程的KeForceAttachProcess的保护
- 针对恢复进程的NtResumeProcess的保护
- 针对恢复线程的NtResumeThread的保护
- 针对调试信息传递相关的DbgkpPostFakeThreadMessages的保护
- 针对唤醒调试目标的DbgkpWakeTarget的保护
- 针对调试权限标志的ValidAccessMask清零的保护
- 针对调试对象的DebugPort清零的保护
------
上述的保护中,比较麻烦的为针对`Windbg的双机调试的保护`和针对`调试对象的DebugPort清零的保护`
前者需要了解双机调试的**通信原理**,后者需要了解DebugPort的作用并**自建调试体**系(干掉检测线程自然也行)
除开上述的保护,TenProtect还会对硬件断点进行检测,通过获取DR寄存器的信息来进行判断
可以通过Hook NtSetContextThread和NtGetContextThread 这两个和**线程上下文**相关的函数来实现绕过检测
------
## 如何获知TenProtect的保护
上面提到了如此多的保护,现在来说说如何知道TenProtect所作的保护
### ARK
这里需要用到ARK(AntiRootkit),所谓的ARK就是**反内核工具**,ARK这种工具可以让我们得到系统内核的相关信息
常见的ARK工具有:
XueTr、IceSword、Wsyscheck 、Snipesword等
------
### 使用ARK分析保护
这里使用的ARK为XueTr
此次分析的游戏为QQ堂,算是个比较古老的小型游戏,但麻雀虽小五脏俱全,其TenProtect还是很强力的
打开游戏,等TenProtect加载完毕后再打开ARK:XueTr
#### SSDT HOOK
点击 内核钩子→SSDT
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424145919788.png)
可以看到SSDT被挂了两个钩子:NtReadVirtualMemory和NtWriteVirtualMemory
这里便是所谓的SSDT HOOK,关于SSDT HOOK 会单独开章节说明,这里不继续深入
------
#### Kernel Inline HOOK
点击 内核钩子→内核钩子
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424150616548.png)
可以看到有不少内容,前面几个Hook是虚拟机自带的,无须关注;只需关注底下的几个Hook
这里以最后一个Hook为例,即0x805D5832,使用Windbg查看其地址对应的函数
输入指令:
```
u 0x805D5832
```
u指令为查看指定地址的汇编指令,得到:
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424152438980.png)
可以看到该地址对应的函数为PsResumeThread,也就是说**TenProtect在PsResumeThread的头部做了HOOK**
这个时候会发现PsResumeThread貌似并不在前面给出的保护中,暂且不急,看看PsResumeThread和前面函数的关联
通过前面的XueTr可以得到,被Hook的文件为ntkrnlpa.exe,使用IDA打开ntkrnlpa.exe
然后通过ALT+T 搜索PsResumeThread
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424170017027.png)
------
得到:
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424170119155.png)
------
选中PsResumeThread函数后按快捷键Ctrl + X 查看**交叉引用**:
!(https://610-pic-bed.oss-cn-shenzhen.aliyuncs.com/image-20210424170323173.png)
可以看到前面提到的保护:NtResumeThread、DbgkpPostFakeThreadMessages、DbgkpWakeTarget均调用了被HOOK的PsResumeThread
于是如果想要绕过保护则需要替换PsResumeThread函数,将其变成我们自己写的函数MyPsResumeThread
以此要Hook的函数为NtResumeThread、DbgkpPostFakeThreadMessages、DbgkpWakeTarget,而非PsResumeThread
其它内核钩子分析方法同上,这里不再赘述,这里只是简单地说明一下**如何定位TenProtect所做的保护**
------
#### 其它保护
上面只分析了SSDT HOOK和Kernel Inline HOOK,肯定有人会想问ShadowSSDT和其它钩子呢
关于ShadowSSDT在以后的篇章也会详细说明,但该游戏并没有针对ShadowSSDT的保护,于是无须分析
除此之外,还有**Windbg双机调试的保护、ValidAccessMask清零的保护和DebugPort清零**的保护没有提及
因为这三个保护相对复杂一些,需要对调试体系有一定的了解才行,之后也会单独开篇章分析
# 总结
## 分析流程
1. ARK工具扫描被改动的函数
2. 确定被改动函数的交叉引用
3. 确定需要绕过的函数
4. 绕过函数
------
## 补充说明
此篇笔记主要说明了如何定位TenProtect的**SSDT HOOK**和**Kernel Inline HOOK**
关于相对比较复杂的**Windbg双机调试的保护、ValidAccessMask清零的保护和DebugPort清零的保护** 留作之后
定位之后才能有针对性地绕过,但这里的定位只是借助了ARK和Windbg两个工具定位的,真正想要写代码定位留作之后再作补充
这里先**预告**一下 通过**代码定位内核函数的五种方法**:
1. 特征码定位法,通过特征码定位到内核函数附近,然后加上偏移即得到内核函数地址
2. 通过MmGetSystemRoutineAddress函数定位,该方法定位的函数有限制
3. SSDT定位法,通过SSDT表的地址加上SSDT函数的偏移计算得到对应的函数地址,该方法仅可定位SSDT函数
4. PE文件导出表扫描法,通过解析PE文件的导出表获得函数的地址,有关这一块可回顾(https://www.52pojie.cn/thread-1412395-1-1.html),该方法仅可定位导出的函数
5. 符号表PDB解析法,通过解析PDB文件获得函数的地址
------
该系列的门槛可能较高,需要在对**操作系统和调试机制**有一定的了解的情况下学习
该篇的内容不算多,算是简单介绍了有关TenProtect保护的定位,后续会不断补充更新,**有不足之处希望大家能指出**
------ 图里QQT满满的回忆,期待这个系列可以更新下去,加精鼓励。 个人觉得,还是不要发得这么详细吧。因为tx的人不知道会不会找你。因为泄漏了一些东西,比如用了xx保护。如果正好有人在搞,看到文章肯定深受启发。虽然作弊与保护是相爱相杀,相互促进进步。但是tx的东西这样分享,还是不太好。个人愚见 莫问刀 发表于 2021-4-25 09:41
个人觉得,还是不要发得这么详细吧。因为tx的人不知道会不会找你。因为泄漏了一些东西,比如用了xx保护。如 ...
我分析的是很久之前的xp系统,和现在的保护还是有挺大区别的
而且我没有给出成品,只提供分析的思路,具体实现还是有一定门槛的
仅作交流研究应该是没什么问题的{:301_978:}
勘误:分析的环境节,KPP介绍的代码段释放被修改应为代码段是否被修改 坐拥大佬{:1_893:} 唔,大佬好可怕 厉害咯,学习一下 大佬牛皮抱大腿 快保存,快保存,此帖容易被封… 不明觉厉! 坐拥大佬 前排就坐,小本本记起,抓紧学习缩小差距 终于明白 那些搞黑产的什么LOL防封是怎么一个月赚几十万的了