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毫秒