暴雪在WOW开发的后期,终于能够腾出人手来升级持续了2年之久的D2X 1.09d。由于1.09d时期hacks泛滥,暴雪觉得有必要打击一下这种嚣张的气焰,于是加入了hacks检测机制,这就是在1.10时期经常提起的packet 64/65检测。
何谓packet?packet即网络数据包,D2中服务器端和客户端之间的交互是通过互相发送packet进行的。D2中的packet又分为 out-of-game(进入游戏前)packet和in-game(游戏内)packet两种,这里提到的都是in-game packet。in-game packet的第一个字节为packet ID,指示该packet的含义,接着的是相应的(可变长)参数。比如ID 01代表walk命令,长度为5字节,ID后面跟两个16位参数,指示walk的目的坐标,因此它的格式为:01 [WORD x] [WORD y]。需要注意的是D2中不同patch版本的packet ID含义是不一样的,不能通用。1.10中的一个比较完整的in-game packet列表可以在这里找到:http://www.edgeofnowhere.cc/viewtopic.php?t=303771
跟hacks检测有关的是packet 64和65。packet 64长度是9字节,格式为:64 [DWORD address 1] [DWORD address 2],后面的两个DWORD是服务器端想检测的两个内存地址;packet 65长度为1字节(没有参数),检查4个最有可能被patch的地址。packet 64/65的检查结果经过简单的混淆处理(增加sniffer抓包分析的难度)后发送回服务器端,如果被检测地址里的指令或数据被改过,检测结果自然就和 原先的不符,因此暴雪就知道你在用hack。这种检测方法就是所谓的memory probe,即内存探测法。那暴雪怎么知道应该检测哪些地址呢?hack的detour patch(旁路点)是固定的,像maphack和d2jsp这种著名的公开发行的hack,暴雪当然会拿来研究因此也会知道它们patch了哪些地方。 至于那些自己开发自娱自乐的,暴雪是没法知道的,因此相对安全点儿。但是如果你的patch点正好和maphack、d2jsp这些相同,那还是有可能不 幸中标。
以下为packet 64检测中的相关代码片断,其中eax和ecx分别为两个待检测的内存地址,检测结果分别存入局部变量var_result1和var_result2中随后发送回服务器端:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
packet 65的检测代码和packet 64类似,除了它检测的是几个固定地址。
packet 64/65的memory probe机制,结合前一篇介绍过的已有的version-checking.dll和extrawork.dll,就构成了暴雪在Diablo II 1.10 patch中采用的hacks检测机制。
下图显示了d2jsp 1.2.0中使用的部分旁路点(d2jsp 1.2.0用于Diablo II 1.11b,但意思是一样的)。