原文:https://www.pediy.com/kssd/pediy11/121564.html
PEDIY 技术在软件汉化中的应用一例
作者:cntrump
在汉化新世纪论坛上看到有一个帖子是申请汉化 Sudoku Up,这是个数独游戏软件,数独千变万化可以用来开发脑力,我还在读高中的时候在班上还曾经流行过一段时间。于是一时来了兴趣,就决定汉化试试。
软件没有什么难度,基本上只要读懂单词就能够把它拿下,可是偏偏有一处地方比较特殊,如图:
我汉化为:
每个项目都对应上了,看起来没有什么问题,但是在测试的时候发现,选择其他的皮肤都可以正常显示,但是当选择 “春天” 这个皮肤样式之后,程序就不正常了:
这就怪了,为什么在原版中正常,在汉化版中其他皮肤也正常的情况,偏偏就“春天”这一项不正常了呢?经过查看安装目录下的文件发现,在 \gp 目录中的 .dat 文件其实是 ini 格式的文件,用于存储信息,资源保存在 .rgf 文件中,.rgf 文件实质上是资源 DLL。程序通过读取 .dat 文件中的配置信息来加载资源DLL 中的相应文件。
在配置文件中有这样的信息(汉化后的配置文件):
[RibSkins] SPRINGTIME=春天 SUMMER2008=夏天
1. 004313F2 50 push eax 2. 004313F3 68 00080000 push 0x800 3. 004313F8 8D85 00F8FFFF lea eax,dword ptr ss:[ebp-0x800] 4. 004313FE 50 push eax 5. 004313FF 8B45 0C mov eax,dword ptr ss:[ebp+0xC] 6. 00431402 E8 ED49FDFF call SudokuUp.00405DF4 7. 00431407 50 push eax 8. 00431408 8BC7 mov eax,edi 9. 0043140A E8 E549FDFF call SudokuUp.00405DF4 10. 0043140F 50 push eax ;Key <-就是这个 11. 00431410 8BC6 mov eax,esi 12. 00431412 E8 DD49FDFF call SudokuUp.00405DF4 13. 00431417 50 push eax ;Section 14. 00431418 E8 CB71FDFF call <jmp.&kernel32.GetPrivateProfileStr>
1. 0043140F 50 push eax
1. 0043140F 50 push eax 2. 00431410 8BC6 mov eax,esi 3. 00431412 E8 DD49FDFF call SudokuUp.00405DF4
1. 0043140F /E9 EC054300 jmp _SudokuU.00861A00 ;跳走 2. 00431414 |90 nop 3. 00431415 |90 nop 4. 00431416 |90 nop
1. 00861A00 8138 B4BACCEC cmp dword ptr ds:[eax],0xECCCBAB4 2. 00861A06 74 0D je short _SudokuU.00861A15 ;如果是“春天”,则先转换为 “Springtime” 3. 00861A08 50 push eax 4. 00861A09 8BC6 mov eax,esi 5. 00861A0B E8 E443BAFF call _SudokuU.00405DF4 6. 00861A10 ^ E9 01FABCFF jmp _SudokuU.00431416 ;完了就跳回 7. 00861A15 C640 FC 0A mov byte ptr ds:[eax-0x4],0xA ;Delphi字串是以长度标识来表示字符串长度,而不是以空作为结尾,所以先更改长度标识,再逐个更改字符 8. 00861A19 C600 53 mov byte ptr ds:[eax],0x53 ;S 9. 00861A1C C640 01 70 mov byte ptr ds:[eax+0x1],0x70 ;p 10. 00861A20 C640 02 72 mov byte ptr ds:[eax+0x2],0x72 ;r 11. 00861A24 C640 03 69 mov byte ptr ds:[eax+0x3],0x69 ;i 12. 00861A28 C640 04 6E mov byte ptr ds:[eax+0x4],0x6E ;n 13. 00861A2C C640 05 67 mov byte ptr ds:[eax+0x5],0x67 ;g 14. 00861A30 C640 06 74 mov byte ptr ds:[eax+0x6],0x74 ;t 15. 00861A34 C640 07 69 mov byte ptr ds:[eax+0x7],0x69 ;i 16. 00861A38 C640 08 6D mov byte ptr ds:[eax+0x8],0x6D ;m 17. 00861A3C C640 09 65 mov byte ptr ds:[eax+0x9],0x65 ;e 18. 00861A40 ^ EB C6 jmp short _SudokuU.00861A08 ;改完就跳上去入栈