我知道很多人一直对Uploading感兴趣,很早以前我也说过要写一篇关于Uploading的文章,但一直也没有写。主要原因是我没想好该不该写,担心被人滥用了。很久不玩暗黑,现在连硬盘上的游戏都删了,今天心血来潮到暗黑论坛转了一下,发现居然又出了新补丁。这个补丁出的挺奇怪,就一个免CD的功能,其他任何改进都没有。这个。。。我的第一反应,是暴雪玩一手釜底抽薪,抄了D2Loader的后路。1.11以来,各种侵入式外挂纷纷落马,D2Loader却一直安然无恙。其中原因,不是D2Loader的反检测做的有多好(D2Loader根本就没有反检测功能),而是免CD实在不能算而且还是一个方便了所有玩家的功能。因此暴雪不得不放它一马。但是另一方面,暴雪一直声称要办掉所有第三方软件,如果任由D2Loader这样一个著名的第三方软件逍遥法外,实在很讽刺。这个补丁正式支持免CD,玩家再用D2Loader就说不过去了,要办你也就有理有据了-因此,那些用D2Loader来多开或使用其他功能的玩家要小心了。 有点儿扯远了,开始扯Uploading。什么是Uploading?一句话,就是把单机角色存档上传到战网服务器。这样做的好处我想暗黑的玩家都能明白:你可以用角色编辑器编辑你的单机存档,修改角色级别、技能点数、装备等,然后上传到服务器,然后。。。你就看着一箱箱极品发呆吧。这可能是的最高境界,在Uploading面前,BOT、Dupe不值一提。可是你也别高兴太早,这种方法的要求很苛刻,只有极少数人有条件使用。Uploading的目标是很明确的,问题的关键在于能不能实现,以及怎么去实现。这需要对游戏背后的机制本身有一定的了解。我当时玩的是ZIXIA私服,据我所知,暗黑的私服基本上都是用bnetd或PvPGN架设的(PvPGN由bnetd派生而来)。根据
Onlyer的描述,基本架构如下图所示:
--gs-- --gs--
/ \ / \
dbs1---- realm1 ----- bnetd ----- realm2 ----dbs2
\ / | \ /
--gs-- ...... --gs--
“其中,gs为 game server, 负责玩家进入游戏后的数据处理。dbs为数据服务器,负责对管理某一个realm下的存档数据。bnetd为battle.net server,负责管理各realm的帐号和chat信息等。”再看一下架设暗黑私服需要用到的软件:
- bnetd,或PvPGN
- Diablo II Game Server (D2GS)
- Diablo II DataBase Server (D2DBS)
- Diablo II Console Server (D2CS)
对应到上图,bnetd=bnetd或PvPGN,gs=D2GS,dbs=D2DBS,realm=D2CS。其中bnetd、D2DBS、D2CS可运行在*NIX或Windows下,D2GS则必须在Windows下运行。这些信息在网上搜一下很容易得到。那么根据这些已知信息,你有没有什么想法呢?我当时的分析大概是这样的:存档数据毫无疑问是由D2DBS负责,如果能直接黑掉D2DBS的服务器把存档直接换掉那最好不过了,问题是bnetd/D2CS/D2DBS这些服务器的安全措施一定很强,不会那么容易被攻破,否则Onlyer、Faster他们就太弱了。他们都是技术强人,因此我也从来没在这上面动过脑筋。另外一种方法是在D2GS上传存档数据到D2DBS的时候下手,把存档替换掉。这种方法能不能得逞,取决于D2DBS会不会对存档数据做深入的核查,比如说一个角色,如果进入游戏时是光秃秃的Level 1,5分钟后退出游戏时变成了Level 99且全身极品,那不用说肯定是。如果D2DBS对存档数据有这种核查,即使你能篡改上传文档,Uploading也会困难很多。另一方面我也知道,D2的游戏存档的数据结构相当复杂,其定义在每个游戏补丁里都有更新,因此解析游戏存档是一个很繁复且很费时间的工作。D2DBS如果能运行在*NIX系统下,意味着它不大可能会对存档格式做深入细致的核查-因为它无法利用暗黑现成的游戏代码(这些代码只能运行在Windows系统下)-自己实现很麻烦不说而且会导致法律上的问题(PvPGN是遵从GPL协议的开源软件)。这就意味着D2DBS会轻易的接受D2GS的上传存档数据-可能会有一些检查,但不会很深入。这样,如果我能控制D2GS或者能监控D2GS和D2DBS之间传输的数据,Uploading就有可能成功。这两种方法,我选择了前者,后者我没试过但应该可行。控制权怎么获得暂且不管,先来看看如果控制了D2GS,我们能做些什么。对Uploading而言,关键是要找到D2GS上传存档的代码,看看是否有可能把存档数据替换掉。我逆向工程的结果,发现在D2GAME.DLL中有一处全局变量(以1.10补丁中在0x115830处)指向一个函数表,函数表中第二和第四个函数跟存档上传有关,我们需要做的是截获这两个函数,把存档数据替换为事先准备好的单机存档数据。事实证明我的想法是可行的。游戏的代码非常多,这个入口我是怎么找到的?我的基本想法很简单,不管内部的实现如何,D2GS和D2DBS的所有通讯到最后肯定会通过socket API send/recv,因此可以从send API开始回溯,用IDA Pro进行静态逆向分析,结合用调试工具在send上设断点跟踪它的返回地址,逐步缩小范围,就不难找到上传存档数据的入口函数。 剩下的问题是怎么获得D2GS的控制权。对大多数人来说这并不容易,但对GM来说这根本不是问题。有人也许会说如果你都是GM了,还有什么不能干的。但据我所知至少在ZIXIA上,绝大多数GM也只能能控制他掌管的D2GS,bnetd/D2CS/D2DBS是控制不了的,因此有很多GM自己也在boting。如果不是GM,要控制D2GS得想办法侵入D2GS server,这点可能很容易也可能很难,看你的黑客技术了。不过由于D2GS只能运行在Windows上(不会有人在Linux上用Wine运行它吧),Windows的安全漏洞相对而言比较多傻瓜式的攻击工具也多,应该比直接攻击D2DBS server容易些。像在ZIXIA,有些D2GS可能就运行在GM所在的系实验室的某台机器上,这些机器的安全漏洞应该是比较容易抓的。 单机存档文件要事先准备好,单机存档可以用一些存档编辑器来做,但是做装备的时候要特别当心不要搞出bug item来。某ZT就出过这种乌龙,上传了一把超缀武器,在游戏里炫耀被人发现,结果引起公愤。我制作装备的一个技巧是用配方合成,在配方把我想要的缀的概率调到最高。这样生成的装备肯定不会超缀而且不会出现dupe item的问题。 最后附一个我的
Uploading工具,包括源代码。不过我在这里不想说明它的用法,所以你也不要问,有兴趣的自己研究源代码吧。这份源代码可能不那么容易理解,因为我用了一种比较晦涩的技术:基于C++的RPC。MSDN Magazine杂志 2000年11月的这篇文章有详细介绍:《RPC and C++: Build a Template Library for Distributed Objects Containing Multiple Interfaces》,在MSDN里可以找到。不过要看懂这篇文章得有比较好的C++基础和RPC知识才行。