设为首页收藏本站官方微博

[转贴] GF汉化详细教程[内核修改篇]

[复制链接]
查看: 2094|回复: 0
打印 上一主题 下一主题

[转贴] GF汉化详细教程[内核修改篇]

跳转到指定楼层
楼主
发表于 2008-10-6 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

[转贴] GF汉化详细教程[内核修改篇]

  
# J9 p8 ]2 E5 I, V经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。
. X- E+ a+ |; r$ I; s# D( r5 W, {- m
于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码: , S5 `9 Z) C2 w6 \2 u- G$ {
5 o$ ~. S+ i8 d5 a3 x; N) e
004AA909   8A08          mov cl,byte ptr ds:[eax]        6 c( f) B% p. I; k- f
8 G$ ?* U% o& F& F, y/ L
004AA90B   40            inc eax                                                                       
) j  b! d7 z( d3 m. [4 J( @3 O. H/ O; P1 M, o$ y4 o) j; L, e/ @0 f
004AA90C  8BF1           mov esi,ecx                     
+ N8 p0 `, V/ N, q) Y# h/ `& g( ]) U* E. A, k) T
004AA90E  8BD6           mov edx,esi                     & M0 n3 Q" ~5 H5 i  E9 \

6 B2 r) R4 V7 c6 x004AA910  F7DA           neg edx                        
. D$ @" I' ^- c' R$ X4 i( O5 L
+ y- X4 a4 W# `4 Y! E8 ^004AA912  1BD2           sbb edx,edx                     8 K/ Q; ]& H) L( e5 @: o9 I
8 u) C+ O& x/ F
004AA914  23D0           and edx,eax                     9 [4 k6 i- c* V+ U: g3 q7 s, l
, }7 I% G! \" q
004AA916  85F6           test esi,esi                    
& X, G" w4 U  F# \2 |
2 n. @" h+ ?& n( o; e; v2 R004AA918  8917           mov dword ptr ds:[edi],edx      
8 ?7 K8 G& P, t
0 _! ?/ D0 K; h8 k5 a# A. z  e  # q& ^/ y: d. Z5 D9 ]- N2 h  m2 K) H8 n) q
& u- p( A. `+ V% F
函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。 8 H1 g) O8 K4 Z+ H2 ]# C! O- G
4 x, U+ l3 u& h& z
我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。 7 l+ \0 \3 m/ ^' O

! ~& K! p* [. S( ?( N0 w有了思路,对读取字符的函数做如下修改,红色为新增代码: / X! J9 G3 Q7 b/ q# H% h

' c0 }+ l) k/ K0 K004AA909       8A08         mov cl,byte ptr ds:[eax]  ' @2 i/ I2 w7 ^, ^  M

: }/ h. \; w" t- [4 l4 r004AA90B       40            inc eax                    2 S1 ~. w! M' K$ g- g! O3 X9 M0 G
2 Q0 f3 V$ F% N' x
                      f6c180       test cl,80h               " `/ S+ j( |- {3 V, Z
; z. U9 i4 U- N
                     7406           je 4aa90c                 
7 J2 d. o$ _+ h
9 r0 `6 M3 `: S. q                     c1e108       shl ecx,08h               
) Z4 \) I) @0 J0 E" D. S: n% M$ H" k' }( q' a# ?; {
                      8a08          mov cl,byte ptr ds:[eax]  % e3 x9 r& U, }' T

% I# [9 a; D, o2 _* A; D) e                      40              inc eax                           
. C; C8 E& P  S* x7 ~1 q       004AA90C     8BF1           mov esi,ecx                : @5 z1 W) h6 d6 [6 k2 w. n
! `3 [8 w1 e" i: s/ h: p
004AA90E     8BD6           mov edx,esi               
- n( b1 M9 P6 L0 [9 B6 q2 ^3 g- F. C2 k: Z# O9 ~$ g2 s
004AA910     F7DA           neg edx                  
2 H; s4 N; V. i
! z) I$ P5 ]% ~  [2 Y- r004AA912     1BD2           sbb edx,edx               
/ }8 }) W$ ^/ X$ O7 A! C
7 z2 r" [& |/ a4 g. q004AA914     23D0           and edx,eax               
, A  x: a1 z" @4 w1 V: ]1 o4 f5 x
3 B: N1 o3 Y" C9 v004AA916     85F6           test esi,esi              
+ _8 b3 D! r  L4 C9 W& T0 ]5 P% L5 [; v/ s' F; ~
004AA918     8917           mov dword ptr ds:[edi],edx
) ~9 X; f. V1 z, C: X" J" b
6 n* \. n) }; A) D0 G, b, L% Z& E  2 H/ S- `' v8 b! H

, X% u% Y6 q' o7 b/ _4 v1 S先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish!
" C: Q; ]2 m( ^0 h. K; ?) G
% z1 g4 i- x* m: }. h+ R9 _然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。 - ~# E$ b3 m2 q0 y7 j$ u( x

7 Z" Y$ W  k5 }9 m原贴地址: t2 m7 Z3 N) {4 h
http://www.cnblogs.com/pscj/archive/2005/05/10/152760.html
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表