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

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

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

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

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

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

  9 h' a. \: e/ S  m+ |. p. t
经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。
9 \7 |3 w4 k1 y- }# E; f2 A8 X5 O: y; [' g- l6 X8 G3 y
于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码: : G* B0 S( t! a% C. h4 E

( q4 m! F. J: c4 {004AA909   8A08          mov cl,byte ptr ds:[eax]        
& F8 @  F8 K1 K* L9 @5 h( y
2 m0 N/ r- s# h& H004AA90B   40            inc eax                                                                       7 Q. d9 ]' ?; z: r
+ B/ H. M7 C! B! p, o# u" h4 M3 ^
004AA90C  8BF1           mov esi,ecx                     0 D/ r  M) n+ v
, \  X9 X; j0 ^4 ?( C/ H; \
004AA90E  8BD6           mov edx,esi                     : ]! Q9 G# u, ]' T2 [; z
$ y& b; a5 {( R) V7 F
004AA910  F7DA           neg edx                        
2 r5 S/ N( R( ?1 H- z; Z
! `2 A/ n9 ?! b) R9 L004AA912  1BD2           sbb edx,edx                     
' r) s2 U% t5 g% C' q& S$ x! E; o) U5 @" D/ i' a
004AA914  23D0           and edx,eax                     
9 j- D# q0 i1 ?0 c* k& q! x
$ a8 R# R  ^+ W004AA916  85F6           test esi,esi                    
0 [7 w3 n9 E: \9 t0 r0 a) n) o/ J! Y6 B( T2 t! V% c3 n
004AA918  8917           mov dword ptr ds:[edi],edx      
. Y# ?+ o* P: U. W' o- k* v) I
) ^6 C4 K# _' N  H  ; n& ^/ H, D  y% g  v

& S' U3 y$ h% q: {函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。 9 _: Y& @& @. g$ N

+ O  E0 Y5 K0 r, B我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。
3 U) |6 G7 \; [, [6 v) {' d
) d% ~' e1 T+ u2 h# x3 I# y# h  O有了思路,对读取字符的函数做如下修改,红色为新增代码: / D. G+ ]7 r8 F  o! a  w
* w! F7 o( m7 X' e; J9 ^" O
004AA909       8A08         mov cl,byte ptr ds:[eax]  + E' ]. K$ Y5 @% L# W8 i) E! u

+ [: ~" G2 U) }7 z, a, ~1 d5 r004AA90B       40            inc eax                    
$ w7 R4 s0 \1 @9 M6 m
- S# C  W# z' Q: F                      f6c180       test cl,80h               " n. r# O! Z. j" G9 s
6 B% x$ t- r6 C1 n" x
                     7406           je 4aa90c                 3 B' W) l6 K. D+ b

- A" z- A4 I; l) S$ u                     c1e108       shl ecx,08h               
- u' c0 b  S. G+ y. r
5 D# c2 q6 T& }% l& Q  r, m( M" ~                      8a08          mov cl,byte ptr ds:[eax]  & S" c7 m  c; c* M/ j; ~
( u/ D- ?$ b4 k# E" i0 l
                      40              inc eax                           
2 Y! A. {2 {; m       004AA90C     8BF1           mov esi,ecx               
! W' Q5 u4 [' z) l( H% Y0 G
1 H: f+ P/ K8 h004AA90E     8BD6           mov edx,esi               2 ]1 t; ?0 e" V& d* {, x% ^
' H. ~8 L- Q) J/ I3 [
004AA910     F7DA           neg edx                   5 B: k% b% K$ F6 W1 ]
$ f0 K% x/ s5 w3 ]& n1 n- ], d
004AA912     1BD2           sbb edx,edx               ! C/ |! X' n/ A5 }$ W* X, j) A  }
. W! t% T7 h. Y# n8 H$ N1 @1 y  b
004AA914     23D0           and edx,eax                 p, K! X$ B( ?4 i( L% k

' \$ I# h# \) I004AA916     85F6           test esi,esi              
& d9 u+ M' v7 F4 k! m
5 t0 @5 ~+ k: ~/ E6 g004AA918     8917           mov dword ptr ds:[edi],edx 2 I0 Y: Z1 m' n( V8 S# M6 G7 s

. \% R6 v3 O# f2 N/ T4 P2 }  
8 ^  F5 [& s7 G
- u# ~$ n: m% c, J7 D: u& i先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish! 0 X1 N; N2 _. B
1 `+ P  }: {$ Q+ z% |, B
然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。 . K; u1 f0 t5 ^2 N& S3 w2 }
6 x6 @4 [2 E" c/ z+ f9 p
原贴地址
6 I8 M9 u# k2 c" t  V! yhttp://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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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