首页
社区
课程
招聘
[原创] 抛砖引玉:用硬件DMA突破游戏反调试的新思路
发表于: 2025-10-19 21:58 2583

[原创] 抛砖引玉:用硬件DMA突破游戏反调试的新思路

2025-10-19 21:58
2583

前言

说句实话,我学识浅薄,对这个问题的理解可能也有不足之处。不过看了这么多年看雪社区的文章和大家的讨论,心里也积累了不少想法,今天就想把自己这些"野路子"想法分享出来,也算是抛砖引玉吧。希望能跟大家讨论讨论这个问题,听听各位的见解。

这些年接触游戏逆向和安全分析,最头疼的就是反调试保护这个东西。从最初的简单PEB检查,到现在的驱动级别防护,游戏的反调试一代比一代狠。传统的VT虚拱方案我也研究过,虽然能用,但问题也不少——代码复杂、维护困难、而且游戏的新反调试一出来,就得跟着适配。

那就想了想,能不能换个思路?与其在系统内部跟游戏打太极,不如让调试器彻底脱离被调试的系统,从硬件层直接访问内存。这样游戏的反调试检查就全都失效了。

咱们今天就来聊聊这个想法。


现在的问题到底是什么

我做逆向分析这些年,遇到过很多被反调试保护得严严实实的游戏。每次要调试一个新游戏,第一件事就是想:这游戏用了什么反调试?

问题一:反调试一代比一代复杂

早些年的游戏,就检查个PEB.BeingDebugged,三两下就能绕过。后来进化到检查Debug API,得伪造一堆东西。再后来出现了VT虚拱检测,这下就得用更复杂的手段隐蔽虚拱痕迹。现在呢?驱动级别的保护都出现了,基本上反调试已经从用户态升到了内核态。

每一代新的反调试出现,就得跟着去研究、去适配。这特么就像在打地鼠游戏,一个接一个。

问题二:VT虚拱方案太复杂了

要说对付反调试,VT虚拱确实管用。但这东西的问题也很明显:

  • 要深入理解VT-x、EPT、VMCS那堆东西,学习曲线陡得要死
  • 维护成本高,游戏新的反调试一出,又得改代码
  • 开发周期长,没个三个月打不住
  • 即使这样,还是可能被最新的反调试击败

换句话说,VT虚拱是一场永无止境的军备竞赛。游戏加强反调试,我就得升级防护,永远玩不完。

问题三:根本的矛盾在这儿

VT虚拱的思路是什么?隐蔽调试。但它的局限是什么?调试器还在被调试系统内。游戏在同一个系统里跑,就有机会检测到虚拱的痕迹。这就是根本的矛盾。

有没有可能,咱们不在系统内部隐蔽,而是直接让调试器脱离被调试系统呢?


那换个思路呢?

我想到的是这样一个办法:通过PCIe硬件DMA来调试

概念很简单:

  • 一台主机(主机A)上跑调试器
  • 另一台主机(主机B)上跑游戏
  • 两机通过USB Type-C连接一块DMA卡
  • 调试器通过这块DMA卡,直接读写主机B的物理内存

为什么这样就能解决反调试呢?因为游戏的反调试检查都是软件层面的。游戏检查PEB、检查Debug API、检查虚拱痕迹——这些都是软件检查。但DMA是什么?DMA是硬件级别的内存访问。游戏的软件代码根本看不到硬件DMA的操作。

这就像是:游戏在防盗门上装了各种监控摄像头和警报器,但咱们不走门,而是直接挖地道进去。游戏的防盗门再厉害也没用。


具体怎么干呢

调试主机(主机A)做什么

调试主机上就跑一个调试器。这个调试器通过USB连接DMA卡。用户想设置断点了?调试器就通过DMA卡,直接往被调试进程的内存里写一个INT 3指令(0xCC字节)。

用户想读内存?调试器通过DMA直接从被调试主机的物理内存里读数据。想修改寄存器?也是通过特殊的驱动接口去操作。

被调试主机(主机B)需要什么

这儿需要一个轻量级的驱动程序。这个驱动干嘛呢?就是捕获异常。

游戏执行到咱们之前通过DMA写入的INT 3,CPU就会产生异常。这个异常驱动就在那儿待着,捕获这个异常,记下来当时的寄存器值、堆栈状态等信息。然后通过共享内存或USB,把这个信息送回给调试主机。

调试器一看,"哦,断点命中了,游戏现在停在这儿",就把相关信息显示给用户。用户想继续执行,调试器就发个命令回去,驱动处理完异常,游戏继续跑。

就这么简单。

为什么游戏的反调试就失效了

游戏的反调试检查无非就这几种:

  1. 检查PEB.BeingDebugged → 游戏看不到自己被调试,因为没有真实的Debug API调用
  2. 检查Debug Port → 没有Debug Port,因为DMA卡不产生Debug Port
  3. 扫描内存中的INT 3 → 这儿有点意思,INT 3确实在物理内存里,但游戏通过虚拟地址访问内存是看不到的(物理内存对虚拟地址来说是透明的)
  4. CPUID检测虚拱 → 没有虚拱,就是真实的系统
  5. 检查调试器进程 → 调试器在另一台主机,游戏看不到

结果就是:游戏的反调试检查全部无效。游戏觉得自己完全自由,殊不知已经被调试器掌握了。


还有个想法:TF标志

INT 3有个潜在的问题:虽然游戏通过虚拟地址看不到物理内存里的INT 3,但理论上还是存在那儿。如果游戏真的很狠,用一些特殊的手段,还是有可能查到。

那咱们就有个备选方案:不修改内存,直接用CPU的TF标志(Trace Flag)来单步

这样的话,根本就没有INT 3,游戏扫描内存也找不到任何断点的痕迹。代码完全没被改动,内存完全干净。唯一的"副作用"就是每条指令执行后都会产生异常,性能会差一点——但这对调试来说完全可以接受。

两个方案咱们可以灵活选择:大多数游戏用INT 3就够了(快速,隐蔽),那些超强反调试的游戏用TF标志(最隐蔽)。


这个方案相比VT虚拱有什么优势

我觉得主要有这几个:

隐蔽性更强

  • VT虚拱还是在系统内部,有被检测的风险
  • DMA方案调试器在另一台主机,物理上就是隔离的

代码复杂度低

  • VT虚拱要处理EPT、VMCS、各种虚拱逻辑,代码30000+行
  • DMA方案被调试主机上只需要一个轻量级驱动,300多行代码就够了

一劳永逸

  • VT虚拱得跟着游戏的新反调试不断适配
  • DMA方案游戏的任何软件级反调试都是无效的,不需要适配

开发成本低

  • 有个开源项目PCILeech已经做了80-90%的工作(FPGA固件、DMA引擎等)
  • 咱们只需要基于它做一些改进,不需要从零开始

等等,这个方案有没有问题呢

说实话,我觉得还是有些问题需要坦诚说出来的。

驱动程序的问题
虽然异常驱动只有300多行代码,但游戏的预启动驱动可能会检测到它。不过这儿咱们也有办法应对——改个名字伪装成系统组件、等游戏启动后再加载、用内存隐蔽技术等。不能说完全无敌,但隐蔽率应该在85-95%。

硬件成本
要实现这个方案,需要购买一块支持PCIe DMA的FPGA开发板,加上USB控制器什么的,硬件成本在300元,可以参考某鱼上面的35T 75T的dma板子。

理论验证
我这些想法都还是基于理论推导,没有在实际的硬件上全面验证过。INT 3在物理内存中游戏是否真的无法通过虚拟地址看到?游戏驱动是否真的无法绕过IOMMU去访问硬件DMA的操作?这些都需要实际验证。

跨平台
现在的设计主要是针对Windows的。要支持Linux或macOS,需要做相应的适配。


真诚的想听听大家的意见

这个想法我想了很久,也查阅了不少资料。但毕竟自己水平有限,肯定还有不少漏洞。我特别想听听在座各位的见解:

技术层面的问题:

  1. 游戏能否检测到DMA卡对物理内存的读写操作?
  2. 通过虚拟地址访问内存,能否看到通过DMA写入的INT 3?
  3. 驱动程序的检测难度到底有多大?能否通过更好的隐蔽技术规避?
  4. PCILeech的代码复用难度如何?有没有这方面的经验分享?

实战经验:

  1. 有没有人用过PCILeech或类似的工具?
  2. 有没有遇到过游戏用特殊手段对付DMA的情况?
  3. 对这个方案的实现可行性,各位有什么看法?

反调试研究角度:

  1. 现在游戏反调试已经进化到什么程度了?最新的防护技术是什么?
  2. 有没有看过游戏预启动驱动的具体检测逻辑?
  3. 性能计数器这些东西游戏进程真的能读吗?

你们的意见对我来说真的很重要。希望通过社区的讨论,能把这个想法打磨得更完善。


总的来说

我觉得硬件DMA这个方向是值得探索的。相比现在流行的VT虚拱方案,它提供了一种新的思路。虽然不是完美方案,肯定也有局限性,但从创新的角度来说,至少是有意义的。

如果社区反馈积极,有人愿意跟进开发,我觉得这个项目是有前景的。要真正实现这个方案的话,需要FPGA开发、Windows驱动、调试器开发这些不同领域的人协作。但我相信,看雪社区里肯定有这方面的高手。

最后再说一遍:这就是我的一些浅薄想法。如果有说得不对的地方,请一定要指正。我特别欢迎任何形式的批评和建议——有建设性的质疑,也有彻底的否定。真理是通过讨论磨出来的,不是说出来的。

期待大家的回应!


参考资源

如果大家对这个方向感兴趣,可以参考这些开源项目和文档:

  • PCILeech: 459K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6#2k6Y4u0A6M7$3E0Q4x3V1k6H3j5$3W2D9k6h3g2U0K9l9`.`. (MIT许可,完全开源的DMA工具)
  • OpenOCD: 远程调试的参考设计
  • PCIe规范: PCI-SIG官方文档
  • Windows驱动开发: 微软官方指南

"好的想法不怕批评,只有在讨论中才能变得更好。"


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 4
支持
分享
最新回复 (14)
雪    币: 768
活跃值: (1933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

或许物理机->X64DBG->VMware/QEMU->进程
更容易,可能在虚拟化执行代码那块有点难处理

最后于 2025-10-19 22:18 被mb_wdzhnevo编辑 ,原因:
2025-10-19 22:08
0
雪    币: 652
活跃值: (1535)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你拿dma绕这么半天还是得依靠本机异常还是有痕的啊
2025-10-20 03:45
0
雪    币: 2790
活跃值: (5607)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
现在腾讯的游戏已经防范DMA技术了。 今年被封了一大批,导致DMA套装都掉价了。
目前看闲鱼还有卖的,不知道是否已经有其他绕过检测的技术了。
2025-10-20 17:24
0
雪    币: 27
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
不理解什么叫做 "游戏通过虚拟地址看不到物理内存里的INT 3" 才疏学浅
2025-10-20 18:25
0
雪    币: 885
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
游戏动内存修改不如训练ai自动化解放双手,内存挂一眼就能望到头。
而如果调试正常软件,那么普通驱动就够用了。
2025-10-20 19:55
0
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
DreamForest 不理解什么叫做 "游戏通过虚拟地址看不到物理内存里的INT 3" 才疏学浅
因为也只是参考了一些资料,实际自己可能只是基于某一些开源框架写了一点点VT相关的东西,所以自己确实才疏学浅,可能我描述不太严谨。 我补充一下:单纯从虚拟地址保护(只读/DEP)来看,DMA 可以绕过这些限制去写入 INT3,但实际能否做到并“隐蔽”地生效取决于 IOMMU、hypervisor/内核完整性保护、检测机制(异常/哈希/完整性检测)和缓存/TLB/同步等多个因素。 换句话说:在没有 IOMMU / 严格内核完整性/监控的旧系统上,这种技术更可行;在受保护的现代系统上,风险和被探测的概率都很高。
2025-10-20 20:21
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
游戏能否检测到DMA卡对物理内存的读写操作?读检测不到,写肯定可以啊,
通过虚拟地址访问内存,能否看到通过DMA写入的INT 3?肯定可以啊
2025-10-23 17:56
0
雪    币: 4
活跃值: (6760)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
除非你游戏端也开启VT,EPT。 不然你DMA写的物理内存,游戏那边看到的也是一样
2025-10-23 18:02
0
雪    币: 554
活跃值: (1674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
DreamForest 不理解什么叫做 "游戏通过虚拟地址看不到物理内存里的INT 3" 才疏学浅
me too
2025-10-25 11:52
0
雪    币: 45
活跃值: (115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
dma已经是过去时了,现在严厉打击dma,强制开启vt、目前有几个技术可以过vt例如云端服务器!离线服务器都是可以!但是三角洲标记电脑太严重杀得多了就会1-7t不知道用哪种办法可以达到一个完美环境
2025-10-28 07:30
0
雪    币: 27
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
vigny 因为也只是参考了一些资料,实际自己可能只是基于某一些开源框架写了一点点VT相关的东西,所以自己确实才疏学浅,可能我描述不太严谨。 我补充一下:单纯从虚拟地址保护(只读/DEP)来看,DMA 可以绕过这 ...

呃 虽然我那里的意思是我才疏血浅。在我的认知里虚拟内存和物理内存是对应关系 你所描述的东西像是基于虚拟化技术的执行分离。

最后于 2025-10-31 07:46 被DreamForest编辑 ,原因:
2025-10-31 07:45
0
雪    币: 45
活跃值: (115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
拍拖 现在腾讯的游戏已经防范DMA技术了。 今年被封了一大批,导致DMA套装都掉价了。 目前看闲鱼还有卖的,不知道是否已经有其他绕过检测的技术了。
现在就是需要个融合器一个主机一个副机不太需要板子了!双击转换都是现在
2025-11-4 06:25
0
雪    币: 244
活跃值: (1104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你真的是脱裤子放屁,你都cc了,你需要用副机dma读取内存?你都接管异常了,你自己在本机实现调试器不就行了,真是扯犊子放屁
2025-11-16 19:40
0
雪    币: 235
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
vt是不是还有一个缺点就是很卡,hook代码虽然无痕但是很卡
2025-11-27 00:30
0
游客
登录 | 注册 方可回帖
返回