外挂凭着前一篇介 绍的三板斧算是应付过了warden的第一轮攻击。但是还有一个问题没有解决:外挂的工作原理是通过安装旁路点(detour patch)修改原有游戏代码的流程,从而获得游戏的控制权。但是从反检测的角度来看,这种工作方式简直是噩梦-检测起来太容易了。在这方面那些不依赖于 截获游戏代码工作的外挂(d2hackmap和基于AutoIt的MMBOT等都是)具有天然的优势。对于Maphack这种必须依赖于截获游戏代码工作 的外挂,一种可能的解决方法是利用X86的硬件断点寄存器。 熟悉X86架构的朋友知道,80386以后的CPU提供4个调试地址寄存器(DR0-DR3)支持硬件断点功能。通过在游戏代码的合适位置设置硬件断点, 我们不用修改游戏代码也同样能够达到旁路点的作用,获得游戏的控制权。netter的EasyMap/EasyPlay后来的版本以及WOW的一些外挂都 基于硬件断点工作。这种方法比较大的缺点在于调试地址寄存器只有4个,也就是说同一时刻你只能截获4个地方。D2的Maphack以前由于没有天敌,根本 没想到后来会有warden这种东西,发展到现在大约用了100个旁路点,相比起来4个硬件断点只是杯水车薪,根本不够用。这是为什么做一个安全的全功能 的Maphack非常困难的最大原因。WOW的外挂就幸福多了,我看过的一些WOW外挂一般只是截获packet的接收函数(我对WOW的了解非常有限, 也可能不对,搞WOW外挂的朋友不要丢砖头)。不过即使这样,解决办法也不是没有,我觉得一个比较好的思路是BlackHat 2005上提出的一种方法:Shadow Walker: Raising The Bar For Windows Rootkit Detection。 这种方法的要点是想办法把内存页面的执行属性和读属性区分开来,对相同的内存虚拟地址,当它里面的内容做为代码被执行时映射到一处物理内存,它里面的内容 被别的代码读取时则映射到另一处物理内存。这样,对于外挂应用来说,在游戏代码执行时它用的是“脏”页面(即安装了旁路点的内存),在Warden进行 memory probe检测时则映射到“干净”页面!这种方法是比较理想的,缺点是实现起来相当的麻烦,有很多细节要考虑。
现在来看Warden的mod。针对EasyMap/EasyPlay的ManualMap和硬件断点法,.mod通过内存扫描,检测API HOOK(硬件断点法需要截获一些WIN32 API)和检测特定的字符串,后来又成功抓住了几次EasyMap。针对.mod签名,暴雪有一段时期发送了很多可以变形但功能相同的.mod(是不是有 点儿像病毒),大大干扰了使用外挂的玩家和黑客。另外为了让黑客无法得到所有.mod,同一个.mod也可能不会向所有玩家发送。再后来,.mod开始检 查数据的完整性。用过maphack的玩家都知道maphack在游戏里会在打出一些话(例如进入游戏时的welcome信息 "Mousepad's Diablo II Maphack 1.11b (v7.1) installed.",D2JSP等外挂也有类似的输出信息)。在最近的一次打击中,暴雪就是通过检测这些LOG信息抓了很多外挂(Mousepad重 写了半年的Maphack 7.2,在它的beta4时就是因为那句welcome信息被抓到的)。据说,在WOW中,.mod还使用过stack trace(分析栈上的内容)等手段。
我的看法,在这场对抗中,暴雪和黑客各有各的优势。暴雪的优势在于他是游戏规则的制定者,怎么检测、检测哪些东西由他来定,只需抓住一处漏洞即可, 掌握着主动权。黑客的优势在于他可以利用客户端的全部资源来欺骗warden,比如说利用KMD、限制游戏进程权限等;最大的劣势是难以提防周全,只要稍 有不甚一点没顾到就可能被抓。总的来说,对于公开发布的外挂,我觉得暴雪是占上风的,但是对于那些在私下用的外挂,黑客还是有一定优势的。