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

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

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

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

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

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

  
5 d2 _1 d, a9 |# P5 o4 K& ]7 @经过前边的字库改造,已经完成了一半的工作,剩下最关键的显示汉字部分了。字库已经是中文的了,但是能让中文显示出来却不是件容易的事。不信现在进游戏试试,看到的中文全是乱码。为何?因为中文是双字节,两个字节才代表一个汉字。游戏显示英文字体的函数是为显示单字节的英文设计的,是不适合显示中文的,必须要修改。因为不可能得到程序的源代码,修改方法只能采用比较极端的修改可执行文件的方法了,即所谓的逆向工程。 / U6 m# _% K$ {$ O% k( @

! z0 h! j$ \5 b5 \* a+ L于是操起常用的调试工具Ollydbg开始调试游戏。经过2天的不懈努力,终于找到了显示字库的函数,以下列出读取字符的函数部分代码:
3 P. j# ]. l2 v1 [
; A4 |  S+ r* g8 h. H7 O+ i004AA909   8A08          mov cl,byte ptr ds:[eax]        
# K( w' \, Q5 a" p, s; B$ o$ c& b8 i! h& W# u2 M5 }3 v7 X4 V
004AA90B   40            inc eax                                                                       5 k# `9 [. I  [! K+ L# b+ ], r$ y
1 j$ e9 M8 c" s) F5 b. B
004AA90C  8BF1           mov esi,ecx                     . M/ c9 v$ ^! V, o: Z8 V

/ R+ ^" }2 H/ ~: L/ i! F8 l7 U004AA90E  8BD6           mov edx,esi                     
3 p" f! u- W, _7 R$ w- {1 }- r
4 T1 G& j) @+ i; Q& D$ G1 @8 m' E# d004AA910  F7DA           neg edx                        
: h0 P$ e6 F/ ]0 F2 D2 I9 I* \& m$ r  S: P+ |2 T4 ]+ V
004AA912  1BD2           sbb edx,edx                     
/ |7 P  e' p* G
! x8 R$ u7 }( d9 z& }004AA914  23D0           and edx,eax                     
) w) R8 H4 }& `+ `! B% m/ `5 X1 b( A" [- {9 b+ f" E
004AA916  85F6           test esi,esi                    , Y5 Q  B, k" F0 A: d2 G
# q! o0 i4 y, u: c) c" F5 _' B
004AA918  8917           mov dword ptr ds:[edi],edx      ! v! B4 F+ \& D4 l

) j% G1 N* f4 m  , ^) [% K% ]5 _% _/ t% E- L$ {& {
+ v  ?: `0 X! C1 c! F: O/ \
函数开始Eax指向脚本文件grim.tab文件中某行脚本的第一个字符。例如主菜单”Control Help”中的C位置。004AA909一行的意图很明显,读取字符串中当前位置的的一个字符的ASCII码到放到cl中,然后Eax加一,指向下一个字符。然后会将此cl中的字符当作参数,调用另外一个显示字符的函数,完成读取字库文件并显示字符到屏幕的功能。 & y, ~$ K% }, h

, i' h% z; X+ h9 O8 }我们需要对此部分做改造。如当前Eax指向一个英文字符,则还沿用程序原来的部分,读取一个字节到cl,并使Eax增一;如当前Eax指向一个中文汉字,则需要程序读取2个字节到cx中,并使Eax增二,指向下一个字符的正确位置。那么如何判断当前Eax指向的是一个英文字符还是中文汉字呢,GB2312汉字的编码有一个的特性:两个字节编码最高位(第8位)一定是1。每次读取字符时,先判断第8位是0还是1,如果是1一定是中文,是0则是英文。
, G5 v. |' |2 ^$ G9 b9 x" S5 E) L: x, t, ]
有了思路,对读取字符的函数做如下修改,红色为新增代码: ) u' J1 u: F$ M# k! g

9 ]( a; a" x$ z004AA909       8A08         mov cl,byte ptr ds:[eax]  + ^# u% R/ b+ j4 B

, a7 m: X/ z. i1 T7 o8 j004AA90B       40            inc eax                    
5 i) k# d) U5 _3 i3 H
, @3 h/ s1 z6 \& ], F, C- v. {                      f6c180       test cl,80h               
' Z2 f2 L" O) D9 h  o9 j& f7 c" ^
1 ]  z. P; D0 I+ }                     7406           je 4aa90c                 
* x( U3 v' [6 U  k3 B" R% |3 K$ E' Q! r/ Y" o6 `% F* w4 T
                     c1e108       shl ecx,08h               4 U1 V9 |5 U% T, c' R: t0 p& I7 T: t
$ K6 ^) a7 n0 Z4 k/ t$ y- |
                      8a08          mov cl,byte ptr ds:[eax]  ' f, x3 m* E- Y1 L# W

( q( L; b  e$ D. ?4 s# W6 x* T                      40              inc eax                            . ?3 |2 r. W1 T
       004AA90C     8BF1           mov esi,ecx               
" ^5 v* P- T  X; G! }# [- g1 X
& f0 y0 f* d$ q$ S004AA90E     8BD6           mov edx,esi               
: C! l" i1 g( `- [8 `) H( u" F, a! r" U
) l% |5 I3 X" S5 W" ^# o! [2 Q4 }: }004AA910     F7DA           neg edx                   7 r# z* P" {- Z3 t& ^! C$ R

! O4 Y3 |: f9 S; `; C) B' k" j& @004AA912     1BD2           sbb edx,edx               
% d( ?5 S+ q: z, i- N7 d4 Z, h8 ]; U# y
004AA914     23D0           and edx,eax               
2 Y+ U5 `2 h- u- H
0 T' P( J. f" I004AA916     85F6           test esi,esi              5 V1 y: B# T% ]
2 g( c2 d$ o7 A. g' J
004AA918     8917           mov dword ptr ds:[edi],edx - _. z- `: I/ B, L0 h" C& ?
9 v1 _+ _3 G. Q4 o
  % N- N; F) F6 r2 i( k: U

; b4 O* ]0 Y0 R/ p# l4 F8 U先放Eax一个字节到cl中,然后判断cl的第8位是否为1,如果是0,说明是英文字符,则按程序原来的进度跳转到004AA90C这行的代码继续执行。如果是1,则要将cl向左移8位,为汉字第二个字节留下位置,然后再取一次Eax的值,把第二个字节放到cl中。最后Eax增一(Eax增了两次1)。此时Ecx的数值正是一个汉字两个字节的内码。Finish!
. A5 Q5 s5 c1 k6 N: h& ]" j7 o$ F' h( H/ t0 [% z
然后用Uedit打开可执行文件,找到一段nop(90)比较多的位置,最后将红色部分的机器码加到合适位置就OK了。 + m. T# n- J8 U0 Q1 a( J
' f8 o+ s/ Y' C) X1 h
原贴地址
) J* X) z4 i/ V4 a% L1 g0 Fhttp://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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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