Programming 版 (精华区)

发信人: ffzh (★铁马冰河★), 信区: Programming
标  题: 游戏汉化教程--1
发信站: 哈工大紫丁香 (2001年03月29日16:44:16 星期四), 站内信件

. 一般软件的汉化方法 

这里的"一般软件"指的是标准windows界面的软件,也就是绝大多数的,使用最常 

用的下拉式菜单,对话框,消息框之类的软件。 

这类软件的汉化比较简单直观,一般是以资源文件的方式打开.exe或者.dll文件, 

修改里面String Table的东西,然后万事大吉。我没有做过这方面的事情,可能还 

会存在别的问题,比如在英文版windows界面下应该如何处理什么什么。但是此类 

界面的游戏软件少之又少,大概就是扫雷,纸牌之类的小游戏,所以不在本教程讨 

论范围之内。 

  

2. 开始汉化前一些必要的准备 

游戏汉化是一件综合性,技巧性很强的工作,必须掌握多方面的知识: 

推荐书目:《windows95系统编程奥秘》。老了一点,不过对于汉化来说,比新版 

本的好。 

1) 汇编语言的融会贯通 

不要求能写出可以独立运行的部件,只要能看的懂,能写几个片断就可以了。关键 

是要善于从汇编代码中揣摩程序的意图。 

2) Soft ICE的使用 

这个我就不多说了,买张黑客大全什么的,自己熟悉熟悉去。汉化用到的指令并不 

多,会灵活使用断点就差不多了。 

3) 了解函数调用约定。 

你必须知道,一个函数调用,经过编译以后的出入口代码是什么,参数,局部变量 

是怎么在内存里组织访问的。 

典型的VC编译的一个函数如下 

void function(int a, int b) 



int c; 

c = a + b; 



编译之后: 

1: void function(int a, int b) 

2: { 

00402570 push ebp 

00402571 mov ebp,esp 

00402573 sub esp,44h 

00402576 push ebx 

00402577 push esi 

00402578 push edi 

3: int c; 

4: c = a + b; 

  

00402579 mov eax,dword ptr [ebp+8] 

0040257C add eax,dword ptr [ebp+0Ch] 

0040257F mov dword ptr [ebp-4],eax 

5: } 

00402582 pop edi 

00402583 pop esi 

00402584 pop ebx 

00402585 mov esp,ebp 

00402587 pop ebp 

00402588 ret 

  

在这里,函数初始化期间,用一连串push保存了现场,离开函数时则pop回去。第 

三行sub esp,44h,目的在于为局部变量腾出空间。参数抑或局部变量,以EBP为界 

。EBP + N (N > 4)为参数,EBP-N (N>0)为局部变量。(EBP指向的4个字节可能保 

存返回地址,没仔细研究过)。 

4) 学会修改游戏程序 

修改的方法有许多种,我采用的方法来自于《windows95系统编程奥秘》中关于注 

入dll一节,加以修改后可以成为注入附加过程的方便工具。 

原理: 

制作一个装载程序,一个DLL,(我这里是haigu.dll) 

装载程序以DEBUG模式打开游戏进程,在游戏程序装载完毕,可以运行时,会自动 

发出一个INT 3中断,同时会被装载程序截获。此时装载程序向游戏程序开始的第 



一条命令改成call xxxxxxxxh,int 03h这两条指令。xxxxxxxx指向函数LoadDLL, 

LoadDLL()负责装入haigu.dll。int 03h又把程序带回装载程序,装载程序这时恢 

复游戏程序原来的第一条命令,从那里开始执行,然后…OK… 

  

回到haigu.dll,在被装载之后,会执行OnInitinstance()函数,在这里可以做 

初始化工作,并且在这里将关键的,需要修改的游戏代码部分设置jmp指令,抢夺 

对字符输出的控制权。 

这种方式的灵活性很大,不必担心搅乱原来的代码(当然也要适当的处理),缺点 

是针对那些带外壳的程序没有用。此外,我猜想如果游戏程序的字符处理过程在某 

个dll中,而那个dll没有在游戏刚刚开始运行就装载,也会出现问题。对这两个潜 

在的问题,欢迎高手加入讨论。 

  

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: vilab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.235毫秒