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

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

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

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

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

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

  
; N& G. f% N! |. `9 I- v0 ~! Q7 I经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。 ! f+ b% Q  N, i! i4 ?1 V

( }% y0 L# a8 g- V! e  y) `5 d; H于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码: . m5 P) e. |$ f. Y

; E3 ?0 L1 T) p! Y5 q004AA909   8A08          mov cl,byte ptr ds:[eax]        
( X; U+ G9 x. y- K! H
3 H, u' j9 ~! @" {; v004AA90B   40            inc eax                                                                       
" W$ T; @' C2 W8 g3 E$ h, A% o: k
4 l: L/ C0 Y1 Y6 {9 O# g+ G004AA90C  8BF1           mov esi,ecx                     
. y4 q7 ?0 O9 U1 `: s) i4 @) q% X, R* U; n3 E6 d
004AA90E  8BD6           mov edx,esi                     
  w) p" |7 D- K9 z2 e5 z8 t
4 \( c6 ]1 A$ M$ ~004AA910  F7DA           neg edx                        
2 g4 ?3 g1 O+ B; v/ V' c& m
- ]% M1 G. T7 e( ?/ t# c0 j004AA912  1BD2           sbb edx,edx                     
8 P  B' o+ a( B, E8 ^3 B3 y/ ]# H7 i
004AA914  23D0           and edx,eax                     
/ l- X! T* x/ L, T
& g1 U/ f& W  S( T5 k/ B: G004AA916  85F6           test esi,esi                    
# |& I" t3 ^! y4 X) N# D+ s2 x! h/ B% p0 G
004AA918  8917           mov dword ptr ds:[edi],edx      
1 g- |- k9 B' w; h5 O2 f: C1 t9 o; h6 U6 j  k$ a6 V( h: L9 j
  2 e" c, `2 E9 }+ }8 R5 c5 B3 n- N

* P2 t* e, ~9 o6 R. {: V7 y( E: `函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。
2 T! Y3 f5 K$ l3 e3 X' z
( v6 j' w; ], x我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。
1 O7 f) r6 w6 Y0 p
5 m2 G% Y0 A0 N0 U有了思路,对读取字符的函数做如下修改,红色为新增代码:
9 z2 P. d, {2 Z, J! |$ f: o8 A
4 o+ u6 @* X% Z$ [+ E3 D$ J7 v004AA909       8A08         mov cl,byte ptr ds:[eax]  8 h$ z; n. Z9 ~+ W# Q
0 b, ?4 F( W8 }% K7 |. f
004AA90B       40            inc eax                    
) k* c" y% n5 A# A* p) v$ U+ A7 |5 I
                      f6c180       test cl,80h               
) p0 _* E! X8 r! \% r$ l" R% U( v4 c# M% ?
                     7406           je 4aa90c                 " H& _5 i' T0 O7 K
& }4 ~1 z) ^8 W( l
                     c1e108       shl ecx,08h               7 F) ]5 |5 H( @- C
" @* P2 q$ o+ q
                      8a08          mov cl,byte ptr ds:[eax]  4 y! S1 k0 G, A
) A0 {5 g6 S) l0 T
                      40              inc eax                           
7 `# S' d$ v1 \. {; g' I       004AA90C     8BF1           mov esi,ecx               
0 E3 K$ R5 m2 e4 F* }; g: A# T" k: q: B: A+ P2 E) A/ @1 x! m
004AA90E     8BD6           mov edx,esi               ) E9 D- ^. m" h( ?) H. v
7 F+ U! S- o) Q
004AA910     F7DA           neg edx                  
. z+ {( w: W; v- R9 w( u- f( c$ A- o( z+ u  g1 S
004AA912     1BD2           sbb edx,edx               ) d' F$ K; T! u* N' L' g: z8 ~

( v  S: ?2 m8 y6 B! E6 _$ R. `( L004AA914     23D0           and edx,eax               
3 |9 T3 ]# U8 x9 c- t% D
# d, u  o: Z  H- s2 ^004AA916     85F6           test esi,esi              
$ P  e4 V2 s. A0 ]: c; o$ I7 |" R3 J0 `
004AA918     8917           mov dword ptr ds:[edi],edx
+ [5 ^5 c0 D+ e) j& o3 Z: B8 Z
+ N) U- p: f+ w; R+ a! h  / f% l) j( j6 t6 V) R6 D0 `5 x5 ?
% H. L3 h* E$ F7 V0 n
先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish!
: a0 B* f' k( ^+ }+ X2 L1 P1 Q+ S! R% ?- x, }6 U
然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。 5 N( A- U& r3 B6 {7 S" V4 x

# R! m5 o; l$ P( J6 i4 e4 G, u( m原贴地址  H0 ^1 G! D! o9 g3 m4 c
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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