汉化日记(3)—-《幻想传说》片头破解记(续) by funlove

暗黑兔 发表于 2009-10-10 16:38 | 来源: | 阅读

by funlove (funslove@163.com) /CuXa%Ci^
2004.02.08 ?+g`HTY u
K+Z+wA?
在上篇中,漂亮的汉字终于显示了出来.不过马上又碰到了问题:我们对Rom文件作的改动,让标题画面变成了乱码!看来我们改动的地方在游戏中并不是只用这一次.怎么办呢?下面的方法是基于这样一个思路:改动这段程序,只在第一次被调用时改动Tile地址,以后就不改了. # altx=6′
D?C)BcN
首先对ARM汇编语言在编译时的几个问题做一点说明. eh4gQ^l
在 游戏Rom文件中,相同的汇编语句可能有两种不同的编译结果.一种是在ARM指令集中查到的,每个语句都编译成4个字节;另一种则是绝大多数语句都编译成 两个字节(某些条件跳转语句除外).在哪段内存区间采用哪种编译格式,应该是能事先声明的,不过我还没研究出来,谁能告诉我?可以确定的是,这两种格式不 能混用,如从双字节格式区跳转到4字节格式区,再跳转回来,很可能就会出错.这一点在修改,添加程序时要注意.由于我们要考察的这段程序正好是双字节格 式,下面就对这种格式下几个语句的编译结果做一点解释. V$”ujRp
fLSXPvm
ldr r4,=2006040h ===>编译为4C09.这是我上篇日记中提出的问题,现在总算研究清楚了.这种把一个4字节立即数值赋给寄存器的指令,都以4开头.C表示寄存器 r4,类似的8表示r0,9表示r1,A表示r2…低字节数09则表示立即数的偏移.如指令地址为L1,低字节数为N,则对应的立即数地址L2= (int(L1/4)+1+N)*4.  )LJnLo+
080B43D0 bl 080B4268h ===>编译为F7FFFF4A.这是一种利用相对地址来编译的方式,具体的地址怎么计算我还没研究清楚,大家自己改几个数试试吧.偏移量可以是正 也可以是负.由于字节数的限制,偏移量的大小可能也有限制.用bl而不用b进行跳转的好处是跳转后寄存器r14中保留了返回的地址,只要用指令bx r14就可以返回. )I^2k4Cg”
084841E2 bne 8484212h ===>编译为D116.同上,一种利用相对地址来编译的方式.其中低字节数16表示跳转偏移.如指令地址为L1,低字节数为N,则对应的跳转地址L2=L1+4+N*2. n6*En7I Vh
Di@GY!
好了,现在开始修改程序.原先的程序有这么一段: Yk’9U-.mc

复制代码

  1. 080B43CA ldr r4,=2006040h
  2. ldr r2,=10010h
  3. mov r1,r4
  4. bl 080B4268h
  5. ldr r3,=40000D4 ;*
  6. str r4,[r3] ;*
  7. str r5,[r3,4h]

3m>+-})d
~go fQ
将加了注释的两句指令用bl 84841DCh替代.这里84841DCh是游戏中原来的字库,因为扩容过,这部分空间就没用了,正好用来添加程序,如下: y.=/J8->

复制代码

  1. 084841DC ldr r1,=30007FFh ;选了一个很偏僻的地址,来保存一个全局变量,记录是不是第一次执行
  2. ldr r1,[r1]
  3. cmp r1,0h
  4. bne 8484212h ;如果不是第一次执行,则跳转
  5. mov r2,1h
  6. ldr r1,=30007FFh
  7. str r2,[r1] ;利用全局变量作个记号
  8. ldr r4,=8882E00h ;新Tile地址
  9. ldr r2,=10010h ;扰乱的寄存器内容要恢复
  10. ldr r3,=40000D4h ;别忘了把前面替换掉的内容补上
  11. str r4,[r3]
  12. bx r14
  13. 08484212 ldr r4,=2006040h
  14. ldr r2,=10010h
  15. ldr r3,=40000D4h ;别忘了把前面替换掉的内容补上
  16. str r4,[r3]
  17. bx r14

-D N8Yb
kaxvP v1
好了,片头破解到这里也告一段落了.No$GBA是个很强大的工具,好好利用能从根本上解决一些疑难问题. }<>~sy

关键字:
喜欢兔友汉化组的文章,那就通过 RSS Feed 功能订阅阅读吧!

我要评论

*

* 绝不会泄露



返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明 | 模板设计