时间:2023-08-15 15:52:27来源:互联网
《三国群侠传》是河洛工作室于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的值放入寄存器EDX0043B6DB: 8D1492 LEA EDX, [DWORD DS:EDX EDX*4] //LEA是传址指令0043B6DE: 8915 1C6F9D00 MOV [DWORD DS:9D6F1C], EDX //将EDX的值写入内存地址9D6F1C0043B6E4: 8B0D 1C6F9D00 MOV ECX, [DWORD DS:9D6F1C] //将内存地址9D6F1C的值放入寄存器ECX0043B6EA: 81F9 0F270000 CMP ECX, 270F //CMP是比较指令,实际操作中相当于减法算法。这里相当于ECX-270F。270F是16进制数,也就是十进制的99990043B6F0: 7E 0A JLE SHORT 0043B6FC //跳转指令,如果ECX的值小于等于270F则跳转到地址0043B6FC0043B6F2: 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笔记