本页主题: [PC][原创][教程]代码修改入门(示范游戏--暗黑1.10) 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

yes2
级别: 善男信女


精华: 4
发帖: 110
威望: 16 点
金钱: 1366 胜利币
贡献值: 0 点
在线时间:53(小时)
注册时间:2006-04-05
最后登录:2008-11-17

 [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事的。
这种修改只限本次游戏有效,想要每次都有效的话可以直接改程序文件,也可以制作内存修改补丁,有机会也会写上来
本帖最近评分记录:
  • 威望:2(togetheru)
  • 金钱:50 (By togetheru) | 理由: 恩,好!
  • 顶端 Posted: 2006-06-25 20:32 | [楼 主]
    superttl
    级别: 论坛版主


    精华: 1
    发帖: 578
    威望: 138 点
    金钱: 586 胜利币
    贡献值: 0 点
    在线时间:499(小时)
    注册时间:2006-04-20
    最后登录:2008-11-08

     

    Quote:
    引用第9楼mirado2006-10-24 20:03发表的:


    正在按图索翼,学习使用OllyDBG_1.10,不过好像出门就碰到问题了。

    请问楼主,上面的搜索金钱地址是使用的OllyDBG吗,我怎么没有照到可以搜索数据的地方,望指点。


    OD是牛比的ring3调试器 使用帮助见附件
    附件: Ollydbg.rar (229 K) 下载次数:38
    Hold infinity in the palm of your hand, and eternity in an hour
    顶端 Posted: 2006-10-24 20:36 | 1 楼
    帖子浏览记录 版块浏览记录
    胜利之歌超级论坛 » PC修改专区


    浙ICP备05022506号
    Total 0.469583(s) query 6, Time now is:11-22 09:34, Gzip enabled
    Powered by PHPWind v6.3.2 Certificate Code © 2003-08 PHPWind.com Corporation