Under the hood

互联网上新生活
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

暴雪和黑客的战争四:暴雪的杀手锏-The Warden

Posted on 2008-10-16 11:01  sting feng  阅读(1158)  评论(0编辑  收藏  举报

本来想写点儿别的东西。但是看来大家还是对外挂比较感兴趣,就接着再写写吧。


1.10时期的成功,使得一些黑客不免自我得意,Mousepad甚至扬言,暴雪应该请他来做hacks检测。
2005 年8月1号,暴雪正式发布1.11 patch,紧接着在9月13号又更新到1.11b,宣告了1.11时代的到来。从功能上来讲,1.11相对于1.10的改变,远远小于1.10相对于 1.09d的改变。最大的变化在于anti-hack机制,可以这么说,在某种程度上1.11是冲着黑客来的。暴雪下了不少功夫。比如游戏代码的编译器由 原来的VC6升级为VC 7.1(VS .NET 2003);很多原有的内部函数在新的编译器下都inline化;全局优化的增强、寄存器更加有效的使用导致反汇编代码可读性变差;大部分关键数据结构的内存布局进行了重新排列;还有所有游戏DLL的导出函数的序号全部打乱重新编号,等等。不过这些改变对于技巧纯熟的黑客来说算不了什么,我只花了一周的业余时间就把d2hackmap从1.10移植到了1.11。最大的改变,无疑是引入了Warden System。

The Warden,据ZoiD(D2 zPickit的作者,WC3、Diablo II和WOW的游戏黑客)的说法,最初出现在WC3(魔兽争霸3) 中,后来引入到WOW,最后在1.11 patch中引入D2。这种说法应该是可信的,我在研究1.11的一段跟Warden有关的汇编代码时,赫然看到过Maiev.mod的字样(见文末)。 Maiev Shadowsong正是魔兽争霸3中的英雄之一-The Warden(典狱官)。值得指出的是,D2中的Warden机制和WOW的非常相似,因此这里对warden的分析也同样适用于WOW。

1.11中的hacks检测机制,除了1.10时期就有的version-checking.dll/extrawork.dll和memory probe (packet 8F),还增加了Warden system。Warden的基本原理是在进入游戏后服务器端会发送一个warden检测模块(通过packet AE,warden检测模块类似于DLL)给客户端,随后warden检测模块在客户端运行,监控客户端状态并定期(大约每隔不到一分钟)返回检测结果。 原理有点类似version-checking/extrawork机制,不同的是warden检测模块设计的非常紧凑且传输时经过压缩处理,这样有效地 减轻了网络传输负担,而且在客户端经过简单处理就可运行,不需先存到本地。另外,warden client和server端的传输都是加密的。

Warden的出现,对黑客造成了极大的麻烦:阻止warden运行会被踢下线;伪造检测结果只对某个具体检测模块有效,由于warden可能随时变化,也很困难。比较有效的策略是隐藏起来不让warden检测到。早期的Warden 模块简单,对付起来很容易,但是由于Warden检测模块具有很强的动态更新能力,黑客们颇为忌惮,使得1.11时期的hacks进一步减少。比如 d2hackit、zPickit不再更新,D2JSP到目前为止只出了一个没有防检测功能的试用版(Trial Version)。这一时期比较有名的公开发布的hacks只剩下几个:具有不错的反检测功能的d2maphack;有一定反检测功能的 EasyMap/EasyPlay;有不错反检测功能的d2hackmap安全开地图版和没有反检测功能的完全版;以及没有反检测功能的C3PO。

到目前为止,在我的印象中,暴雪针对使用hacks的玩家至少进行了4次比较大规模的BAN CD KEY和封帐号活动,其中使用EasyMap/EasyPlay的玩家损失最为惨重。最近一次(2006年7月22日),暴雪BAN了30000+个CD KEY和35000+帐号,涉及以上提到所有hacks(d2hackmap安全开地图版从技术上分析应该不受影响,但是也有一些用户报告被BAN)。 EasyMap/EasyPlay的作者netter更是收到暴雪的律师函,目前已经宣称不再开发。最著名的老牌hack d2maphack,为了对付warden经过了长达超过半年的全部代码重写,在进行beta 4测试时不幸中招,作者MousePad随即宣称无限期搁置d2maphack的开发(虽然他本人认为其beta 5版本可以避过这次检测)。Diablo II中的hacks开发陷入全面停顿,这是Diablo II发布以来从来没有过的。目前为止,在这场战争中暴雪取得了暂时的胜利,但这并不表明Warden是不可战胜的。

到底Warden具体是怎么工作的呢?黑客们还有没有机会呢?且看下篇文章。

附D2 1.11b中出现Maiev.mod字串的汇编代码:

.text:XXXX9CA1 mov [esp+130h+var_11C], 5Fh
.text:XXXX9CA6 mov [esp+130h+var_11B], 7Bh
.text:XXXX9CAB mov [esp+130h+var_11A], 53h
.text:XXXX9CB0 mov [esp+130h+var_119], 0E7h
.text:XXXX9CB5 mov [esp+130h+var_118], 0F2h
.text:XXXX9CBA mov [esp+130h+var_117], 5Ah
.text:XXXX9CBF mov [esp+130h+var_116], 0BFh
.text:XXXX9CC4 mov [esp+130h+var_115], 75h
.text:XXXX9CC9 mov [esp+130h+var_114], 8Ch
.text:XXXX9CCE mov [esp+130h+var_113], 0
.text:XXXX9CD3 xor ecx, ecx
.text:XXXX9CD5 loc_XXXX9CD5:
.text:XXXX9CD5 mov al, [esp+ecx+130h+var_11C]
.text:XXXX9CD9 mov dl, 0D3h
.text:XXXX9CDB imul dl
.text:XXXX9CDD mov [esp+ecx+130h+var_11C], al
.text:XXXX9CE1 inc ecx
.text:XXXX9CE2 cmp ecx, 0Ah
.text:XXXX9CE5 jb short loc_XXXX9CD5

转换成C语言为:

   char szFileName[] = {0x5F0x7B0x530xE70xF20x5A0xBF0x750x8C0};
for (int i = 0; i < sizeof(szFileName); i++)
    szFileName[i] 
*= 0xD3;
经过for循环后szFileName数组值为"Maiev.mod"。从这一小段代码就可看出暴雪的处心积虑。

 

 附2:最近一次暴雪的封hacks公告
In keeping our aggressive stance on hacks, we have disabled over 30,000 CD-Keys from playing games on Closed Battle.net and permanently closed over 35,000 accounts for using a hack or cheat while playing Diablo II on Battle.net. First time offenders will have their CD-Keys temporarily disabled from playing games on Battle.net for a month and repeat offenders will have their CD-Keys permanently disabled. Repeat offenders will also have a risk of having their CD-Keys permanently disabled from connecting to Battle.net.

We will continue to monitor Battle.net for cheating and take action as needed. If you would like to report additional instances of hacking or cheating, please report the user to us at support@blizzard.com. A false report filed by one player against another will not result in the actions described above.

As always, thank you for your continued support; with your help we have been able to keep Battle.net a fun and safe place to play Blizzard games.