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

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

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

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

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

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

  
, ?& {6 Y) ~2 m( Z- \经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。
! k8 e7 g% t3 g0 y. C" F3 H2 X. K1 ?9 A
于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码:
0 e% i  ?2 }8 W, t. z5 J& Y8 }3 s+ _4 ]7 a% [! A  t% H# H
004AA909   8A08          mov cl,byte ptr ds:[eax]        
: W: N+ W; w! ?
6 q2 h, G2 @. l7 f  P' c) J, R004AA90B   40            inc eax                                                                       % j8 I9 o5 N& G$ M
* \6 F- d. O+ k+ t3 Q
004AA90C  8BF1           mov esi,ecx                     6 r2 B  F, {/ Z" X& {! e/ B0 o/ X# {

) r: E4 ^( ?% |7 p" X  n004AA90E  8BD6           mov edx,esi                     
/ g. Y" C+ V: j7 h& c8 h
) G: A5 D+ G: y# p004AA910  F7DA           neg edx                        
* G0 H; H- S) K( @0 V* |; e- _: x
004AA912  1BD2           sbb edx,edx                     * p1 a9 o# m. _* y/ o5 N) s" {
: F# s# ~2 G. I$ L
004AA914  23D0           and edx,eax                     
1 q' \& Y: Z+ J8 m: E8 b# \* N1 h
004AA916  85F6           test esi,esi                    + |/ p3 |. ]% C
; g8 W; q. I7 a& {+ K! o
004AA918  8917           mov dword ptr ds:[edi],edx      
3 V- m# D1 o# _3 n
- [9 H$ b0 m% l; {  
: C: I1 E" b8 y4 y
: p4 `' H; {- K: B+ c" [0 y函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。
% w7 Q! c$ J) H3 V
8 L7 [( S4 r' l1 j! h' D我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。
; ?0 s9 ?% d1 S: d6 ~
  U2 a! G) W; z/ M( T有了思路,对读取字符的函数做如下修改,红色为新增代码:
( Q" g3 _; w& F. H0 z) |/ q( |8 s. l, n% G  |4 N4 o
004AA909       8A08         mov cl,byte ptr ds:[eax]  
+ y7 C, S6 ?9 V& p) b: _8 m, x6 J1 O0 w/ d# U9 i% R1 a- a
004AA90B       40            inc eax                    
8 @; s0 ~9 ~1 J' I6 w! a) ]  ^9 n3 V
* d( b2 |! N" v) S6 j& q                      f6c180       test cl,80h               4 I2 b5 r3 e3 y( ~; g* c
; t5 i) A8 O& s( ?0 E
                     7406           je 4aa90c                 . H4 s# _3 ^2 ]

: W! w5 A7 N8 j6 F                     c1e108       shl ecx,08h               1 x+ V% ?9 Q# m- x+ d. p
0 q; i  f. l4 f7 ^# J
                      8a08          mov cl,byte ptr ds:[eax]  ( q/ S  H9 G+ K. f2 t0 S8 }
/ V! M  s6 Y% Y: Z
                      40              inc eax                           
$ j% z! {* _8 Z  v- Y       004AA90C     8BF1           mov esi,ecx               
1 q# G2 m) E2 k) r. \  |: X
5 O$ _* {; _! s9 G0 x. p' |004AA90E     8BD6           mov edx,esi               4 e" L4 l( O4 N1 z+ I9 s( l! I. L
( o. g" D" N! {7 a/ o" h: N( G, X9 O
004AA910     F7DA           neg edx                   ; R* ^! @5 w' ]. ?+ R+ h

3 M% l! o0 |& h' O4 A, {7 B# k004AA912     1BD2           sbb edx,edx               
* G; K  K. ^: }" j+ X6 N  P) p$ K8 U
004AA914     23D0           and edx,eax               
+ G0 X  t  Q+ ?7 {) K- H, O
  [. h/ B* A' b  k004AA916     85F6           test esi,esi              / v9 W% }' _8 O% J
/ k( H. P4 d6 i+ j. n0 W, k
004AA918     8917           mov dword ptr ds:[edi],edx
3 w6 r4 ]5 l% s6 J3 Q7 i
' o7 V& G' t, L  ' D$ ^5 p1 S2 f( B: S0 D" e* r

1 J' q4 Z' P8 ^- M/ q先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish!
8 g; Q! t9 H7 o; ]2 A4 G8 m" u! ]  a8 k3 T7 J/ `" T* X! P
然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。
+ f$ y+ W3 G! p
4 P% A' f2 \: z! H3 E原贴地址
9 _6 j4 W1 E  `; ]& vhttp://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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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