零、前言
这个帖子讲讲怎么建立1.12a以前版本的免CD的D2运行程序game.exe。方法就是利用1.12a的game.exe,修改其导入表。
这个方法就是我在这个帖子里
提到的Seltsamuel的方法。Seltsamuel在The Phrozen Keep论坛的一份回帖中写到:
yes, themastercaster is right. Beside of this no one here is allowed to tell you how to crack a copyprotection that is still actively in use in other titles.. this has nothing to do with modding but with piracy. The way we went is .. take a 1.12a game.exe and modify the importtables so it works with older game.dlls ..switch all ordinals and such. This way we had not to change a single line of code copyrighted by blizzard ^ ^.
Greetings
Seltsamuel
本贴就是图文记录将上述方法实现的过程,方便也想自己动手的朋友可以得到自己做的免CD的game.exe。今天,我们演示将1.12a修改成1.11b。用到的工具:OllyDBG、Uedit、LordPE和Windows自带的计算器。
一、找到导入表全部函数
用OllyDBG打开1.12a的game.exe,右键选择寻找-->当前模块中所有函数名
结果出现下图所示的函数表
从上表中可以看到,导入的D2函数包括:D2Sound、D2gfx、D2Win、D2MCPClient以及Fog和Storm这几个模块中的函数。由于Fog和Storm模块从1.11b到1.12a没有变化,因此,这两个模块中的函数无需修改,即我们只要修改这6个模块中的前4个的即可。
二、找到对应版本的全部函数编号
首先,要找出d2两个版本中对应模块中相同函数的对应编号。从上图可以看到全部的1.12a版本的函数编号,现在需要自己找出1.11b版本中对应函数的编号。这个过程是需要耐心和使用OllyDBG(或者用IDA)的能力的,下面是我已经找好111b、110f和109d的结果(109d运行完退出游戏时,有错误提示):
112a 111b 110f 109d(same as 110f)
D2Sound
10002 10044 10001 10001
10032 10050 10000 10000
D2MCPClient
10024 10039 10001 10001
D2gfx
10008 10026 10020 10020
10010 10034 10001 10001
10022 10003 10018 10018
10036 10055 10015 10015
10069 10061 10011 10011
10078 10022 10027 10027
D2Win
10011 10120 10174 10174
10045 10032 10036 10036
10059 10030 10037 10037
10073 10051 10171 10171
10109 10100 10001 10001
10121 10182 10002 10002
10188 10089 10000 10000
10194 10040 10205 10205
上面左边的每个模块下的函数编号都可以在上图中看到,这些是1.12a版本的导入表,现在我们就是要将左边的编号在game.exe中替换成111b的编号,这样1.11b的免CD的game.exe就做好了。
三、替换导入表形成免CD的game.exe
首先,打开LordPE,点击PE Editor,选择1.12a版本的(将要修改它,所以先备份它)game.exe,再点击Directory,如下图
点击后就会出现下图的数据目录表
程序的数据目录表有16项,其中第2项就是导入表(上图中划红线的)。点击有点点的按钮,出现下图
这就是真正的导入表了。略过前面的Windows的模块,到D2的模块,由于Fog和Storm模块不用替换,要替换的只有上图中看到的下面4个模块。上图中标示1的是D2Win模块,共有8个函数,正好是我们前面列出的函数。标示2的地方,是第一个导入函数。图中的数据,我们只要看ThunkOffset和ApiName两项即可。第一个导入函数的ThunkOffset下是地址:0000A788,ApiName下是:27D2h和10194d。这两组数据的意思是:前一个是这个导入函数的所在地址,第二数据下的27D2h(h代表16进制,后面的d是代表10进制)中的16进制27D2正好是10进制的10194,即第二组数据函数编号。
下面就是修改了,我们用Uedit打开这个game.exe,找到A788地址,如下图
图中光标的地方正是A788位置,可以看到,在A788位置是D2,A789位置是27。对照该函数我们找到的1.11b中对应的编号是10040,用计算器将其换算成16进制的如下图,得到2738
因此,我们只要将A788位置的D2,修改成38,就完成了1.12a版本的这个函数替换成了1.11b的,如图所示。
依次完成上述全部的4个模块中的函数,最后保存game.exe,这个就是1.11b的免CD程序了。
至此,本贴也就完成了,希望你能做出自己的1.12a之前版本的d2免CD程序!