作者:地球仪
原文:http://hi.baidu.com/aqtata817/blog/i...44a90a70e.html

这次Hack的游戏是PS1上的《西游记》,战棋类游戏,我非常喜欢的一款游戏
记得当年还省吃俭用买了个金手指,到游戏机室玩这个……
今时不同往日了,咱有了PC,能玩遍所有游戏机上的游戏了,还能换花样玩

废话不多说,先准备3个工具:pSX、Winhex、UltraISO
本文假设你已经知道了要修改的数据内存地址

这个游戏升级需要100点经验值,我的目标是将这个额度改为0
这样哪怕我得到0点经验也能升级!先从经验的读写入手
我这里找到了三藏的经验地址$13051A,开始调试



新建“中断点”窗口,点击右键添加断点



我这里要说一下应该怎么设置断点,懂一点编程的人都知道
游戏要判断你是否升级,就得先读出你原有的经验值,再加上得到的经验值
如果超过了100就升级。所以这里设置一个对经验地址的“读断点”,大小就填1,因为这个经验数据只占1字节



回到游戏打一下怪物,得到经验值,然后会断下来(提示一下,PS采用的是MPIS指令集)



0002e4bc: lbu r2,0x0002(r2)      // 将原有的经验值读出到r2寄存器
0002e4c0: lw r31,0x0010(r29)
0002e4c4: nop
0002e4c8: jr r31  // 跳转

这个跳转跳到了0x7a38c这,图中红框里



0007a38c: addu r18,r2,r16   // 跟我前面预想的一样,将现有经验和得到的经验相加
0007a390: sltiu r2,r18,0x0064  // 关键判断!!!
0007a394: bne r2,r0,0x0007a3cc

判断经验是否超过100就在7a390这行了,0x64转换成10进制就是100
我们这里只要把这个0x64改成0就大功告成了,把后面的机器码记下来
注意这里要倒过来看,6400422E

用UltraISO打开游戏镜像文件,将SLPM_863.39(每个游戏的ID都不同)拖出来,但都是SLPM开头



用Winhex打开它,搜索6400422E替换为0000422E



最后把改好的文件拖回ISO里,保存一下即可
这时回到游戏读取存档,打怪,会发现角色并没有升级,和修改前没任何区别
不是因为改错了,而是之前的游戏数据已经被写入到存档文件中了
我们修改后的镜像文件只有在新的游戏存档中才会有效果

当然解决办法也有,就是直接修改存档文件,pSX模拟器的存档文件可以直接修改
而ePSXe的存档文件不能直接修改,因为它是个gzip压缩包,必须要用7zip将其解压(就1个文件)
修改完这个文件后再压缩回去即可

还有种补丁方式,也是最主流的方法,很多汉化补丁都是这样做的
就是把修改后的文件放入patches文件夹下即可。但是我测试不成功,不知道是不是哪出了问题