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

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

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

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

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

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

  
" x% r0 H* N; t; h经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。
! f# \9 }9 X7 Q, a, D6 j
+ y! p, F; W5 \. q9 c3 L于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码: * }) Z* p. [, S- T. L  r
6 C. C6 f2 x( K0 v: y5 E4 Q$ [
004AA909   8A08          mov cl,byte ptr ds:[eax]        
, }7 _7 i, H) f- {  _+ L+ a, ]& A5 _5 i8 h, @
004AA90B   40            inc eax                                                                       
5 Q0 _# {. _' k1 r9 J
7 v6 i1 z0 b. o# H- s" R& c004AA90C  8BF1           mov esi,ecx                     
; T% ]. F  e% U- q+ _% a% w1 J( `$ J# \  D3 {4 B$ O
004AA90E  8BD6           mov edx,esi                     
2 \2 W# E0 G" A3 T) T, a
+ |- P! R" ?# J% I0 F& q8 M1 r* M, N# y004AA910  F7DA           neg edx                         1 p; {% U( f0 Q; |0 s# ]) [; K* L
# n# y* U% Q- c1 V  J& D
004AA912  1BD2           sbb edx,edx                     
% v" d! D5 _9 J4 d' W' K) \# T, w( }' }2 l
004AA914  23D0           and edx,eax                     7 F6 |# j5 V" w$ ^4 U* y" S

1 p: M9 v+ d( S, ~6 a: S004AA916  85F6           test esi,esi                    
  G) D, y; ]# U8 l5 D+ d$ w( Y; G. m; G/ t% B8 i
004AA918  8917           mov dword ptr ds:[edi],edx      1 F1 l- D& p0 k

0 s: X# L: I; h, l  
/ ?7 ^4 J, R. ^: p. ?3 j; u+ j
$ B: P% u" t1 ]7 K8 `7 u0 e( K6 t函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。 & t: x3 Q: ^" _% d
+ c- O/ u, q) Y! P; P7 R
我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。
1 G0 [9 u* T2 M# y, N
* v4 m; r: I6 a& u8 ~有了思路,对读取字符的函数做如下修改,红色为新增代码:
( F$ V2 G! c$ ?$ r' l8 o  F% i# F# G& \4 _" z8 e
004AA909       8A08         mov cl,byte ptr ds:[eax]  
4 C8 G4 ?# H! g' ?/ g/ ]1 i' O( W! H& B7 Z! P* r& _
004AA90B       40            inc eax                    ( b& B" K8 X* ?& X' W- Q4 x, L8 f

1 B2 l4 C# u7 I/ ^                      f6c180       test cl,80h               
0 s3 M: r6 O7 V0 C- v$ M) i, X: M1 g2 }  r  T1 }# k) ^5 D; n- f
                     7406           je 4aa90c                 9 ^, a$ I! U! \  V

" ]3 l3 j8 ?, B9 z                     c1e108       shl ecx,08h               : L0 R- D5 w8 c  J3 F4 z8 F

" G1 ]& Y0 W! L8 O4 s                      8a08          mov cl,byte ptr ds:[eax]  6 y8 q- \$ t- O: ?0 j0 x7 v

) o5 Z1 u. p5 X7 a; T2 r                      40              inc eax                           
  F8 A9 v* K" c! X( D       004AA90C     8BF1           mov esi,ecx               
- Y" \8 [3 n, g8 P% [* V) {2 j8 M
9 [2 L* n' _- B* J$ |9 b$ S6 |004AA90E     8BD6           mov edx,esi               5 n: {% o. v: A4 M1 m" t5 Y& Z
0 ?0 S5 n/ h) _8 R
004AA910     F7DA           neg edx                  
6 b* \' A8 ?: s0 a$ {% e; m! ~0 ~! u( ?# }; W7 n& z0 M6 I/ f) e6 v
004AA912     1BD2           sbb edx,edx               
9 l) F2 i4 E3 c. L, W1 ?! J% p+ I  c/ z9 P3 E3 b* l9 h  A
004AA914     23D0           and edx,eax               + g" N& s' X! g8 l( r

0 s+ C7 L8 H- Y+ X) l* T6 q" Q6 Z004AA916     85F6           test esi,esi              
+ W* \+ v6 O" c
# n( Z+ A$ l3 q2 _004AA918     8917           mov dword ptr ds:[edi],edx
+ L% S& E5 L9 A  P& {6 k7 I6 R8 l4 K4 ?- y+ M8 y" k: ?: j2 S5 P
  $ ]* L; S6 L8 A! w
1 m" m' X% j# h1 Z
先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish!
. n3 Y$ o7 c/ W: h: X- R4 t$ k/ J/ _4 u: ?6 |7 o( r+ `
然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。 * P2 k+ A1 s: r! j3 J* v  M! T$ }
) W( J- v' L+ e4 _
原贴地址
% Q9 D3 I; m  J7 _  ]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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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