论坛风格切换切换到宽版
  • 342阅读
  • 0回复

X86 和 X64 Windows 程序中非标挪移方式的差别 [复制链接]

上一主题 下一主题
离线大牛
 

发帖
3299
金钱
1760
威望
176
只看楼主 倒序阅读 0 发表于: 03-19
我们汉化非标时我们经常会遇到汉化后位置不够的情况。在 X86 系统中,我们一般的做法是在程序中找一处空白的地方写入汉化后超长字串,然后在程序中搜索原来的调用地址,然后将该地址改为写入汉化后超长字串的地址即可完美解决超长字串的汉化问题。
但是在 X64 位程序的汉化中我们发现这招不管用了。具体遇到的问题就是搜不到调用地址了。
其实这是由于 X64 位程序中地址调用方式的改变引起的。
在 X64 系统中程序的4字节地址都增长为8字节地址,如果 X64 系统还延用 X86 系统的调用方式的话,命令后面需要跟着 8 个字节的绝对地址,这样就会增加指令的长度,为了保持指令长度不变,X64 系统的调用指令后面跟随的是一个4字节的相对地址,即是相对该指令结束位的相对地址,也就是説要换算成绝对地址的话,需要加上指令地址和指令长度。
如:00000001 00401000  FF15FA3F0000   CALL  QWORD PTR DS:[0000001 00405000]
该指令调用的地址就是:00000001 0041000+3FFA+6=00000001 00405000
由于这一变化,使得在 X64 系统对应用程序进行手工挪移将变得非常困难,可喜的是 Passolo 非标字串宏Athena-A 这二个汉化辅助工具均已支持对 64 位程序的非标挪移。


天为什么这么黑, 因为牛在天上飞。
牛为什么飞天上, 因为我在地上吹!
汉化 摄影 音响CAD→→清风工作室