蒙自零度科技_游游网

反汇编修改《三国群侠传》最大金钱

蒙自零度科技_游游网 https://www.hhtc.cc 2018-08-12 14:45 出处:原创 作者:游游编辑:@老游
通过反汇编修改游戏中的最大金钱数量

《三国群侠传》是河洛工作室于2002年发行的一款角色扮演类单机游戏。是的,一款非常老的游戏了。

反汇编修改《三国群侠传》最大金钱

游戏本身怎么样,我们就不去评论了。之所以写这篇文章,是因为我老爸喜欢玩!

但是呢,游戏中的金钱限制得有点低。一场战斗最大只能得到9999的金钱,身上最大可以携带30000金钱。

老爸那天说,能带的钱太少了,总是跑来跑去的好麻烦。我说,我给你改一下吧!然后,就有了这篇文章。。。


要修改嘛,总要有适合的材料和工具才行!网上很多的版本,TKS.EXE这个游戏主程序是加过壳的!这种版本是无法修改的!

想要修改必须脱壳才行,不过脱壳这种事往往难度太大,所以我们可以用更简单的方法!那就是找个没加壳的版本~~

反汇编修改《三国群侠传》最大金钱

没加壳的版本大小大约在1022KB。比这个小几百KB的,肯定是加过壳了。。

材料有了,我们还需要修改的工具,老游这里使用的是c32asm

反汇编修改《三国群侠传》最大金钱

材料和工具都准备好了,现在就开始吧!

用c32asm打开TKS.EXE文件进行反汇编,打开之后是这个样子的:

反汇编修改《三国群侠传》最大金钱

我们先来修改一下,在商店里卖东西后最大可以持有的金钱数量。

按下Ctrl+G打开跳转对话框,然后在EIP、RVA、Offset处分别填入:00425154,00025154,24B54  点击确定。

反汇编修改《三国群侠传》最大金钱

跳转之后,我们滑动鼠标滚轮或者点击c32asm右侧的滚动条,向上移动几行,然后我们来看一下这几行代码:

反汇编修改《三国群侠传》最大金钱

红框里第一行代码:00424B49:  0FB705 82687500            MOVZX   EAX, WORD PTR [756882]    这句代码表示,将内存地址0x756882处的值放入寄存器EAX中

第三行代码:00424B53:  BA 30750000                MOV     EDX, 7530  这句代码表示,将16进制数7530放入寄存器EDX中。16进制的7530=十进制的30000

第四行代码:SUB     EDX, EAX   这句代码是对EDX和EAX两个寄存器做减法运算,表示EAX=EAX-EDX

聪明如你,必然已经清楚我们需要修改的地方了~~是的,只有第三行代码处的7530这个数!它控制了商店里卖东西时候,你能得到的最大金额。

在c32asm上选中这一行,然后点击右键,选择 “对应HEX编辑” ,这个时候会切换到16进制编辑模式,我们再按下Ctrl+Q,回到汇编模式

然后再次选择此行点击右键,选择最后一项 “汇编”

反汇编修改《三国群侠传》最大金钱

此时会弹出汇编对话框:

反汇编修改《三国群侠传》最大金钱

将7530(16进制)改成你想改的数值,点击左下角的 汇编 即完成修改。

但是需要注意,这个数值的大小是有限制的!因为它是一个无符号的短整数,所以取值范围是0-65535(十进制),16进制的话,就是0-FFFF


好了,我们现在来修改在战斗中获得的金钱。

按下Ctrl+G打开跳转对话框,输入40C849,点击确定,将会跳转到此处:

反汇编修改《三国群侠传》最大金钱

红框里的前三行代码前面已经见过了,应是没什么疑问,要修改的地方也很明确。

但是,我们在最后一行,同样看到了7530这个数!这是什么情况?我们来看一下这几行代码:

0040C85B:  3BD1                       CMP     EDX, ECX    这句代码表示将EDX和ECX寄存器中的数值进行比较

0040C85D:  7D 0B                      JGE     SHORT 0040C86A   这句代码的作用是跳转,根据上面比较的结果执行跳转或者不跳转

0040C85F:  66:C705 82687500 3075      MOV     [WORD DS:756882], 7530    这句表示,将16进制数7530直接写入到内存地址0x756882中!

总结,这几行代码的作用,是在战斗获得金钱之后,进行一次判断,如果总的金钱数超过了上限,就直接用7530这个值覆盖。

也就是说,我们需要把这里两处的7530都同时改掉。


好了,我们再继续修改,这次修改单次战斗最大获取金钱!

同样的按下Ctrl+G打开跳转对话框,然后输入地址:43B6D5

反汇编修改《三国群侠传》最大金钱

红框里汇编代码解读:

0043B6D5:  8B15 1C6F9D00              MOV     EDX, [DWORD DS:9D6F1C]     将内存地址9D6F1C的值放入寄存器EDX

0043B6DB:  8D1492                     LEA     EDX, [DWORD DS:EDX+EDX*4]     LEA是传址指令

0043B6DE:  8915 1C6F9D00              MOV     [DWORD DS:9D6F1C], EDX     将EDX的值写入内存地址9D6F1C

0043B6E4:  8B0D 1C6F9D00              MOV     ECX, [DWORD DS:9D6F1C]     将内存地址9D6F1C的值放入寄存器ECX

0043B6EA:  81F9 0F270000              CMP     ECX, 270F     CMP是比较指令,实际操作中相当于减法算法。这里相当于ECX-270F。270F是16进制数,也就是十进制的9999

0043B6F0:  7E 0A                      JLE     SHORT 0043B6FC    跳转指令,如果ECX的值小于等于270F则跳转到地址0043B6FC

0043B6F2:  C705 1C6F9D00 0F270000     MOV     [DWORD DS:9D6F1C], 270F  上面的代码如果没有跳转,则会执行本句代码。如果ECX的值大于270F,则此处返回一个值写入到地址9D6F1C(如果战斗获取的金钱超过上面的值270F,则获得的金钱为此处的270F)

0043B6FC:  66:A1 1C6F9D00             MOV     AX, [WORD DS:9D6F1C]     上面"JLE SHORT 0043B6FC"的跳转正是跳到本处。如果ECX的值小于等于270F,则跳到此处


将第五和第七行代码中的270F修改,就可以了。和前面一样,这个地址的值同样不能超过65535(FFFF)

至于0x756882和0x9D6F1C这两个内存地址嘛,它们是通过金山游侠、Cheat Engine之类内存修改工具找到的,本篇就不讲了~~



skyyx2002

2016.01.02-2016.01.08笔记

2018.08.12



欢迎关注我们的公众号:

反汇编修改《三国群侠传》最大金钱



0
×
给作者送弹药
¥1 ,用微信支付更换
立即支付
×

微信扫码支付

赞赏金额:¥2

精彩评论

暂无评论...
验证码 换一张
取 消