暴雪和黑客的战争五:Warden的不完全技术分析

前一篇提到了Warden的基本工作原理,这一篇从具体实现上来看看它到底是如何运作的。首先要说明的是,我在warden上没有花很多功夫,只是一些不完整的分析,也不保证我说的都是正确的。

在游戏客户端连接到game server进入游戏的时候(WOW为登录的时候),客户端和服务器端先negotiate一个新的session key(128位RC4)用于随后的warden通信。negotiate过程也是加密的(即上文提到的Maiev.mod)。这里重点要明白的是,客户端和服务器端之间warden的数据交换是加密的,密钥是动态生成的。

实际的作弊检测模块(一般称为warden mod,以后简称.mod)放在服务器端。warden session建立后服务器端用packet AE把.mod发送到客户端,客户端用packet 66做为应答。应答数据的格式跟具体的.mod有关,不是固定的,也不是简单的发回一个yes或no说有没有作弊,因此想伪造一个对所有.mod都通用的应答是行不通的。为了适合传输,暴雪把.mod做的非常紧凑,格式类似于DLL,由代码段、重定位段、IAT等数据构成。客户端收到的原始.mod数据是经过压缩的(一般只有几KB),解压后客户端根据最开始的一段数据对.mod进行装配(类似于dll的加载),然后调用.mod的检测入口函数执行真正的检测代码。

.mod header格式如下:

struct  WardenModHeader_t
{
    DWORD cbAllocSize; 
//+00
    DWORD offsetFunc1; //+04
    DWORD offsetRelocAddressTable; //+08
    DWORD nRelocCount; //+0c
    DWORD offseModEntry; //+10
    DWORD _2[2];
    DWORD offsetImportAddressTable; 
//+1c
    DWORD nImportCount; //+20
    DWORD nSectionCount; //+24
    DWORD _3[1014];
// below follows code section
}
;

cbAllocSize指明为该.mod分配了多少内存(通过VirtualAlloc)。offsetRelocAddressTable给出重定位表偏移。nRelocCount给出有多少项需要重定位(需要重定位的一般是一些全局变量)。offsetModEntry为.mod检测函数入口,客户端把.mod加载好后调用这个函数进行检测,检测结果通过packet 66传回服务器端。offsetImportAddressTable给出IAT表的偏移,IAT表指明.mod需要用到哪些外部函数(一般是Windows API)。分析.mod的第一步往往是观察IAT表,看看它调用的Windows API,有时候就可以简单的判断出这个.mod的行为。这是我截获过的一个.mod的IAT部分数据:

seg000:1B7730A0 aKernel32_dll db 'KERNEL32 . dll' , 0
seg000:1B7730AD aProcess32first db 'Process32First'
, 0
seg000:1B7730BC aIsbadreadptr db 'IsBadReadPtr'
, 0
seg000:1B7730C9 aModule32first db 'Module32First'
, 0
seg000:1B7730D7 aProcess32next db 'Process32Next'
, 0
seg000:1B7730E5 aGetmodulehandl db 'GetModuleHandleA'
, 0
seg000:1B7730F6 aCreatetoolhelp db 'CreateToolhelp32Snapshot'
, 0
seg000:1B77310F aModule32next db 'Module32Next'
, 0
seg000:1B77311C aClosehandle db 'CloseHandle'
, 0
seg000:1B773128 aLstrcmpia db 'lstrcmpiA'
, 0
seg000:1B773132 aUser32_dll db 'USER32
. dll' , 0
seg000:1B77313D aGetwindowtexta db 'GetWindowTextA'
, 0
seg000:1B77314C aEnumwindows db 'EnumWindows'
, 0
seg000:1B773158 aCharupperbuffa db 'CharUpperBuffA'
, 0
seg000:1B773167 aFindwindowa db 'FindWindowA'
, 0

 很显然,对于有经验的程序员来说,一看到Process32First/Process32Next就知道它要搜查可疑(外挂)进程,看到Module32First/Module32Next就知道他要搜查可疑(外挂)DLL,看到EnumWindows/FindWindowA这些就知道他要寻找特定窗口。不过需要指出的是IAT里列出API都会用到,比如这里它也可能只用Module32First/Module32Next。另一方面为了加大分析难度,也不是所有.mod用到的API在IAT里都会列出来。

在Warden出现的早期,检测外挂经常用的手段是服务器端用packet AE把需要检测的DLL名称列表传过来,.mod通过Module32First/Module32Next枚举游戏进程内所有DLL,如果你加载的外挂在它的黑名单上,你就被抓了。比如这个列表可能为:d2maphack.dll,d2hackit.dll,easymap.dll,那么如果你用easymap就倒霉了,如果用d2hackmap就没事-这就是为什么d2hackmap的完全版没做反检测,在很长时间里都没被抓的原因。值得一提的是,服务器端传过来的DLL列表并不是像“d2maphack.dll,d2hackit.dll,easymap.dll”这样的明文字符串,而是这些字符串的hash(SHA-1 hash),.mod枚举出DLL后比较的是它们的hash。也就是说,如果你想用sniffer抓包观察它到底想抓哪些DLL是很困难的。

在WOW中,早期的warden通过Process32First/Process32Next抓了一些外挂,(WOW!Sharp等)。由于侦测的是游戏之外的进程,暴雪的这种做法引起了广泛的争议。WOW的黑客Hoglund写的一篇文章:Is the warden spyware?被国外媒体(BBC等)广为报道。这事儿甚至惊动了著名的密码学家Bruce Schneier(经典著作《应用密码学》的作者),他也为此事发表了评论。Hoglund为此还专门写了一个监控程序:The Governor - KEEPING BLIZZARD HONEST-名字起的很牛,其实做的事情很简单,就是截获几个API喷一些信息而已。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在使用gdb调试时,可以使用commands命令来设置断点,并指定在每次到达该断点时要执行的一组命令。该命令的使用方法如下: 1. 首先,使用gdb启动程序,例如:gdb ./gdbdebug 2. 接下来,使用break命令设置一个断点,例如:b abc.cpp:10 3. 然后,使用commands命令将以下命令添加到指定的断点上: commands breakpoint-number 命令1 命令2 ... end 这里的breakpoint-number是断点号,表示将以下命令添加到指定的断点上。可以添加任何有效的GDB命令,每行一个命令,以end结束。 例如,假设我们有以下示例代码: ```cpp using namespace std; void func1() // 行号为10 { cout << "before" <<endl; } int main() { func1(); return 0; } ``` 我们可以使用以下命令来设置断点并指定commands: ```bash gdb a.out b abc.cpp:10 commands 1 silent prints "after" return c end run ``` 这样,在运行程序时,当程序执行到这个断点时,GDB会执行commands中指定的命令列表,然后继续执行程序。在这个例子中,commands命令会将输出修改为"after",然后继续执行程序,最终输出结果为"after"。 参考资料: 1. [GDB]断点(breakpoint)命令列表:commands、silent 2. 书籍《软件调试的艺术.pdf》2.11节 3. gdb commands命令用法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [GDG调试技巧之命令列表(commands)](https://blog.csdn.net/warden007/article/details/82888035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [GDB Commands用法](https://blog.csdn.net/qq_33726635/article/details/117199722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值