暴雪和黑客的战争一:外挂的幸福时光

如前一篇文章所说,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也都没有相应的反检测措施。

版本检测的相关代码:

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"...
XXXX45D2                 call    nullsub_1
XXXX45D7                 add     esp, 4
XXXX45DA                 jmp     loc_6FF046EA
XXXX45DF loc_XXXX45DF:
;......
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 ...
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

你可能感兴趣的:(游戏,c,工作,api,服务器,dll)