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

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

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

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

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

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

  
8 P8 L- ~* ?6 Z& ^9 q7 @) t8 D: c经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。
2 H0 j. O9 i3 A/ H! }* d7 s% u. L
8 w9 }% K- [* V于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码:
% t6 P3 m' q' R( U5 G7 O, r$ W( y  I' V0 u
004AA909   8A08          mov cl,byte ptr ds:[eax]        * B3 C* P  Y$ {

7 I. t0 t0 `9 ]7 a004AA90B   40            inc eax                                                                       1 q$ ?* r) _( L: X  G2 _$ c

) t3 g, O- i2 s: K' |/ H004AA90C  8BF1           mov esi,ecx                     & h1 A7 T  k; [0 m% r- d8 q
' D0 {1 h6 `+ p1 g7 U6 z5 u
004AA90E  8BD6           mov edx,esi                     
) G2 `+ r8 t- h0 ~
6 w/ T5 [: c1 K: B( b- O! U% J004AA910  F7DA           neg edx                         ' D  X8 c+ c; q, @; D

: @- Q8 e5 y! w3 a: |004AA912  1BD2           sbb edx,edx                     1 l& y9 ~7 Y$ h5 A  g, E" N3 {4 K

+ G0 k$ q4 W' ]8 `$ _/ V004AA914  23D0           and edx,eax                     ) e/ G' g& |. F

% j1 @+ a, N0 [7 p; L" z$ O004AA916  85F6           test esi,esi                    
0 z% g4 v# D# C1 C: y9 s$ C4 @5 D8 [  }2 p0 E0 {
004AA918  8917           mov dword ptr ds:[edi],edx      
/ h) t1 ~4 I/ A  B* K, G9 Y% I6 `1 Q( q2 j% T( t* i
  
0 m) _8 m/ L9 }0 G7 T7 w
* Q+ G/ h1 I3 V- Q6 G# u函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。 % @+ k- Y3 ?' D/ z

) x# [1 ]% O( u# L+ z6 P4 q我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。 9 Q7 f' Q% ~; z) s
1 D$ k3 |' f! f3 h) Y1 p% P
有了思路,对读取字符的函数做如下修改,红色为新增代码: $ A$ `4 W4 Y9 j; \! ^

" }2 _' e% d% b+ ]! u004AA909       8A08         mov cl,byte ptr ds:[eax]  0 o5 A. H) K# N! e

! l( b- q( y2 F/ v004AA90B       40            inc eax                    ' ^9 m/ A% Z  U. {
3 p$ \  B* K& U+ u; ^
                      f6c180       test cl,80h               & q& F8 C% q! r$ q7 j5 o" B

4 Z$ e/ ^& P6 Z/ q1 F                     7406           je 4aa90c                 
. o& L0 K) B7 h- w' T0 p* t4 q, g7 ^' c
                     c1e108       shl ecx,08h               
' b& H/ k) }% n  K7 q! A2 y+ e
8 @! _# u) i+ T0 p7 D                      8a08          mov cl,byte ptr ds:[eax]  ; G* }% x3 G1 l8 ~, t
) L- S( }$ O  A, j" W
                      40              inc eax                            ' p6 ^  ~$ `- h, ]2 U# K* h9 R
       004AA90C     8BF1           mov esi,ecx                1 {! ~8 Q: U9 f. \8 v

- O/ p9 o# n/ Z3 q004AA90E     8BD6           mov edx,esi               . C8 b; N  z1 s
! i1 g7 n# O1 Z' K  U
004AA910     F7DA           neg edx                   4 _/ L* ?4 R% ^% F0 `6 e4 ^

; B& }" A$ {7 M) [2 f2 j/ B" d004AA912     1BD2           sbb edx,edx               8 N& x7 N. ?* B

) M8 U& [+ [) i; j0 z004AA914     23D0           and edx,eax               
6 u8 w- r& M7 `6 W% [- h
) c  r9 s( c) R7 [) k4 d8 ]" c004AA916     85F6           test esi,esi              
. Z& J6 G8 J/ E3 n* f: s( [( \( m6 ?! t9 Y8 Z
004AA918     8917           mov dword ptr ds:[edi],edx : Y- f0 a; i, Z: _/ p3 o6 S

( f* x( a9 o$ L2 E* u  5 G# c- b0 |5 q% b
/ E# }6 k! l9 |: |4 t
先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish!
0 @3 r! \; g- x. Y& u: J
, T1 T; {. M8 L2 ]) j: B然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。
6 L# R& h2 g( y* _, Q) p; c4 Y9 f4 R; U! u+ `
原贴地址
1 ^6 D4 o: ~3 ~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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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