【1】 出世
本来大家都对抗的好好的你突然用硬件酱味打击这不胡闹吗?galgame里不是这样的,你应该先和我在R3上一决高下最后再在R0打的难舍难分... 相信大家对DMA的工作原理早就有过充分了解所以也不再赘述,非要说就是:
1 2 3 4 5 6 7 8 |
|
是的就这样,使用DMA可以很轻松的做到任意物理内存读取,写入,更重要的是它不会留下痕迹。和很多的技术手段一样,本来DMA是老老实实作研究用的,可是君子无罪怀璧其罪。
总而言之,DMA刚出来的时候确实是完完全全的碾压了市面上所有的反作弊,没有人使用DMA去对抗反作弊,反作弊也就没有对应的需求,自然而然更加的海阔天空,第一批DMA使用者也就切切实实享受到了新世界。
2016年左右,PCILeech发布 (DMA读写从未如此简单):) DMA读写从此工程化
1 2 3 4 5 6 7 |
|
19-21年这个时间段就依旧开始出现咋混共作弊的DMA作弊硬件流入市场,配套服务也非常好,固件配套服务也开始出现,逐渐成熟化了,对抗也进入了下一阶段。
【2】大众
总所周知,追求小众是一件非常大众的事情,而在反作弊对抗这块可以说大众了,就再也没有翻身的余地了,技术的泛滥与不断迭代,让旧技术狠狠的被碾压过去,不幸的,很显然DMA也没有逃过时代车轮的碾压,就在某个时间节点,DMA的用户迎来了大爆发,有人赚的盆满钵满,固件,教学等等雨后春笋一般冒出,设备成本的降低和名色大噪又反向助推用户数量的增长,于是肉眼可见的,DMA被盯上了。
另一边,反作弊厂商可以说是亚历山大了,于是正式打响对抗战争。
反作弊厂商首先想到的对抗方法是什么呢?既然DMA是设备那显然他们可以先遍历检查一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
|
那么这几个case 的十六进制常量是什么呢? 通过查看PCI ID Repository我们可以看到
1 2 3 4 5 |
|
那就会有人问了,反作弊拿这个elem 0x158-257又是干什么呢?难道里面有什么可以判断是不是DMA的信息吗。
于是我们就查一查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
直接查资料看看他都收集了哪些东西吧,忘了说了这么多还没贴出来资料:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 |
|
什么是MMIO?
MMIO就是 Memory-Mapped I/O,0x10–0x27 那 6 个 32 位 BAR 是设备声明自己需要一段地址空间的寄存器
1 2 3 4 5 |
|
系统给这段空间分配物理地址后把基址写回 BAR;之后 CPU 访问这段物理地址,就是访问设备的板载寄存器。
为什么收集MMIO?
设备内部的寄存器里,包含 DMA 引擎的描述符地址、长度、启动位、完成状态。这些寄存器通常映射在 BAR 里,CPU 只能通过这段 MMIO 去操作 DMA 。
为什么收集 Command 寄存器?
1 2 3 4 5 6 7 8 9 10 11 |
|
当 PCI_ENABLE_BUS_MASTER = 1 时,该 Function 可以主动向总线发起 Memory Read / Write Request(即 DMA 操作)。
当 PCI_ENABLE_BUS_MASTER = 0 时,该 Function 不允许发起任何 DMA 请求,只能被动响应 CPU 的访问。
还可以在用户态继续一下
1 2 3 4 5 6 7 |
|
这里也有一些被拉黑的数据,收集数据,建立数据库狠狠的拉黑这些板子使用者。
1 2 3 |
|
校验方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
这里给出参考表也不再赘述了,核心对抗就是你伪造的我就校验,这也是为什么某些垃圾固件确实会拉闸。
1 2 3 4 5 6 7 8 |
|
【3】现在
难道说DMA不小众了我就不玩了吗,但那是弱者的思维。哪怕是在VTD大清洗后,还是有相当数量的八旗子弟仍旧抱着DMA四死死不放手,这也能理解,毕竟双机硬件搭配依旧能解决很多问题,比如签名,软件特征等等。
DMA为了应对反作弊厂商的严肃进攻,也是做出了努力,比如他们尝试伪装固件,把收集到的公开的固件刷到自己这里,或者伪装自己的ID用于对抗反作弊的黑固件数据库,甚至是自己实现一个协议去对抗反作弊的行为检测。
不过反作弊也迎来了史上最强VTD vs 现代最强DMA
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 |
|
系统已经启用了 Secure PCI就不管,至于为什么只检查Realtak就懂的都懂了。
不过反作弊也利用起了大杀器,VTD,还记得前面说的IOMMU吗?这里就考到了,DMA要访问是必须经过IOMMU的。
在没有VTD时候,DMA是这样访问的:
1 |
|
而在打开了VTD之后就是如此访问的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
PCIE设备只能看到IOVA(I/O VirtualAddress),而不是直接拿到真实的物理地址了,此时此刻真实的物理地址由VTD硬件查表页决定。
而如果他要读取就需要系统在IOMMU页表里建映射表,如果没有映射的话就会计入DMAR fault,看到这里你应该也能感觉到VTD的姜维打击了,还是那句话,如果身份互换,我会让你知道我的痛苦,可以说,打开VTD几乎DMA就没有还手之力了。
1 2 3 4 5 6 7 8 9 |
|
当然DMA玩家也并非全无办法,比如:想办法解析DMAR表篡改数据,或者伪造设备已经打开了VTD。
比如我可以构造一张假的DMAR表:
1 2 3 4 5 6 7 8 |
|
关键代码: 取自kEv1nZ0/VTD-Bypass: 全自动过VTD检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
|
当然,大部分反作弊也会在用API判断完后检查DMAR表,也可以利用固件元数据不一致来判断环境是否可信。
1 2 3 4 5 6 7 8 9 10 11 12 |
|