分析某游戏驱动保护的学习历程
一、前言
一直都对游戏保护感兴趣,最近想看一看游戏驱动是怎么写的。于是便尝试逆向分析一下。在这个过程中学到很多。
二、驱动调试环境的搭建
由于驱动运行在系统内核层,所以对驱动的调试一般采用双机调试。物理机对物理机,或者物理机对虚拟机。因为手上设备限制,就一个笔记本。所以首先想到的是开虚拟机(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
2
3
|
debugStub.listen.guest64 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
monitor.debugOnStartGuest64 = "TRUE"
|
-
IDA启动gdb调试器


虚拟机在本地运行,则hostname填localhost,目标系统是64位,则port填8864(32位是8832)在这个窗口等待备用。
去VMware启动虚拟机后,立刻回到IDA单击OK,那就成功附加上了。

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


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


那么只需要在这个位置下断点,即可跟踪到内核入口。IDA搜索一下OslArchTransferToKernel函数末尾指令对应的字节码:
49 8B CC 56 6A 10 41 55 48 CB
就能确定OslArchTransferToKernel函数位置。

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

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

那么当前的KiSystemStartup函数地址为0xFFFFF80006F90010,KiSystemStartup的偏移是0x990010
1 |
ntoskrnl.base = 0xFFFFF80006F90010 - 0x990010 = 0xFFFFF80006600000
|
现在终于获得了基址,配和之前下载备用的pdb,IDA再加载一下,就可以有符号了。
[注意]看雪招聘,专注安全领域的专业人才平台!