冒险解谜游戏中文网 ChinaAVG

标题: 虚拟村庄4汉化简易教程(写的很乱) [打印本页]

作者: cmou    时间: 2010-3-13 11:35
标题: 虚拟村庄4汉化简易教程(写的很乱)
上次在这翻资料的时候正好看到某人写的虚拟村庄3的汉化教程 手头上正好也有这游戏 所以决定小试下汉化 2 }6 b" x! i  t6 Q

' m4 Z6 ?3 x" R在汉化前我们需要分析下游戏是如何显示字符串的 是贴图还是点阵
! j# Q* I  t. M$ y这里是用bitblt贴上去的 4 X" ^5 k# u/ Y6 Q! w
知道是贴图就要寻找相应的字库和字符串 2 p1 n) Y; g; b( Y8 r; Z( y7 {
字库在image文件夹就能找到
8 X: e  x! B2 z; h! b字符串被压在了EXE里(脱壳后exe增大了3MB) ( V) Y& ]8 v) ?4 `! @7 N1 p

" [; h  m, {& R4 @( U8 H# ]下面就是分析游戏是如何显示字符串的 * d+ c; E+ E8 K5 F, y. L1 K3 t
用OD载入脱壳后的EXE文件 找到某个字符串下硬件访问 我这里断的是Quit3 C* X) |9 i: G
[attach]15475[/attach] + |! r% U- S/ M0 v+ s- v, @+ `" c
按F9启动游戏( L8 F7 u; ?0 N' S3 M! b6 }
然后断在4F24D2处
: S, {4 G9 T) J$ L9 m这里是读取字符串用的
" s; r8 Y7 a: C( z# s- U [attach]15476[/attach]
0 S, x$ y1 z6 v8 _; Y% c分析下9 H- v/ S! G& W$ L7 W! v0 j
004F24D0  |>  8B01          /MOV EAX,DWORD PTR DS:[ECX]   这里是读取4字节 quit* f  o3 X( q+ R1 F4 v+ z# a
004F24D2  |. |BA FFFEFE7E   |MOV EDX,7EFEFEFF    这里一块主要分析字符串是否已经到\0; m5 ~  }6 c" }6 B( D$ a# ]
004F24D7  |. |03D0          |ADD EDX,EAX& E3 O& u. O2 j+ u5 T. T
004F24D9  |. |83F0 FF       |XOR EAX,FFFFFFFF
: G7 {2 x1 J* R1 I& D004F24DC  |. |33C2          |XOR EAX,EDX
! `( p/ d4 e6 I2 f004F24DE  |. |83C1 04       |ADD ECX,4      读取后面4个字节4 K% [3 M7 U! I
004F24E1  |. |A9 00010181   |TEST EAX,81010100
) V; f# l* H7 w' d. O# f. E. T( E004F24E6  |.^ 74 E8         |JE SHORT Unpacked.004F24D0  如果是4个00(也就是81010100)就跳出& I& ^/ }1 G5 {# H3 Y$ w. n3 p; z* j

! J# @9 ~; U! P$ B这里要注意一下7 c, o! a0 ?7 j& @  r/ q) H
因为是4字节一取   \0处一定要是00 00 00 00
" `& Q+ N$ ^; t# g4 x1 Y如果要把Quit
1 A6 {4 I- Z5 D51 75 69 74 00 00 00 00  Quit....Quit....; D5 e. D9 v( c9 B3 M
翻译成"退出吧"   就需要在加4字节% R- t( B5 f' K3 o* c; f) Z. K
地方不够用咋办   幸好ecx是个指针    MOV EAX,DWORD PTR DS:[ECX]+ j7 o, J' Q) u2 B' {  w
只要把ecx里的地址改成你的就OK了) y% g) Q* I' Q( W0 `, V4 V

& y: w: `# I5 u% _) p* o继续找处理图片的地方
% }. p6 [5 u+ X0 Q: H一路跟下来到了
( `. h8 v' r5 }. w; J [attach]15477[/attach] $ T5 |- ~+ x4 @, l& Z4 O
004F398C  |.  83E6 F0       AND ESI,FFFFFFF04 C1 S) x" \4 x
004F398F  |>  56            PUSH ESI                                 ; /HeapSize = 5
! t, V3 G$ `( x" _, ^9 ]; m8 o) K004F3990  |.  6A 00         PUSH 0                                   ; |Flags = 00 w8 X% d, l, t/ k: e! W: ~
004F3992  |.  FF35 3C7B7B00 PUSH DWORD PTR DS:[7B7B3C]               ; |hHeap = 00D60000
- Z6 k) O+ O! L0 a$ V! i: \9 f( L004F3998  |.  FF15 14815100 CALL DWORD PTR DS:[<&kernel32.HeapAlloc>>; \HeapAlloc
$ q" d: i9 {- t4 u% p004F399E  |>  5E            POP ESI' e5 f9 Q4 [% B" g  ^; P7 h2 f- W
  v& |( g* |, Y4 @/ S# t0 w  j
发现HeapAlloc   这个是用来分配内存的; P! O0 @; J' j
F8步过 取eax的地址  就是将写入新的quit的地方$ T! c' v+ E, j$ L
对其下硬件访问 F9运行/ G0 J+ V; z9 G" x- @1 J8 `* Q; d
断在了403811; l6 n) C. p+ Y4 f: G2 |
在F9几次  断在了4091c4: |  M. s6 d: h# F/ v+ @
在F9几次  回到了403811: v& x5 s( m. j) f
[attach]15478[/attach] % Q9 N. ?: ^: K9 u
确定就是这2处地方了# p8 _# {5 k0 \8 z% I
这里我选择了4091c4  因为在跟踪403811后发现这里的数据没用
# M: E$ e7 k3 m9 V7 P! a2 {3 {3 z0 a( d& j) M
004091BE  |>  8B55 08       /MOV EDX,DWORD PTR SS:[EBP+8]/ J% \  q! Y6 B
004091C1  |. |0FBE02        |MOVSX EAX,BYTE PTR DS:[EDX]     取第一个字节Q# A! j' b  P5 g/ \
004091C4  |. |85C0          |TEST EAX,EAX
1 ?: E# q1 x9 U4 [& S004091C6  |. |0F84 E2000000 |JE Unpacked.004092AE 字符串到达\0就跳出) r# r% p+ g6 P, e. o- d9 O
004091CC  |. |8B4D 08       |MOV ECX,DWORD PTR SS:[EBP+8]
+ e1 c! O3 t  V5 e% Y" I! u0 H004091CF  |. |0FBE11        |MOVSX EDX,BYTE PTR DS:[ECX]     取第一个字节Q
( L* {6 a1 K- S/ C1 L2 v004091D2  |. |83FA 0A       |CMP EDX,0A                                判断是否是空格
8 |7 h) L. g6 }  u5 x0 w0 g6 T004091D5  |. |75 21         |JNZ SHORT Unpacked.004091F8
7 E' |1 J9 [/ }& Q) m* C0 i2 L4 }2 H004091D7  |. |8B45 E8       |MOV EAX,DWORD PTR SS:[EBP-18]- L; t- H, f8 x/ w9 d
004091DA  |. |8945 0C       |MOV DWORD PTR SS:[EBP+C],EAX
4 t: J9 C& A/ z6 m9 e" e# O3 t: `004091DD  |. |6A 00         |PUSH 0                                  ; /Arg1 = 000000007 F; e5 F" b! R) F+ m' k. v
004091DF  |. |8B4D F8       |MOV ECX,DWORD PTR SS:[EBP-8]            ; |9 C! a7 Z& i9 ~( J* \4 q& \& W
004091E2  |. |E8 C9A7FFFF   |CALL Unpacked.004039B0                  ; \Unpacked.004039B0
  G# {/ @! D# t5 A004091E7  |. |0345 10       |ADD EAX,DWORD PTR SS:[EBP+10]
1 i6 e! e! _# }( X  [; _0 |4 A004091EA  |. |8945 10       |MOV DWORD PTR SS:[EBP+10],EAX
2 J7 |; m  m2 ~% d004091ED  |. |8B4D 08       |MOV ECX,DWORD PTR SS:[EBP+8]
1 [9 K  h  k2 w004091F0  |. |83C1 01       |ADD ECX,1* {4 r- D- J/ [: `3 h
004091F3  |. |894D 08       |MOV DWORD PTR SS:[EBP+8],ECX1 V" j9 x9 n& I6 @5 Y7 S
004091F6  |.^ EB C6         |JMP SHORT Unpacked.004091BE
( ?& Z$ G' X1 R! Q6 O' x5 g004091F8  |> |8B55 08       |MOV EDX,DWORD PTR SS:[EBP+8]  不是的空格跳到这里1 P, B% A- q1 L0 T
004091FB  |. |0FBE02        |MOVSX EAX,BYTE PTR DS:[EDX]         把Q给EAX  (实现双字节 就要让他取WORD  这里需要改造)
6 K5 m* ^5 P5 X4 C" G% g# E004091FE  |. |8945 C0       |MOV DWORD PTR SS:[EBP-40],EAX  把Q 放到参数中去
) D; I1 N6 o- E2 `  H( ]" N6 q00409201  |. |8D4D D8       |LEA ECX,DWORD PTR SS:[EBP-28]
: T3 T0 c9 ]  E) l' z1 ]; ~- a, \- O00409204  |. |51            |PUSH ECX                                ; /Arg2
# ?. z* s! ?# [5 y5 R. v00409205  |. |8B55 C0       |MOV EDX,DWORD PTR SS:[EBP-40]           ; |
8 }/ P1 B5 _% h1 j4 U( F0 c; b00409208  |. |52            |PUSH EDX                                ; |Arg1    压入Q
4 t) \" {+ n6 g8 Q5 \+ [& Y00409209  |. |8B4D F8       |MOV ECX,DWORD PTR SS:[EBP-8]            ; |
1 L; h! A$ C) ^# w8 T9 i2 e$ A1 _, r" s0040920C  |. |E8 0FB4FFFF   |CALL Unpacked.00404620                  ;  \Unpacked.00404620     这里是关键
0 B- Y6 e9 k3 f' B9 I3 e. A00409211  |. |8B45 08       |MOV EAX,DWORD PTR SS:[EBP+8]
" J' y6 _$ S& G# C( R00409214  |. |83C0 01       |ADD EAX,1                             读完Q后读u
* Z0 C* T1 ?4 ?* h" `% J7 z9 J2 H00409217  |. |8945 08       |MOV DWORD PTR SS:[EBP+8],EAX8 [, W7 s* {4 K
0040921A  |. |8D4D D8       |LEA ECX,DWORD PTR SS:[EBP-28]
+ W; y- X( o# l( w( V) I+ g, |. l* B0040921D  |. |E8 5E8BFFFF   |CALL Unpacked.00401D80          这里存入了画Q需要的长度- M4 n) |4 ^) n; U/ J+ A
00409222  |. |8945 D4       |MOV DWORD PTR SS:[EBP-2C],EAX/ Y, z$ F! @4 G
00409225  |. |837D D4 00    |CMP DWORD PTR SS:[EBP-2C],0
' Y4 C5 n  S& i: l5 [00409229  |. |74 7E         |JE SHORT Unpacked.004092A9; L; f! a0 {9 i

. m" S  v' M( M% x0 T1 G; ~7 x0 Q8 g: G9 v& u# d
4 ]  H4 N/ S( }. P: D3 J
+ A5 w) ?1 E! p5 W
8 f! y; M! _8 X* ?
. q7 l8 i* {) u# i6 Y/ q
00404620  /$  55            PUSH EBP
, N$ H2 }) k$ H0 c00404621  |.  8BEC          MOV EBP,ESP, W' o4 F. R3 j2 z7 o! a- W
00404623  |.  83EC 0C       SUB ESP,0C
  c! g- r* x3 i) L4 V& \* B" i! u00404626  |.  894D F4       MOV DWORD PTR SS:[EBP-C],ECX        
  E* h! I: I# F. \$ x# r" U5 ?& K00404629  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
" j/ l' a- J/ q- I( x3 t0040462C  |.  8B48 14       MOV ECX,DWORD PTR DS:[EAX+14]
. y* R, \- B* h# _3 i" O! l0040462F  |.  894D FC       MOV DWORD PTR SS:[EBP-4],ECX
4 q+ @% h/ Z( L) m- ^$ s9 S4 o- Z00404632  |.  837D 08 00    CMP DWORD PTR SS:[EBP+8],0        这里就是边界检查  X; _" d9 u  y- M
00404636  |.  7D 0D         JGE SHORT Unpacked.00404645, m* Q) u6 L$ \+ A
00404638  |.  8A55 08       MOV DL,BYTE PTR SS:[EBP+8]; ^4 x6 l+ y; E6 ]
0040463B  |.  8855 FB       MOV BYTE PTR SS:[EBP-5],DL
9 x" n4 ?8 L% x0040463E  |.  0FB645 FB     MOVZX EAX,BYTE PTR SS:[EBP-5]
! R, b" ~/ l  k, Q" ^4 g/ ]5 c00404642  |.  8945 08       MOV DWORD PTR SS:[EBP+8],EAX( v  g  l7 W( J( L& j2 W3 f
00404645  |>  817D 08 00010>CMP DWORD PTR SS:[EBP+8],100         边界检查7 {- E8 V* V# r
0040464C  |.  7D 18         JGE SHORT Unpacked.00404666, F1 {: Z* _# P/ _; y# i. w
0040464E  |.  8B4D 08       MOV ECX,DWORD PTR SS:[EBP+8]  `$ c+ q9 D  k9 S
00404651  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
3 r9 O2 ]* K1 t00404654  |.  8B448A 18     MOV EAX,DWORD PTR DS:[EDX+ECX*4+18]+ D* R& M7 E" J4 K" F
00404658  |.  6BC0 14       IMUL EAX,EAX,14
  g4 D* b- o( {+ y: ]" L1 d0040465B  |.  8B4D F4       MOV ECX,DWORD PTR SS:[EBP-C]
) o7 X; u0 \' {/ ]0 y0040465E  |.  0341 14       ADD EAX,DWORD PTR DS:[ECX+14]
+ `' h2 w# y, b2 X3 m00404661  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX0 O, ]0 ^( _: i; f8 I6 ^& e
00404664  |.  EB 15         JMP SHORT Unpacked.0040467B
+ e: J/ u3 \  X+ X. ]$ E00404666  |>  8B55 08       MOV EDX,DWORD PTR SS:[EBP+8]     这里一块是算Q的码表, u6 T: K& @, |+ `$ g) j  N# S

! L% k8 |1 f# ]8 f5 }3 Z# `1 v
- y5 j3 y  O( K
! a+ k4 C! L# \; ^. U& {; Y& A0054AA48  51 00 00 00 2D 02 00 00 00 00 00 00 3C 02 00 00  Q...-......<..9 f& t6 t7 `; z8 q
0054AA58  1B 00 00 00                                      ...
. L) m: L0 R/ @) }' I5 F0 |: G$ s
51就是字符Q
) \0 ^% k4 p+ K" D3 h8 y2D 02 00 00
, b9 x3 o( t) M7 R9 S00 00 00 00
8 T# r# b# m% z/ d1 U" A  \3C 02 00 00( p5 X. o* i/ A: P0 p2 G3 ]8 a
1B 00 00 00
# T# R& [* M6 N8 i6 }2 g
2 Y8 n+ a3 p3 c/ H) {8 ^( t) T        A━━┓ ' [) r- F, n) |. f
       ┃  Q ┃  
+ g& B/ s1 U) \' C       ┗━━B
' ?( E3 Z' s  W0 u- g- X& u4 Y$ G, Z# ~+ d- \+ P, a
A的坐标  (22D,0): b3 K) J  B, k
B的坐标  (23C,1B)
3 ~, u4 t- v6 q: z0 G: k' U5 W* ?
* E- f) A5 A" b2 X0 c# x- I( b
" Z6 I2 a: q' I# x4 c+ {
00404669  |.  81E2 FF7F0000 AND EDX,7FFF
$ r9 [$ K. `( X  [& ~1 X- g- ?0040466F  |.  6BD2 14       IMUL EDX,EDX,14
' c1 B. l' }5 e9 C3 Z& K/ K00404672  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
; m* C8 S4 n4 c' r' ~5 W% F  u6 k00404675  |.  0350 14       ADD EDX,DWORD PTR DS:[EAX+14]( a% _# D" F+ B) y1 L
00404678  |.  8955 FC       MOV DWORD PTR SS:[EBP-4],EDX
( d& D, C3 s0 F7 _0 C6 c: ]0040467B  |>  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]( b& W' X: L. C( R
0040467E  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
/ s+ W3 W" D7 q7 R00404681  |.  8B42 04       MOV EAX,DWORD PTR DS:[EDX+4]# u: H# F- g1 L% v: S1 F( U& o, _% {2 w% l
00404684  |.  8901          MOV DWORD PTR DS:[ECX],EAX        存入22D
  \# I' Y! s- C5 \" h: B) D00404686  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]# h6 g3 Y; j9 C. f1 n' L
00404689  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]' P3 z# m% P/ p- p) |/ n8 t+ Z( d
0040468C  |.  8B42 0C       MOV EAX,DWORD PTR DS:[EDX+C]1 |4 Q1 Y% f( ]3 G2 u1 M: H
0040468F  |.  8941 08       MOV DWORD PTR DS:[ECX+8],EAX   存入23C
1 B' J5 \7 M# c& z0 Q4 |# ?3 U00404692  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]
* R( r! i6 m# X! A00404695  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]! E. D5 t8 U2 f! n
00404698  |.  8B42 08       MOV EAX,DWORD PTR DS:[EDX+8]
$ K3 t: B# S2 i6 ]6 L: P! r0 ~0040469B  |.  8941 04       MOV DWORD PTR DS:[ECX+4],EAX   存入0
2 t- q: a- |) G" v' r3 r# a: o5 v0040469E  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]
- c* k4 J* v) V* i3 ~% u004046A1  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]2 Y* n' E  \3 _' r4 J8 G
004046A4  |.  8B42 10       MOV EAX,DWORD PTR DS:[EDX+10]1 R8 g( G0 H1 r. n9 ]- a
004046A7  |.  8941 0C       MOV DWORD PTR DS:[ECX+C],EAX   存入1B" [5 J2 C% U  y8 R& x
004046AA  |.  8BE5          MOV ESP,EBP8 z2 v" t1 ~, v& |$ n: N
004046AC  |.  5D            POP EBP
0 u8 t; r6 d2 K* @" {4 S004046AD  \.  C2 0800       RETN 8
; C9 r8 f, V  j' K' `, i* N0 v) i$ |& V& X. Z

+ P1 h$ W  o% B; m
* w/ \/ d: g' W! a% r1 G8 R# N+ Y. {" P' `3 e' C  ?) L1 y: ^

; P: T0 [9 j' S, n3 [0 d- u$ |7 }2 P知道这些后 就可以改造了# w5 k" C# ~& S; C$ y) T
先改字库
% |! l$ g. u1 r/ C [attach]15479[/attach]
: ~$ `+ l' h0 T$ J- Y& x
+ }: t4 K% Y+ E! d3 f2 {. B然后改成支持汉字的$ M) _- ~2 O: g, y- i1 I
把4091d2 的 CMP EDX,0A   改成jmp( x6 e+ E; }* ~/ R; W0 M
跳到我的代码上去
8 a- S3 X4 p( D+ F! f: [7 g
: H* z& O8 N1 {5 z: ^" p# x; tAND EDX,0FF            去除高位的FF
2 D8 s% f( j7 v) }# j) y- s% nCMP EDX,0B0            比较是否汉字  跟比较80一样  因为我的字库是从 啊(B0 A1) 开始的! S( i8 X4 U/ l8 [7 \. H) A& t4 h
JL Unpacked.004091F8 小于 B0的就跳回去
2 c% ]2 [; Z7 \+ M) h1 F& d  hMOV EDX,DWORD PTR SS:[EBP+8]4 o0 B9 [4 }" X1 n1 r2 ~7 Y. ~1 Y0 j
MOVSX EAX,WORD PTR DS:[EDX]  取2个字节 (支持汉字): i4 ?( s- `5 Z/ R  N
AND EAX,0FFFF                                 去除汉字高位的FF
1 p8 H2 ^7 c6 e2 d2 r, PMOV DWORD PTR SS:[EBP-40],EAX   存入形参" l, a9 a2 u( H- n, v6 T; P* B: s
LEA ECX,DWORD PTR SS:[EBP-28]: o% @4 z0 g# k$ B" J0 N8 |6 W, x
PUSH ECX                                 ; /Arg2
% v  E: Y% f/ [. k/ O4 c1 LMOV EDX,DWORD PTR SS:[EBP-40]            ; |
8 L5 t3 I& @' J: b+ k/ o' BPUSH EDX                                 ; |Arg11 l: J; Y$ {1 N8 \- w7 c
MOV ECX,DWORD PTR SS:[EBP-8]             ; |4 m2 `: C- U4 d' w% D" z
CALL Unpacked.007CFF3C                   这里是读取并存入 字符串X Y坐标  ^/ e3 }8 d  V4 S# m
MOV EAX,DWORD PTR SS:[EBP+8]9 d( U2 r) _% \& n
ADD EAX,2                                            call出来后加2个字节
- o2 W9 D( d9 `, R5 x3 WJMP Unpacked.00409217" E) _& h& O$ T( l* A0 G2 |% f$ R

3 m: h( R# }9 C8 r3 b% P& D# x" ^% A, J, o) K: Q! `( F) t
7 J. L8 f( P# T

; |+ g- _  h9 M4 FPUSH EBP9 P  o4 j$ o7 A2 I5 h# Z# [$ U
MOV EBP,ESP2 g5 @3 T$ D7 d! h& f" I4 ~4 O
SUB ESP,0C5 [1 T5 X' l) |# Y7 \+ Z( L  }1 b3 _
MOV DWORD PTR SS:[EBP-C],ECX. q+ z/ ]" s: F2 z9 o
MOV EAX,DWORD PTR SS:[EBP-C]
: [/ {' i- P: v3 BMOV ECX,DWORD PTR DS:[EAX+14]
4 t! L1 D, e/ I  i  A5 TMOV DWORD PTR SS:[EBP-4],ECX
2 Q' Z, E6 M& y6 D1 ICMP DWORD PTR SS:[EBP+8],0F9D7       边界检查  我这里最后个文字是 座(D7 F9)' Q! p3 }* h! Y# D2 T$ I# S
JG SHORT Unpacked.007CFF8E             超出就绘制一个空白图片) p5 x# Q. k# ~/ n
MOV ECX,DWORD PTR SS:[EBP+8]       从形参读取汉字  把汉字 放入ecx (我这里代码写的乱)
# W5 H. v; w( Z; IXOR EAX,EAX8 Q$ o5 j( f  k$ O; z: w) W0 P
MOV AL,CL             把汉字第一个字节 放入eax1 m( l/ U) P, h0 [
SHR CX,8                右移8位取第二个字节5 D+ F. |, a- C+ h2 o
XOR EDX,EDX8 u6 p6 n9 a+ F
MOV DL,CL              把第2个字节放到edx去
4 f' z7 s7 Z1 _SUB AL,0B0              这里是我自己写的算法  不用再读取码表了
2 t$ L3 C) q/ v- ]; ]SUB DL,0A1
9 T2 l9 }$ A% V2 A. e% w6 {$ q/ b& TIMUL EAX,EAX,10      我用的 宋体16     一个汉字是16X16
4 |* @$ d8 s6 p5 Q; L2 gIMUL EDX,EDX,10: R; o. r9 N+ Q
ADD EAX,20               加上我图片原来的高度
9 V/ a9 p0 P7 k2 m' O) vMOV ECX,DWORD PTR SS:[EBP+C]# c& z$ k9 N8 C4 p
MOV DWORD PTR DS:[ECX],EDX) }- B7 R- [# p) o
MOV DWORD PTR DS:[ECX+4],EAX9 u% g- O$ Y4 z/ [' d% u' [  y3 ^
ADD EAX,10
' u& Z- a) Z% g- XADD EDX,10& L& C* q: p$ Q3 E7 I2 ?  D
MOV DWORD PTR DS:[ECX+8],EDX* P; S6 b2 |  M, v/ f2 \1 s/ u
MOV DWORD PTR DS:[ECX+C],EAX
  M% e% }4 i0 ^; K# o: K2 jMOV ESP,EBP
: U& O3 `% \; G5 S& Y& b; L, WPOP EBP2 Y3 [, R- B+ {: b. i+ W
RETN 8
' a9 L# [( G, _) \( K4 P
$ f( H0 x  t% `; g* `. c/ I) x
1 Q. E+ E: I4 i( {0 s' ~  e: ^ [attach]15480[/attach]
作者: shane007    时间: 2010-3-13 12:42
非常感谢这位朋友给我们写了一篇含金量非常高的好教程!
5 X  W+ M. ^) f* p2 y, h枫叶快给加威望吧。1 H8 w. g& ^" U6 A/ z0 b  N

/ M8 E( i/ P+ q/ y9 g如果可以的话请加入汉化技术人才库群,(群号71868514)。4 ~, Q3 q4 L9 m8 D1 B& d
感觉楼主是汉化老手了,可以介绍一下自己吗?
2 T! A  _+ B) A1 o. M2 }* O
; q/ k/ p3 a5 F在仔细研究过这个帖子之后我可能还会提一些问题,到时候请指教。- g# N3 J9 u. q( |7 H* L2 [9 H
论坛上还有一些需要汇编技术才能汉化的游戏,苦于缺乏这方面的人才,一直无法实现汉化。' r/ T9 r" }! Q; Z7 J
不知道楼主能否为论坛助一臂之力?
作者: 6875538348    时间: 2010-3-13 13:37
学习了一个小时感觉绝对精华帖~感谢cmou的教程!
作者: shane007    时间: 2010-3-13 13:44
引用第2楼6875538348于2010-03-13 13:37发表的  :2 i# g9 X0 V9 O, v9 b
学习了一个小时感觉绝对精华帖~感谢cmou的教程!

+ p: A5 p3 p% L( a! i5 `9 ~$ i5 ^是啊,枫叶给加精华吧。
作者: cmou    时间: 2010-3-13 13:52
其实这个算是入门级别的了(代码清晰易分析)[s:44]  
+ t/ \5 m! }) N" {7 |: W, v5 v我也就这点水平) \2 I* H9 m3 q+ s7 H
如果是点阵 涉及缓冲区的 那我只能跪了...
作者: shane007    时间: 2010-3-13 14:04
引用第4楼cmou于2010-03-13 13:52发表的  :$ M( f9 }' l* B5 ~" [
其实这个算是入门级别的了(代码清晰易分析)[s:44]  
) W& }% O! P2 _我也就这点水平5 @# T# s6 g$ F3 m3 l% H
如果是点阵 涉及缓冲区的 那我只能跪了...
# J+ u5 `4 G3 q$ z% N  c5 g
为了进一步学习,能否把你脱壳以后的文件传上来?
6 T4 o& U; m' o: Y& K最好有1个脱壳未修改版和一个1个脱壳后修改的版本,谢谢了!
8 G2 W- }% J, G+ m' e+ s0 h' u! C- e1 w9 L: c
我觉得你这样的水平已经很强了。好多细节我都不太明白,随后会提问的。. D, Z; U* R. n$ ?
想问一下,你能否忙研究一下静物2这个游戏?
; k) x* p6 Y1 a( e  k0 R  j主要是跟一下字库的结构,要是能有你这样的人才相助的话,感觉汉化就有望了。
  i" d/ h% K/ r字幕是utf-8的。
作者: 6875538348    时间: 2010-3-13 14:05
像那些解谜小游戏也有不少很不错的,cmou不妨有空试试看~) w# U+ W$ [: e1 [- \& [& q4 s
https://www.chinaavg.com/read.php?tid=20378&keyword=. ^: l  u7 B# U( @) i
https://www.chinaavg.com/read.php?tid=20506&keyword=2 \/ F  x) d& j( }& [; C; ]& |
https://www.chinaavg.com/read.php?tid=18298&fpage=2
4 B! ~; b6 V5 _$ r3 o1 y) f/ H$ bhttps://www.chinaavg.com/read.php?tid=18202
作者: shane007    时间: 2010-3-13 14:15
引用第6楼6875538348于2010-03-13 14:05发表的  :6 U7 J8 e: \, j9 y- B1 h9 v6 K
像那些解谜小游戏也有不少很不错的,cmou不妨有空试试看~* _0 E1 U7 r1 c9 J- B/ N9 E' Q& |
https://www.chinaavg.com/read.php?tid=20378&keyword=% O" |# w# g$ \  K8 b; |. Z
https://www.chinaavg.com/read.php?tid=20506&keyword=
) s- {: d  u0 w: y. _2 v  W. ehttps://www.chinaavg.com/read.php?tid=18298&fpage=2/ f5 A9 N  y9 m" N2 w
https://www.chinaavg.com/read.php?tid=18202

' l( n' d- d% r' a7 G# I让cmou搞小游戏就大才小用了,上面这些,如果不涉及汇编的话,都还比较容易的。
作者: 6875538348    时间: 2010-3-13 14:16
有道理,没事学学看~
作者: 6875538348    时间: 2010-3-13 14:18
感觉还是从小做起比较容易融入枯燥繁琐的汉化工作~
作者: shane007    时间: 2010-3-13 14:39
004F24D0  |>  8B01          /MOV EAX,DWORD PTR DS:[ECX]  这里是读取4字节 quit I_B%F#X)  4 W) g9 s: S" j: Z3 n0 W' M
004F24D2  |. |BA FFFEFE7E  |MOV EDX,7EFEFEFF    这里一块主要分析字符串是否已经到\\0* J- x8 x% ]9 ~4 m
004F24D7  |. |03D0          |ADD EDX,EAX
) V$ O1 g6 f$ J004F24D9  |. |83F0 FF      |XOR EAX,FFFFFFFF % j3 f# M) Y! n$ z+ Q7 T
004F24DC  |. |33C2          |XOR EAX,EDX   y, d+ P" t* r( r' [
004F24DE  |. |83C1 04      |ADD ECX,4      读取后面4个字节
: X" w+ p9 g9 f& }* @6 q004F24E1  |. |A9 00010181  |TEST EAX,81010100
) v1 e7 A' K2 z5 V+ a& b004F24E6  |.^ 74 E8        |JE SHORT Unpacked.004F24D0  如果是4个00(也就是81010100)就跳出 . q) G; n5 U& u! a1 n' L& Q

% z; @3 m$ z5 l这一段没看懂,7EFEFEFF   和\\0什么关系?
- O) E8 N4 t6 n" X0 w4个00和81010100又是什么关系?
作者: cmou    时间: 2010-3-13 18:50
取出4个字母放在EAX中- @' P% m6 M- p0 f1 V
EDX赋值为7EFEFEFF
2 f/ ]) @. K3 b1 r$ E5 Y4个字母的值加上7EFEFEFF
, w1 p9 @# N* t/ M/ d  g$ ~4个字母的值与FFFFFFFF异或) S' Y$ ]* c3 W- i. _) o
指向字符串的指针加4,即指向下4个字符
' _' D# Q9 [+ y& U( @2 u/ f3 c将4个字母计算的结果和81010100异或
: R0 b6 ]6 S# y( a+ r/ P7 i异或结果为零则跳到004F24D0去
! P# u# U2 I. y0 y6 a3 @: v* A  L# P* y' K6 ]
之前我说错了
作者: shane007    时间: 2010-6-15 23:16
顶上来
作者: 皮子陈    时间: 2010-6-16 15:12
都是牛人呀。我直接看不懂呀[s:69]
作者: canmover    时间: 2010-6-16 19:13
算Q的码表是从哪来的?
作者: shane007    时间: 2010-6-16 21:58
引用第14楼canmover于2010-06-16 19:13发表的 :
; m+ m' S; Z9 z  k算Q的码表是从哪来的?
6 J8 i& P! ^- d( Z, M  @5 x
8 X6 @& }% S7 @# f# ^' c8 ^
应该是写死在程序里,编译到exe里面的。
作者: shane007    时间: 2010-6-17 06:54
补上1张图片,可以很清楚地看到exe里的码表。
* r2 G  B$ N8 G" R. L* w [attach]16430[/attach]
作者: shane007    时间: 2010-6-27 22:48
顶上来
作者: cmou    时间: 2010-6-28 21:53
标题: 12345667899
我没有用它的码表
+ _& U! V& T8 F$ D6 q% [我直接做了1个3500字左右的图片替换掉了原来的
! `. n/ t9 x, d# ?8 V9 {( Q) }' s算法是固定的3 R$ o; g5 N* s5 _8 |& M

/ y7 R# |( M! f- p断2次 其中1个是处理回车键的
作者: cmou    时间: 2010-6-28 22:08
汉化一直没完成(翻译的人后来没联系了...)8 i! A0 W2 H( [

5 K/ H& ^5 F- Y5 q  c3 V3 z+ o2 y( v7 X; n' A3 @1 F2 w
附件发布2次都没成功 直接贴地址吧! G& O) T9 |( B: H  J6 w- ]9 `
cmou123.ys168.com
作者: shane007    时间: 2010-6-29 07:59
引用第19楼cmou于2010-06-28 22:08发表的 :
6 ^6 [; y$ R' L7 T汉化一直没完成(翻译的人后来没联系了...)
/ }; d4 O. L. v0 U  e" e& S& s2 {3 W2 c, K0 z
7 H2 o+ N- V, }4 j. Y# t, B+ [0 _. |3 }
附件发布2次都没成功 直接贴地址吧 $ _/ b. Q3 G1 L9 q$ ^8 a
cmou123.ys168.com

9 I- A/ i7 B0 e5 ~' }. L; vnide
9 t) u/ B* }' b5 V) ]: a
- f2 H2 ?; t. c( u1 l1 \! @% W谢谢你的最新信息,你能否为东方快车项目提供一点参考意见?
作者: ldd0212    时间: 2011-1-9 22:03
额滴神啊~完全看不懂。。。
作者: 似水流流年    时间: 2011-1-10 10:16
希望也能汉化一些这样超可爱的小游戏。让大家也能领略到汉化后轻易上手的娱乐小作的兴趣。




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2