修改二进制文件
在汉化游戏时,往往有部分程序逻辑需要改动。
修改汇编
首先阅读MIPS汇编相关章节。
劫持对外部模块的调用
- 劫持对
libfont.prx
中函数的调用,实现字体替换等操作。 - 劫持对
sceUtils
的调用,修改存档等界面的语言。
方法:
1. 运行时动态修改导入表jr ra
的函数地址,使之指向修改后函数的地址
2. 制作新模块,仿造原外部模块的导出表(Export Table)以及库名(Library Name)
3. 运行时动态修改模块导出表,使得导出的函数指向修改后的函数地址
4. 运行时动态修改jal
处的调用,将该指令的参数改为修改后的函数地址
劫持对内部函数的调用
- 修改函数调用处的
jal
指令,跳转到修改后的函数 - 修改内部函数开头的指令为
j
与nop
,跳转到修改后的函数
j
与jal
二进制指令的生成
从Module Tutorial
中摘抄的宏
修改方式
需要注意游戏主体模块加载的基地址(通常为0x08804000),最好通过函数在运行时获取,以便依据需修改地址的偏移量重新计算地址。
基本流程
首先,使用Ghidra
打开解密后的游戏主模块(EBOOT.BIN
),注意设置基地址为(0x08804000),得到想修改内容所处的地址p
;
其次,使用sceKernel...
查询主模块的基地址new_base
则有new_p = new_base + p - 0x8804000