如前一篇文章所说,D2X中hacks的发展大约可以分为三个阶段,即前1.10的发展成熟期,1.10的过渡期以及1.11的衰落期。
一直到1.09d(1.10前的最后一个版本)为止,D2X中几乎没有作弊检测机制,这一时期是hacker们最幸福的时期。说没有是因为它没有专门的检测代码,而说几乎没有是因为它有些机制还是可以用来做作弊检测用途的。
一 处是它的自动升级机制。在战网上玩过的玩家都知道,每次连到战网的时候,会有一个对话框提示正在检查游戏版本,如果用户本机和服务器端额版本不一致的话, 自动进行升级。Diablo的自动升级功能在游戏业界可能是首创,这大大降低了游戏的上手难度。我接触过不少外国玩家,跟国内玩家不同的是,他们中很多人 都是一些15岁不到的小孩,让他们自己从网上下载补丁包升级几乎是不可能的事。自动升级的过程如下:
1,玩家连到战网;
2,服务器端发送一个专门用于版本检查的DLL到客户端;
3,客户端在本机保存该DLL;
4,客户端调用LoadLibrary加载DLL
5,客户端调用该DLL导出的一个函数。该函数通过计算几个重要的客户端游戏文件的校验判断版本是否匹配,不匹配则做自动升级。
6,客户端版本检测完毕,调用FreeLibrary卸载DLL并删除文件。
在这个过程中,由于版本检查DLL保存在服务器端,因此显然它可能会被随时修改,增加一些其他功能,如作弊检测。从版本检测相关代码(见文末)调用 的Win32 API,LoadLibraryA/GetProcAddress/FreeLibrary/DeleteFileA,可以大致看出这一过程。
另外一处不为人知的机制是,在玩家连上战网后,服务器端有时(不是一定会发,而且发送时机也不确定)会发送一个DLL (Extrawork.dll)到客户端运行,然后把结果返回给服务器端,其工作原理和版本检测机制的工作原理非常类似。显然这个机制也可以用于作弊检 测。不过根据很多hacker观测的结果,extrawork.dll一般用于收集玩家的系统配置信息,包括CPU主频、内存容量、操作系统版本等。
虽然这两点机制都可能用于作弊检测,但在1.10以前的时间里,没有迹象表明暴雪利用了这点,因此在这一时期出现的hacks也都没有相应的反检测措施。
版本检测的相关代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
XXXX45A3 lea ecx, [esp+124h]
XXXX45AA push ecx ; IX86ver0.dll
XXXX45AB call ds:LoadLibraryA
XXXX45B1 mov ebp, eax
XXXX45B3 test ebp, ebp
XXXX45B5 jz loc_6FF046F1
XXXX45BB push offset aCheckrevision ; "CheckRevision"
XXXX45C0 push ebp ; hModule
XXXX45C1 call ds:GetProcAddress
XXXX45C7 mov esi, eax
XXXX45C9 test esi, esi
XXXX45CB jnz short loc_6FF045DF
XXXX45CD push offset aErrorFailedT_0 ; "<ERROR: Failed to execute Versioning DL"![](https://www.cnblogs.com/Images/dot.gif)
XXXX45D2 call nullsub_1
XXXX45D7 add esp, 4
XXXX45DA jmp loc_6FF046EA
XXXX45DF loc_XXXX45DF:
;![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
XXXX46E6 call esi ; CheckRevision
XXXX46E8 mov ebx, eax
XXXX46EA
XXXX46EA loc_XXXX46EA: ; CODE XREF: DownloadAndRunVersioningDLL+15Aj
XXXX46EA push ebp ; hLibModule
XXXX46EB call ds:FreeLibrary
XXXX46F1
XXXX46F1 loc_XXXX46F1: ; CODE XREF: DownloadAndRunVersioningDLL+F3j
XXXX46F1 ; DownloadAndRunVersioningDLL+11Ej ![](https://www.cnblogs.com/Images/dot.gif)
XXXX46F1 mov eax, [esp+430h+hArchive]
XXXX46F5 pop ebp
XXXX46F6 test eax, eax
XXXX46F8 jz short loc_XXXX4700
XXXX46FA push eax ; hArchive
XXXX46FB call Storm_252_SFileCloseArchive
XXXX4700
XXXX4700 loc_XXXX4700: ; CODE XREF: DownloadAndRunVersioningDLL+278j
XXXX4700 push 32h ; dwMilliseconds
XXXX4702 call ds:Sleep
XXXX4708 mov esi, ds:DeleteFileA
XXXX470E push offset g_szVersionDLLName ; lpFileName
XXXX4713 call esi ; DeleteFileA
XXXX4715 mov al, [esp+42Ch+FileName]
XXXX471C test al, al
XXXX471E jz short loc_XXXX472A
XXXX4720 lea eax, [esp+42Ch+FileName]
XXXX4727 push eax ; lpFileName
XXXX4728 call esi ; DeleteFileA