首页
社区
课程
招聘
[原创]分析某游戏驱动保护的学习历程
发表于: 2022-12-3 00:19 33229

[原创]分析某游戏驱动保护的学习历程

2022-12-3 00:19
33229

分析某游戏驱动保护的学习历程

一、前言

一直都对游戏保护感兴趣,最近想看一看游戏驱动是怎么写的。于是便尝试逆向分析一下。在这个过程中学到很多。

二、驱动调试环境的搭建

由于驱动运行在系统内核层,所以对驱动的调试一般采用双机调试。物理机对物理机,或者物理机对虚拟机。因为手上设备限制,就一个笔记本。所以首先想到的是开虚拟机(VMware Workstation Pro)进行双机调试。

2.1 虚拟机中游戏运行环境的准备

一般情况下,游戏都会检测虚拟机运行环境。网上收集一波资料,找到hzqst的一个项目。

 

hzqst/VmwareHardenedLoader: Vmware Hardened VM detection mitigation loader (anti anti-vm) (github.com)

 

按照使用说明,卸载vmtools,修改虚拟机配置文件,安装驱动,就能正常运行游戏。

 

但是卸载vmtools后,虚拟机很卡,而且屏幕显示也很别扭。所以还是希望能在安装了vmtools的情况下运行游戏。经过测试发现是可行的。以下是操作步骤:

 

1.修改虚拟机配置文件

1
2
3
4
5
6
7
hypervisor.cpuid.v0 = "FALSE"
board-id.reflectHost = "TRUE"
hw.model.reflectHost = "TRUE"
serialNumber.reflectHost = "TRUE"
smbios.reflectHost = "TRUE"
SMBIOS.noOEMStrings = "TRUE"
ethernet0.address = "00:11:22:33:44:55" // 这里随意

2.安装vmloader驱动

 

3.修改vmtools显卡驱动名字(可选)

 

安装驱动精灵或者驱动人生,备份显卡驱动。用7z或者winrar打开备份的压缩包(不解压),编辑inf文件。

1
2
3
4
// 将inf文件以下三行任意修改
DiskID = "VMware Tools"
CompanyName = "VMware, Inc."
SVGA = "VMware SVGA 3D"

保存文件后。用驱动精灵或者驱动人生还原显卡驱动即可。
完成修改后,成功运行游戏。
游戏运行截图

2.2 双机调试方式的选取

在看雪论坛看了一圈发现,游戏驱动基本都对Windbg双机调试进行了检测和处理。目前我并不清楚是怎么检测的,所以放弃VMWare+kdstub+windbg的双机调试方式,另寻他法。经过搜索,发现VMWare+gdbstub+IDA-gdb是个很好的方式。

2.2.1 IDA+VMWare调试配置

  1. 修改虚拟机配置文件
1
2
3
debugStub.listen.guest64 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
monitor.debugOnStartGuest64 = "TRUE"
  1. IDA启动gdb调试器

    启动调试器
    gdb

虚拟机在本地运行,则hostname填localhost,目标系统是64位,则port填8864(32位是8832)在这个窗口等待备用。

 

去VMware启动虚拟机后,立刻回到IDA单击OK,那就成功附加上了。

 

idaok

2.2.2 ntoskrnl.exe调试符号加载

IDA-gdb成功附加之后,默认是没有符号。没有符号的情况下,调试内核并不方便。所以得想办法加载上微软的巨硬PDB。内核ntoskrnl.exe的pdb符号文件先下载好备用。IDA在调试时是可以加载pdb文件。

 

loadpdb
pdb

 

所以只需要得到内核模块ntoskrnl.exe的符号文件和内存加载地址就可以了。而IDA附加之后,断下的位置还在系统启动阶段,并没有加载ntoskrnl.exe。那么可以寻找到载入内核模块,并调用内核入口函数的时机。就能获取到KiSystemStartup函数地址减去函数偏移就能得到ntoskrnl的基址。简单逆向winload.exe(有符号)找到一个关键函数OslArchTransferToKernel。

 

entrypoint2
entrypoint3

 

那么只需要在这个位置下断点,即可跟踪到内核入口。IDA搜索一下OslArchTransferToKernel函数末尾指令对应的字节码:

 

49 8B CC 56 6A 10 41 55 48 CB

 

就能确定OslArchTransferToKernel函数位置。

 

retfq

 

在单步执行跳过去之前需要先映射一下内存区域。

 

memory

 

然后单步执行跳到KiSystemStartup函数。

 

startup1

 

那么当前的KiSystemStartup函数地址为0xFFFFF80006F90010,KiSystemStartup的偏移是0x990010

1
ntoskrnl.base=0xFFFFF80006F90010-0x990010=0xFFFFF80006600000

现在终于获得了基址,配和之前下载备用的pdb,IDA再加载一下,就可以有符号了。


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 27
支持
分享
最新回复 (20)
雪    币: 28
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
厉害啊,我的个。都是自学的吗
2022-12-3 07:53
0
雪    币: 3144
活跃值: (1624)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

还原了下

2022-12-3 07:54
0
雪    币: 6529
活跃值: (4047)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
winark能分享下吗?
2022-12-3 09:05
0
雪    币: 1989
活跃值: (4245)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2022-12-3 09:55
0
雪    币: 2128
活跃值: (4403)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
大鲤鱼 winark能分享下吗?
与Winark作者 VirtualCC 沟通了,他说不分享
2022-12-3 12:39
1
雪    币: 1556
活跃值: (2332)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
CanineTooth 与Winark作者 VirtualCC 沟通了,他说不分享

你们呐,搞事情!


2022-12-3 17:34
0
雪    币: 4556
活跃值: (4667)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
8
路爷牛逼
2022-12-3 21:01
1
雪    币: 63
活跃值: (738)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
tp检测
1:了共享内存kddebuggerenbled,处理下kdcom复位包,让其写其他值,然后写入0为未启动保护模式即可
2:kddebuggernotprosent,也在kdcom,复位包写入了0,在exitdebugger,恢复内核那重新写入为1即可
3dbeuggerpitch,直接写1,
最后断链表kdcom.dll
双机就过了
2022-12-6 01:48
0
雪    币: 1907
活跃值: (6154)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
10
路总强无敌!
2022-12-7 14:36
1
雪    币: 22
活跃值: (478)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错!
2022-12-9 22:32
0
雪    币: 889
活跃值: (4118)
能力值: ( LV6,RANK:98 )
在线值:
发帖
回帖
粉丝
12
路总强无敌!
2023-1-3 09:43
1
雪    币: 3915
活跃值: (4182)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
感谢分享/
2023-1-3 10:13
0
雪    币: 1989
活跃值: (4245)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
基本功很强,可以
2023-1-3 11:04
0
雪    币: 2128
活跃值: (4403)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
15
大鲤鱼 winark能分享下吗?
WinArk已开源,Github地址:2e9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6n7k6h3&6W2k6X3W2U0K9h3q4D9b7$3!0V1k6g2)9J5c8W2N6A6L8V1q4J5K9H3`.`.
2023-4-27 19:25
0
雪    币: 5133
活跃值: (3688)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
大佬,我按照你的方法配置游戏环境,按照hzqst项目的方法,没有安装vmtools工具,能打开lol客户端,但是进入游戏时提示无法初始化图形设备,是怎么回事呢,我的是windows7 64位。
2023-6-21 10:02
0
雪    币: 437
活跃值: (368)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
非常好的文章 ,  谢谢分析
2023-6-25 13:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
ezre 大佬,我按照你的方法配置游戏环境,按照hzqst项目的方法,没有安装vmtools工具,能打开lol客户端,但是进入游戏时提示无法初始化图形设备,是怎么回事呢,我的是windows7 64位。
我也是同样的情况,你的解决了吗?有啥办法?
2023-7-9 12:10
0
雪    币: 5133
活跃值: (3688)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
会翻滚的土豆 我也是同样的情况,你的解决了吗?有啥办法?
某宝30y解决
2023-7-10 22:22
0
雪    币: 243
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
真的厉害,mark一下
2023-7-30 20:54
0
雪    币: 3984
活跃值: (31431)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
感谢分享
2023-7-30 21:06
1
游客
登录 | 注册 方可回帖
返回