玩转补丁移植( 三 )


084BB07:D0 E0

3.3

使用和1同样的方法得到第三行移植后的补丁数据:
086a214: 06D1 0028

4.最终补丁:
;c65
084bbe6: 05D1 0028
084bb07: D0 E0
086a214: 06D1 0028

5.补充说明:

在“将A08548B3处的D0改为E0,再用IDA反汇编”这一步,我们可以用工具软件ABraGen的反汇编功能来确定补丁的指令格式,但是ABraGen的反汇编功能还存在bug,仅供参考 。
特征值的模糊搜索也可以用DOS软件sfe来进行,比较而言,Smelter更直观、功能也更丰富一些 。
如果不进行反汇编,是难以确定需要进行模糊搜索的?号的位置的 。这是移植跳转类补丁的基本方法 。

三、按###进入九宫菜单

1.补丁原型:
;S65
0B6E9E0: 39F021FF F3F4C8FF

2.基本思路:
我们曾经移植过“任意处按###进入极速菜单”的补丁,现在,只需改一下补丁的指针,就可以改为调出正常的九宫菜单,也可以进一步修改,按###进入其他功能 。
在这个补丁中,包括一个地址和两个入口指针(绝对地址长跳指令) 。按###进入陷阱地址A0B6E9E0再转向九宫菜单 。
移植工作需要做的是,在C6C中,找到39F021FF(作用相同但数值不一定是39F021FF)的位置,替换为F3F4C8FF(作用相同但数值不一定是F3F4C8FF)的位置 。

3.补丁移植:

用IDA反汇编S65的Fullflash:
ROM:A0B6E9E0*BLsub_A0BA8826
ROM:A0B6E9E4STRR6, [R5,#4]
ROM:A0B6E9E6POP{R3-R7,PC}
ROM:A0BA8826*PUSH{R4,LR}
ROM:A0BA8828SUBSP, SP, #0x1C0
ROM:A0BA882ABLsub_A0BA8200
ROM:A0BA882ECMPR0, #0
ROM:A0BA8830BEQloc_A0BA8862
ROM:A0BA8832ADDR0, SP, #0x1C8 var_1C4
ROM:A0BA8834BLsub_A0BA8610
可以看到BLsub_A0BA8826是一个绝对地址长跳指令,需要进行模糊搜索,增加一些特征值后,我们用Smelter在C6C的Fullflash中搜索“????????6E60F8BD80B5”,得到唯一的地址A0AF9C98 ,数据为2AF03DFF,从而确定了补丁的一部分:
0AF9C98:2AF03DFF
下面需要看一下,修改后的补丁跳到了哪里 。将S65的A0B6E9E0处的数据39F021FF替换为F3F4C8FF之后,反汇编得到:
ROM:A0B6E9E0BLloc_A0862974
ROM:A0B6E9E4STRR6, [R5,#4]
ROM:A0B6E9E6POP{R3-R7,PC}
...
ROM:A0862974PUSH{R7,LR}
ROM:A0862976BLsub_A0849094
ROM:A086297ABLsub_A083D85E
ROM:A086297EPOP{R7,PC}
需要在C6C里面找到这段功能相同的程序:用Smelter搜索“80B5??????F???????F?80BD08B5????????0028”,得到地址A08796E0,这就是正常的九宫菜单的入口 。下面我们就要确定一下使用BL指令由A0AF9C98跳到A08796E0的机器码,还是要用到ABraGen这个软件,经计算得到了数据7FF522FD 。

4.最终补丁:

;C6C 按###进入九宫菜单
0AF9C98:2AF03DFF 7FF522FD

5.补充说明:

刷这个补丁之前需要先撤销原来的按###进极速菜单的补丁 。当然也可以强刷(因为###的陷阱地址相同),V_Klay产生的Repair文件会包含极速菜单的补丁 。
实际使用中,并不是任意处按###都有效,大家可以自己尝试一下 。
【玩转补丁移植】这篇文章向大家介绍了个人在移植补丁中摸索出来的几种基本方法,有不当之处,请大家批评指正 。

移植类似“远端同步->极速菜单”和“黑白名单”这样的补丁还需要更灵活的处理方式,其中的原理都是一样的 。

有时间的话,我希望再写一点开发补丁的方法和思路,与大家探讨 。
文中所用软件和Fullflash都可以在http://yizhe.net/c65/dev.htm下载 。

推荐阅读