[PC][原创][教程]代码修改入门(示范游戏--暗黑1.10)
0
管理提醒:
本帖被 superttl 执行置顶操作(2007-03-10)
简介:通过对暗黑破坏神II 1.10的修改让大家了解“代码修改”的思路。 数据修改是通过改变游戏的内存数据来达到目的,这种方法比较简单易用,缺点是某些不可见数据很难查询,或者无法实现一些高级的功能。比如修改HP数据达到锁血功能,有的时候被秒杀的话就死了或者是游戏功能出错;或者是数据地址不固定无法做成修改器。 代码修改则是通过改变游戏执行代码来实现目的,这种方法比较难,但是随着你的功力进步,所能实现的功能就愈加BT。简单的,跳掉扣血代码实现锁血功能的话,就没有被秒杀的可能了;也可以插入代码化动态内存地址为静态内存地址以便做修改器。
本文读者最好有一点汇编基础和修改基础,并且会使用olly。 声明:下面所用到的代码地址,如果是1.10版本应该适用;数据地址,基本上你找出的不大可能会和我的一样;指令中用到的“,”都需要用英文输入法或中文半角,我这里用的都是中文全角输入的,如果是直接copy的话记得改一下。
下面开始了。 打开olly,载入暗黑,注意要加参数 -w,这样窗口化了才好使用olly,如果全屏的话中断游戏也看不到olly =。= 按F9执行游戏,选角色,进入游戏。。。
下面将会演示通过修改游戏代码来达到买东西不花钱的功能。重点不是不花钱,因为数据修改随时可以改出来天文数字的钱来,重点是思路、方法,以后其他的功能也大概是这种方法。
搜索金钱的地址,暗黑大部分数据(似乎是所有)都是动态地址,每次进游戏都会变的。这次我搜索到的是:0x01277464。
回到olly,按alt+M打开“内存映射”窗口,随便双击窗口内的一项,弹出“数据”,按ctrl+G,输入01277464回车,“数据”窗口显示出01277464附近的数据: [attachment=333293] 右键点01277464的数据,选择“断点”=》“内存写入” [attachment=333294] 回到游戏,买点东西,断在这里: [attachment=333295] 00C46D17 8968 04 mov dword ptr ds:[eax+4],ebp 这一句是把当前ebp中的数据写到地址eax+4中,eax是0x1277460,所以就是要写入到0x1277464中,于是中断了。
这里ebp就是计算之后的金钱数据,那么现在要做的就是,往前查代码,找出这个ebp是怎么算出来的,然后把扣钱的部分跳掉。
00C46D04 8B68 04 mov ebp,dword ptr ds:[eax+4] 00C46D07 e> 8B4C24 28 mov ecx,dword ptr ss:[esp+28] 00C46D0B 896C24 1C mov dword ptr ss:[esp+1C],ebp 00C46D0F 03E9 add ebp,ecx 00C46D11 85ED test ebp,ebp 00C46D13 896C24 18 mov dword ptr ss:[esp+18],ebp 00C46D17 8968 04 mov dword ptr ds:[eax+4],ebp //目前中断在这里
往前看,可以看到00C46D0F处是add ebp,ecx,做了改变,但是ebp中似乎本来就有数据,再往前找;到00C46D04处可以看到,mov ebp,dword ptr ds:[eax+4],可以猜出,这一句是把原来的钱放在ebp中,然后add ebp,ecx的时候,把ecx中的数据加到ebp中,如果是买东西的话,ecx是负数,加进去就是扣钱;卖东西的话,ecx就是正数,加到ebp中就是加了钱。那么按照这个假设我们在00C46D04处按F2下断点。 回到游戏,发现除了买卖东西之外有时候也会突然中断,而且中断之后eax的值不是1277460。 分析代码,可以看到,从00C46D04处到00C46D17,没有修改eax的代码,也就是说,这次中断不是我们要的中断,我们要求断的时候eax是1277460。得到结论:这段代码在别的地方也用到了。。。OTZ 于是我们下一个条件断点来阻止无意义的中断。回到00C46D04处按F2取消断点,右键菜单=》“断点”=》“条件”: [attachment=333296] 输入eax == 01277460,确定 [attachment=333297] 再按F9回到游戏,买东西,olly中断出来。查看eax,这次是1277460了,于是继续分析。 按一次F8执行一个语句,执行了: 00C46D04 8B68 04 mov ebp,dword ptr ds:[eax+4] 现在查看ebp,我的现在是58,双击ebp寄存器可以看到,58是16进制数,换成10进制就是88,就是我当前的金钱值(88好吉利哦): [attachment=333298] 再按一次F8,执行了: 00C46D07 e> 8B4C24 28 mov ecx,dword ptr ss:[esp+28] 查看ecx,是FFFFFFEA,双击ecx寄存器,发现是-22,就是我买这个东西的价格: [attachment=333299] 那么确定上面的猜测是正确的,下面执行到: 00C46D0F 03E9 add ebp,ecx 的时候将得到我买完东西之后的钱。
现在寻找、分析的部分基本结束了,下面要做的就是想办法在add ebp,ecx之前使ecx变成0。 这里常用的是mov ecx,0,但是试一下你会发现,这条代码占用5个字节,这里似乎没有地方放了,常用的方法是: 找到一块没用的内存,一般是90 90 90。。。其他的可能是EA FF EA FF。。。之类的不好判断是否是无用的地方,所以大部分还是找90区域,然后在add ebp,ecx之前毁掉数条指令,换成一条jmp到90区域的指令,在90区域mov ecx,0,并且恢复刚才毁掉的指令,然后jmp到被毁的指令的下一条。这种方法比较深,有空再讲,这里就是讲个思路,所以我们就勇敢的直接毁掉指令,然后华丽的跳出游戏吧,木哈哈哈 看到这两条指令了吗: 00C46D07 e> 8B4C24 28 mov ecx,dword ptr ss:[esp+28] 00C46D0B 896C24 1C mov dword ptr ss:[esp+1C],ebp 我已经看到他们被毁灭的命运了。双击第一条指令,编辑: [attachment=333300] 输入mov ecx,0,确定(该行动很危险,小孩子切勿模仿),可以看到: 00C46D07 B9 00000000 mov ecx,0 00C46D0C 90 nop 00C46D0D 90 nop 00C46D0E 90 nop 这两条指令果然人道毁灭了(该行动真的危险,小孩子切勿模仿),F9回到游戏。
现在可以看到效果了,买东西不花钱了~~前提是你能买得起=。= 不过问题是卖东西也不给钱了,这个奸商。。。可怜我现在只有66钱(66还是很吉利)。。。OTZ
这样改了之后,发现打怪都是秒杀,掉钱都是0金钱。。。这是因为,我们改的那段代码在别的地方也用到了,比如计算HP,计算怪物爆钱等。不过这种BT的事一般也只有blizzard干得出来,平常的游戏都没这么多P事的。 这种修改只限本次游戏有效,想要每次都有效的话可以直接改程序文件,也可以制作内存修改补丁,有机会也会写上来
|