冒险解谜游戏中文网 ChinaAVG

标题: 【汉化与汇编】单字节内核模拟程序(深绿请进) [打印本页]

作者: shane007    时间: 2009-10-8 17:41
标题: 【汉化与汇编】单字节内核模拟程序(深绿请进)
深绿,你好,有时间的话请帮忙制作一个单字节内核模拟程序。& s9 b* W+ ?- {4 f/ o# f' M' _- p

( q, M0 D- s1 z; t( R题目吓人,其实很简单。
( k4 d5 _: V: E5 R# x在程序里面设定一个固定中文字符串。: A0 K& v) ~- _. E& ^7 f& I+ q
然后按字节读取。小于0x80的字节输出到out.txt文件即可。& C7 P% e" [. R' W8 ~& v& y
5 _* Z, }# ^% u
这个程序模拟了单字节游戏后输出乱码的情况。( ^! W  N4 a( @8 R
接下去我们可以利用它进行汇编级研究。
作者: 深绿    时间: 2009-10-10 19:10
我稍微改了一下程序,包里面有个input.txt和output.txt$ A  |) |; O  M7 V) }+ z- S
先在input.txt里面写入字符串,然后运行程序,就会在output.txt里输出小于0x80的字节
( }  c  `$ O7 ?' Y: K. M; H! g+ c* x$ L; o. K
但是我有个疑问,汉字两个字节的机内码都是大于0x80的,这样如果原字节是纯中文的,不就没有字节被输出吗?
作者: shane007    时间: 2009-10-10 21:47
引用第1楼深绿于2009-10-10 19:10发表的  :" M( s) s0 d( X. }7 l) {/ Y& d
我稍微改了一下程序,包里面有个input.txt和output.txt+ p7 N1 R6 Z, }, F: @
先在input.txt里面写入字符串,然后运行程序,就会在output.txt里输出小于0x80的字节
  M3 n% e6 P3 s2 l3 i* J3 U/ B) H' r/ v4 i, }
但是我有个疑问,汉字两个字节的机内码都是大于0x80的,这样如果原字节是纯中文的,不就没有字节被输出吗?

- h& ?  p. g7 \  Z- a0 Y1 e2 z0 Z是的,如果输入字符串是中英混合的话,输出的内容就只留下英文了。( C5 p  g- ^; G6 M. L
这就模拟了汉化了文本以后,中文字符被过滤的情况。2 d' F5 a* S" T) V1 a8 V
7 q4 I$ H- V  d3 @
接下去就可以在汇编级用OD载入,开展研究了。1 Z' i, [$ \1 v6 f% y/ D
想办法把和0x80比较的地方去掉就行了。
作者: shane007    时间: 2009-10-10 21:51
看了代码,应该把ch<=128 改为 ch<128 吧?
作者: shane007    时间: 2009-10-10 22:02
由于这个程序很短,OD里面的汇编代码也很短。
! ?3 c2 k3 V: N4 M1 k% g' {/ e请看红色的部分,这就是和0x80比较的部分。
. s, z7 q: p: b8 O% Y# m把这2句NOP掉,然后保存修改后的文件为exe。
* o( |7 n* B! ?4 o$ s我们发现input.txt里面的所有内容都能被输出了。 8 ~: \. L1 S  P) K) _8 A$ q
附上修改后的exe.
' Z3 c/ ^: w# d) E& a深绿,你可以把这个操作过程试一下,练习一下. 5 }; i. C! w$ c' ]+ J1 w+ s" y
: g. u" i$ H# A  H) a7 ^
00401000  /$  55            push    ebp % }( C# R( T- Q# w1 w5 Y% @
00401001  |.  89E5          mov    ebp, esp 6 d/ y; Z) C5 [& r' R1 p3 O+ M' O
00401003  |.  83EC 18      sub    esp, 18
& p# r& B1 x7 a* t6 }00401006  |.  C745 FC 00000>mov    dword ptr [ebp-4], 0 . M, O1 T( q2 I2 B
0040100D  |.  83C4 F4      add    esp, -0C # O  t  ?/ m3 `& l8 n
00401010  |.  8D45 FC      lea    eax, dword ptr [ebp-4] . f& Q- U% O0 P: b  q+ D
00401013  |.  50            push    eax
/ @/ }4 U" ~8 g" f0 C00401014  |.  FF35 08204000 push    dword ptr [402008] - S# R5 |1 W2 w) Z5 J) n
0040101A  |.  8D45 F8      lea    eax, dword ptr [ebp-8]
% w. _" p" \4 q5 |6 K. j/ A" s0040101D  |.  50            push    eax
* ]. M  w, V  l; `; O0040101E  |.  68 04204000  push    00402004
' ]1 d- l6 u2 Q- I00401023  |.  68 00204000  push    00402000 ) E( W. K6 r+ ^( U
00401028  |.  E8 EB030000  call    <jmp.&msvcrt.__getmainargs>
! W# m8 {4 s4 C% t0040102D  |.  C9            leave
2 D7 a% k0 U+ ~0040102E  \\.  C3            retn
3 |: G; W8 {$ a4 }4 u3 D  w7 L0040102F      90            nop
$ v: M$ N/ a' y; S0 ?00401030  /$  55            push    ebp
- K; p1 P0 x4 {* j" ]00401031  |.  89E5          mov    ebp, esp + X, W: @4 |) ]4 O$ m; O
00401033  |.  83EC 08      sub    esp, 8
2 E" |2 x) }, X2 O00401036  |.  8B15 0C204000 mov    edx, dword ptr [40200C]   E+ Q. Y8 Y0 Q0 q3 Z
0040103C  |.  85D2          test    edx, edx
( L+ u& F: I$ E& h* Z0040103E  |.  74 7B        je      short 004010BB
* a+ H  Y, U' v1 Q: f; k+ H00401040  |.  A1 AC304000  mov    eax, dword ptr [<&msvcrt._fmode>> * ^! M- c: x) B- R- ~4 l3 ~3 n
00401045  |.  8910          mov    dword ptr [eax], edx
& f) w- }" B* Z4 x8 w00401047  |.  A1 B4304000  mov    eax, dword ptr [<&msvcrt._iob>]
$ P9 d# ]0 s. T3 i% u8 t1 s0040104C  |.  85C0          test    eax, eax
; f; H" `9 d/ s- A0040104E  |.  74 1E        je      short 0040106E " D' G/ d0 i. w7 z
00401050  |.  83C4 F8      add    esp, -8 8 h/ V# |8 e0 A0 s- d
00401053  |.  FF35 0C204000 push    dword ptr [40200C] % h: F# y' C; @9 {# X
00401059  |.  83C4 F4      add    esp, -0C & ?9 M, L) |* \; |8 e
0040105C  |.  50            push    eax                              ; /pstream => offset msvcrt._iob * b' k7 N5 k* l+ u5 s2 W
0040105D  |.  E8 A6030000  call    <jmp.&msvcrt._fileno>            ; \\_fileno ! x4 h) X8 S* M8 B  @6 z, |+ j8 F
00401062  |.  83C4 10      add    esp, 10
' u4 q' D. h+ ~* w. U00401065  |.  50            push    eax                              ; |handle ( X! P- a$ S/ ^* K+ U5 `
00401066  |.  E8 A5030000  call    <jmp.&msvcrt._setmode>          ; \\_setmode * W9 \  s+ P& t& g1 Q4 ^
0040106B  |.  83C4 10      add    esp, 10
2 H' S5 J, p  G* N1 ~0040106E  |>  A1 B4304000  mov    eax, dword ptr [<&msvcrt._iob>]
' R! M# p! j2 a  g6 Y3 o+ A0 g00401073  |.  83C0 20      add    eax, 20
+ f$ X& q4 M' z  }8 F. s- `00401076  |.  74 1E        je      short 00401096 0 _$ }+ r8 O: I* m- _
00401078  |.  83C4 F8      add    esp, -8 % f& v# N8 K+ G, `; G" u
0040107B  |.  FF35 0C204000 push    dword ptr [40200C] & T" W6 B( B4 W6 |: J
00401081  |.  83C4 F4      add    esp, -0C
( M/ K$ \/ w4 a$ T) J1 B00401084  |.  50            push    eax                              ; /pstream
  p; J4 t' A3 j. m2 F8 {$ K7 o) B, D00401085  |.  E8 7E030000  call    <jmp.&msvcrt._fileno>            ; \\_fileno
) W5 f0 v4 X3 `3 f& q; B* D" f! ?0040108A  |.  83C4 10      add    esp, 10 ) Q" s9 z. q: V6 J% Q  W
0040108D  |.  50            push    eax                              ; |handle
; h. C! M# v0 }4 j3 Q( y0040108E  |.  E8 7D030000  call    <jmp.&msvcrt._setmode>          ; \\_setmode
+ m. u) ?4 q3 b  z, S00401093  |.  83C4 10      add    esp, 10
" O3 h/ p+ T9 C5 |( f- v8 e00401096  |>  A1 B4304000  mov    eax, dword ptr [<&msvcrt._iob>] 3 s% X3 ?; G2 M6 j$ C7 V
0040109B  |.  83C0 40      add    eax, 40
3 x# t4 S; o: J" `" [9 D0040109E  |.  74 1B        je      short 004010BB % U. |3 x  m- @, Y! `, v" F# z
004010A0  |.  83C4 F8      add    esp, -8
( b8 p3 p; f$ ^6 i: O- f004010A3  |.  FF35 0C204000 push    dword ptr [40200C] 7 d& K: g2 A0 S1 R8 A
004010A9  |.  83C4 F4      add    esp, -0C
/ Y( x3 p# T! c: g% J* h004010AC  |.  50            push    eax                              ; /pstream
1 H& W7 d8 e2 x/ }2 r004010AD  |.  E8 56030000  call    <jmp.&msvcrt._fileno>            ; \\_fileno 9 `; d! l6 i- t' I2 L! `
004010B2  |.  83C4 10      add    esp, 10 / H5 C1 @  J- L' M+ a& U4 p$ b
004010B5  |.  50            push    eax                              ; |handle
; O4 s$ j0 }! s2 ~* y004010B6  |.  E8 55030000  call    <jmp.&msvcrt._setmode>          ; \\_setmode
4 T& [  k4 R1 I1 G; l6 r004010BB  |>  C9            leave
" I2 I  Q9 s1 V: X( n' e: r& `4 m004010BC  \\.  C3            retn ( s. @. U) _" o$ n4 }& Z
004010BD      8D76 00      lea    esi, dword ptr [esi]
: s, B2 d6 W3 Q2 V& ]004010C0  /.  55            push    ebp
, [- l# ]! |8 M# m7 o8 N. e4 x- Q1 B004010C1  |.  89E5          mov    ebp, esp
2 |9 T, E1 r+ ]$ m% H004010C3  |.  83EC 10      sub    esp, 10 $ j2 N5 X: z% s
004010C6  |.  56            push    esi
  t% C! _, u/ R  y! R! V004010C7  |.  53            push    ebx ' k  ~5 ^& A3 o- c
004010C8  |.  8B45 08      mov    eax, dword ptr [ebp+8]
; h9 E; W9 M& o4 g* n& C! Z4 ^004010CB  |.  31DB          xor    ebx, ebx
+ `: H* B, r6 Q004010CD  |.  31F6          xor    esi, esi
0 E  ~% m0 H  o004010CF  |.  8B00          mov    eax, dword ptr [eax]
$ y' e3 L  x! y! W$ e! W004010D1  |.  8B00          mov    eax, dword ptr [eax]
: Z1 a# p" H2 _0 M004010D3  |.  3D 910000C0  cmp    eax, C0000091 5 r" `5 Y$ C' n+ m" E
004010D8  |.  77 16        ja      short 004010F0
) ^2 z4 H3 v. \7 d% k004010DA  |.  3D 8D0000C0  cmp    eax, C000008D
) j6 ^7 _# z  |/ n+ T7 @, f004010DF  |.  73 4F        jnb    short 00401130
% }8 @! T% F3 l! ~1 n5 E004010E1  |.  3D 050000C0  cmp    eax, C0000005
2 r8 g  z! W* e1 W' g004010E6  |.  74 18        je      short 00401100
0 \" ~1 M$ k  G  \% p) q2 t1 {/ ^, r004010E8  |.  E9 86000000  jmp    00401173
( f0 s. s9 M, a" b9 L0 H3 o$ j004010ED  |  8D76 00      lea    esi, dword ptr [esi] ! [6 f! |- {6 @8 s) ]
004010F0  |>  3D 930000C0  cmp    eax, C0000093
8 ]4 P4 d9 o2 t( `( [4 t004010F5  |.  74 39        je      short 00401130 3 X& w2 c8 |0 A0 u) r4 x# o
004010F7  |.  3D 940000C0  cmp    eax, C0000094
' _; I$ |3 _- T7 ~' K) k& r7 X) ?004010FC  |.  74 37        je      short 00401135
" y( e/ R" a* f9 y& L1 c. Z( f004010FE  |.  EB 73        jmp    short 00401173
0 M! @& w9 C/ r4 q00401100  |>  83C4 F8      add    esp, -8
2 x, k; b# ~$ @$ |* N3 O00401103  |.  6A 00        push    0                                ; /func = NULL
1 F* s7 }0 r0 |9 B" ^0 o; ]00401105  |.  6A 0B        push    0B                              ; |sig = SIGSEGV
: R/ j7 p. V  G00401107  |.  E8 F4020000  call    <jmp.&msvcrt.signal>            ; \\signal
* Z$ [9 \' d& s0040110C  |.  83C4 10      add    esp, 10
- ~9 d0 p" s) u6 Y0040110F  |.  83F8 01      cmp    eax, 1
% P6 Z. k6 i+ u1 |/ e1 A' _00401112  |.  75 0E        jnz    short 00401122 3 Y- a' G% k# e! E
00401114  |.  83C4 F8      add    esp, -8
+ c/ ]1 l& ]$ O( G! }. t* ^5 }00401117  |.  6A 01        push    1                                ; /func = 00000001 3 [6 \* F& q5 b/ o
00401119  |.  6A 0B        push    0B                              ; |sig = SIGSEGV
" V: `$ \8 h5 ?+ i4 k  p/ o0040111B  |.  E8 E0020000  call    <jmp.&msvcrt.signal>            ; \\signal
" v' T/ O+ c0 j) Y00401120  |.  EB 4C        jmp    short 0040116E 4 j& Q5 W* p0 R; Q& k
00401122  |>  85C0          test    eax, eax % `% s5 l' X4 s0 ^. y6 F% A) E+ |! j/ D
00401124  |.  74 4D        je      short 00401173   b& B  B9 k( I* L* h5 }9 \' y7 @! J
00401126  |.  83C4 F4      add    esp, -0C ( A" \: @' H6 M, H
00401129  |.  6A 0B        push    0B
4 v+ M/ X9 A% o0040112B  |.  EB 3F        jmp    short 0040116C
5 ^( k; }: h" {0040112D  |  8D76 00      lea    esi, dword ptr [esi]
6 s: n8 S* r. u9 r  O( `4 [/ A% a00401130  |>  BE 01000000  mov    esi, 1
0 w' [. \' t0 Z3 F2 a$ F6 |00401135  |>  83C4 F8      add    esp, -8
1 f$ C. g0 C& _00401138  |.  6A 00        push    0                                ; /func = NULL , X# L; u" }1 `5 y: `& o; ]
0040113A  |.  6A 08        push    8                                ; |sig = SIGFPE # Y7 _" Z5 P7 m1 T
0040113C  |.  E8 BF020000  call    <jmp.&msvcrt.signal>            ; \\signal
: r2 X1 W  E9 _+ S6 f" J00401141  |.  83C4 10      add    esp, 10 ' n4 U6 S( G3 Z2 u9 G
00401144  |.  83F8 01      cmp    eax, 1 ) s5 }  F* a2 ^" A
00401147  |.  75 1A        jnz    short 00401163
( R9 c! ~8 U( G: d8 w! L8 w00401149  |.  83C4 F8      add    esp, -8
6 o5 Y- b1 t# S0040114C  |.  6A 01        push    1                                ; /func = 00000001 2 [# Y8 v$ H; T) ]) r( }
0040114E  |.  6A 08        push    8                                ; |sig = SIGFPE ; I5 P. |, d+ d; z4 l) m5 @3 F0 n
00401150  |.  E8 AB020000  call    <jmp.&msvcrt.signal>            ; \\signal ) i# n9 v$ k/ I' G3 s" C! }
00401155  |.  83C4 10      add    esp, 10 ) }( K$ ~7 i2 ~1 i  ]/ z
00401158  |.  85F6          test    esi, esi ( f) g# j) O" t5 Y
0040115A  |.  74 12        je      short 0040116E
2 h. k! J& R$ L0040115C  |.  E8 97020000  call    <jmp.&msvcrt._fpreset>          ; [_fpreset $ s4 M: n' T  \! r& d9 g: S
00401161  |.  EB 0B        jmp    short 0040116E 9 H" ~, }5 d( Q+ Z2 F# ?* ]
00401163  |>  85C0          test    eax, eax % D) `  ^! V; P% x' O9 M3 }
00401165  |.  74 0C        je      short 00401173
0 u$ h0 x6 k  S" ^  P0 s" }00401167  |.  83C4 F4      add    esp, -0C ! a; n/ C" M  v  u! F
0040116A  |.  6A 08        push    8 7 G5 T0 R2 h8 L: ~5 c6 r
0040116C  |>  FFD0          call    eax
; N$ }7 L9 I4 |0040116E  |>  BB FFFFFFFF  mov    ebx, -1
1 @* B% r' i2 _* ]/ z00401173  |>  89D8          mov    eax, ebx 3 A# a- [6 _" ]5 ~- k
00401175  |.  8D65 E8      lea    esp, dword ptr [ebp-18] 4 @4 v& D/ w$ Z9 {0 n% e
00401178  |.  5B            pop    ebx / e) L" r3 B: r+ M2 C0 H: T: j
00401179  |.  5E            pop    esi 0 l. i7 t$ D# |
0040117A  |.  C9            leave
  V+ O" Z  ^! N# u" V0040117B  \\.  C2 0400      retn    4
/ j: h3 A/ ~) F- Q* P: o3 _0040117E      89F6          mov    esi, esi
# e/ K7 z1 x( A: ^* }& f00401180  /$  55            push    ebp
; C6 K) w2 h. H! R0 ^00401181  |.  89E5          mov    ebp, esp
- [% e5 N$ j& m6 s, y8 X* o: [00401183  |.  83EC 14      sub    esp, 14
9 u. r) a  R0 A+ ?00401186  |.  53            push    ebx ' J7 s( G' @. y! R+ G
00401187  |.  83C4 F4      add    esp, -0C ) B0 _) S9 d& A+ {2 M" z  K! O; Z
0040118A  |.  68 C0104000  push    004010C0                        ; /pTopLevelFilter = engoutpu.004010C0
- Q! G5 }" k5 W$ e' K  y3 y8 J/ _0040118F  |.  E8 B4020000  call    <jmp.&KERNEL32.SetUnhandledExcep>; \\SetUnhandledExceptionFilter
8 d/ @. ~0 S6 ]: V4 h00401194  |.  83C4 FC      add    esp, -4 4 n& j, o# U( r- Y- l7 m& {- \7 Z
00401197  |.  E8 5C020000  call    <jmp.&msvcrt._fpreset>          ; [_fpreset
# J5 Y3 ?( F" u. e& H* j' \0040119C  |.  E8 5FFEFFFF  call    00401000
! h( F# n9 W7 _1 l0 N' D' E004011A1  |.  E8 8AFEFFFF  call    00401030 . F% N' \/ q' @% _
004011A6  |.  83C4 FC      add    esp, -4
' Y/ ^4 o3 B, v$ ?- E+ B7 T004011A9  |.  E8 42020000  call    <jmp.&msvcrt.__p__environ>
8 l( w, }' T  q* E' R2 k004011AE  |.  FF30          push    dword ptr [eax]
% Y) Z5 R/ C5 n# l. b* o4 @004011B0  |.  FF35 04204000 push    dword ptr [402004] 7 K- o: M$ p1 k0 W
004011B6  |.  FF35 00204000 push    dword ptr [402000] ) T% S" R2 F' K+ P
004011BC  |.  E8 AB000000  call    0040126C
7 e4 C* K* F3 B004011C1  |.  89C3          mov    ebx, eax
" F8 N8 _) v. L' k" {4 V6 B5 _004011C3  |.  83C4 20      add    esp, 20 9 Y9 \  E+ F' l5 ?, r4 B
004011C6  |.  E8 1D020000  call    <jmp.&msvcrt._cexit>            ; [msvcrt._cexit 3 A' m  t  G5 V! X
004011CB  |.  83C4 F4      add    esp, -0C
; Y) p. \3 B9 c' S. C004011CE  |.  53            push    ebx                              ; /ExitCode
3 x. N8 H  [7 L! ~004011CF  \\.  E8 7C020000  call    <jmp.&KERNEL32.ExitProcess>      ; \\ExitProcess * `5 y3 L9 g+ U/ k% k9 ]
004011D4 >/$  55            push    ebp 3 B3 h$ m9 y! Q' F& }5 v
004011D5  |.  89E5          mov    ebp, esp ; b; _% g! h* z8 {
004011D7  |.  83EC 08      sub    esp, 8 6 O' ?6 s5 l% m6 ~) A) ^3 q7 Z  ]* c
004011DA  |.  83C4 F4      add    esp, -0C ! _" z  W8 ]+ h1 m
004011DD  |.  6A 01        push    1 1 N, s* U) x* x$ B
004011DF  |.  A1 DC304000  mov    eax, dword ptr [<&msvcrt.__set_a> ; t- N" d2 g  J8 c6 L- r
004011E4  |.  FFD0          call    eax                              ;  <&msvcrt.__set_app_type> * x, J! G* M+ E+ C9 \4 F$ }: U
004011E6  |.  E8 95FFFFFF  call    00401180
, ^9 t! a: i' H$ M004011EB  |.  31C0          xor    eax, eax
& f0 o2 A) d6 U0 l004011ED  |.  C9            leave   U( [  _" M! [0 g% r+ y+ V7 b
004011EE  \\.  C3            retn
: H) Y7 b" P9 U. Y- ~004011EF      90            nop 3 a9 k. p. R$ @! l6 `
004011F0  /.  55            push    ebp - f+ T, m) y- w$ ~# y5 _
004011F1  |.  89E5          mov    ebp, esp
8 p+ c% Z: w% ^. |4 l) B5 G# j5 @004011F3  |.  83EC 08      sub    esp, 8 6 K9 C$ U" q2 K2 a; z
004011F6  |.  83C4 F4      add    esp, -0C % b4 h/ e8 Q2 ?$ y! q
004011F9  |.  6A 02        push    2 - t) z! |( T- t
004011FB  |.  A1 DC304000  mov    eax, dword ptr [<&msvcrt.__set_a> : O5 H# B& ]9 ^5 G
00401200  |.  FFD0          call    eax                              ;  <&msvcrt.__set_app_type>
2 U( }# J3 Y: Y" C% C1 h1 N& S00401202  |.  E8 79FFFFFF  call    00401180
5 o( V8 \8 W0 K. k0 _: f! i; H00401207  |.  C9            leave
* ?( @5 a7 H; @& P00401208  \\.  C3            retn
1 w, |3 N2 H' v5 |00401209      00            db      00 ( o- K& C. w) F! g
0040120A      00            db      00 3 D+ G; t/ P8 E9 ]( y
0040120B      00            db      00
9 T+ D% O/ d0 b1 \( a2 H0040120C      00            db      00 6 ^% T2 o% \; _- O
0040120D      00            db      00
" `6 f( Z1 k" o: m0040120E      00            db      00 ; Q# t6 t9 q/ e5 k! ~7 e- o$ R
0040120F      00            db      00
$ [4 k5 A+ b% L9 g, i" p00401210      72            db      72                              ;  CHAR 'r'
3 o5 _/ e  m* V6 C4 T9 n00401211      00            db      00
, x9 H. Y- H$ X2 B9 r6 B00401212  .  69 6E 70 75 7>ascii  "input.txt",0
/ @7 [  R, c# P% A5 ?" p0040121C  .  43 61 6E 27 7>ascii  "Can't Find input" : @8 y- E% [: V& k
0040122C  .  2E 74 78 74 2>ascii  ".txt!",0 / w. g3 \  m' z9 E3 |8 j! ~
00401232      77            db      77                              ;  CHAR 'w' : C0 S2 C& o9 \, W( _
00401233      00            db      00
, M% i! L- Q- F" H! s00401234  .  6F 75 74 70 7>ascii  "output.txt",0
" E' {' P2 c2 d& B  o0040123F  .  43 61 6E 27 7>ascii  "Can't Create out" 6 H( N# a( q4 B
0040124F  .  70 75 74 2E 7>ascii  "put.txt!",0
7 e. ~# q; \; d. g& V( G6 |) B00401258  .  6F 6E 65 20 6>ascii  "one char outpute" % n8 n/ u9 p# B7 n1 @3 s
00401268  .  64 0A 00      ascii  "d ; H6 f$ _  t& X! G8 y
",0
' \& @) B: I7 z/ T' G0040126B      90            nop 8 ^8 P, j# d0 B8 v2 Y
0040126C  /$  55            push    ebp " ]: c$ W8 q1 J+ T3 l
0040126D  |.  89E5          mov    ebp, esp
9 E8 ]6 c" H1 e5 z' K0040126F  |.  83EC 18      sub    esp, 18
) D6 ]7 w% z9 Z# f00401272  |.  E8 39010000  call    004013B0 % a  y! q/ I) l! f! U- a
00401277  |.  83C4 F8      add    esp, -8
0 S8 i& w9 u$ x; q0040127A  |.  68 10124000  push    00401210                        ; /mode = "r"
, ~: I% j1 g. E& p5 J9 Z0040127F  |.  68 12124000  push    00401212                        ; |path = "input.txt"
: t/ s7 ?! U. N* U4 O( @00401284  |.  E8 AF010000  call    <jmp.&msvcrt.fopen>              ; \\fopen - ?" W1 u$ _. H9 A! S' z, k2 p/ R
00401289  |.  83C4 10      add    esp, 10
6 z' I, s) n2 M/ P4 Q0040128C  |.  89C0          mov    eax, eax
9 k% x3 N, C! t# U0040128E  |.  8945 FC      mov    dword ptr [ebp-4], eax
- U/ D5 u" g$ F5 g& ~5 Q6 K- k00401291  |.  837D FC 00    cmp    dword ptr [ebp-4], 0 2 Q+ _& F4 G3 z& w! ~4 [- |
00401295  |.  75 10        jnz    short 004012A7 ; e' m: E0 F# o. I4 C; L# w
00401297  |.  83C4 F4      add    esp, -0C ! c# @% p/ T) w3 ^! [5 q% j, d7 o- z  N
0040129A  |.  68 1C124000  push    0040121C                        ; /format = "Can't Find input.txt!"
: Z) z) `; ~+ z' L; w0040129F  |.  E8 8C010000  call    <jmp.&msvcrt.printf>            ; \\printf
& J5 J7 u1 ]% F, h( \6 [# T004012A4  |.  83C4 10      add    esp, 10
' }+ {! ]9 @- v) d004012A7  |>  83C4 F8      add    esp, -8
) s% `% D- E7 H4 _. h3 X) g004012AA  |.  68 32124000  push    00401232                        ; /mode = "w"
, c5 q$ x* U! S4 J6 [004012AF  |.  68 34124000  push    00401234                        ; |path = "output.txt"
9 m) h# m- q, I004012B4  |.  E8 7F010000  call    <jmp.&msvcrt.fopen>              ; \\fopen 5 p8 N3 L$ I* R+ l
004012B9  |.  83C4 10      add    esp, 10 8 M( i( c$ f3 t8 C8 w3 T8 ]
004012BC  |.  89C0          mov    eax, eax
7 ^  e) z1 Q+ x* @2 d4 D) z0 Z2 A004012BE  |.  8945 F8      mov    dword ptr [ebp-8], eax   j- y" R1 h2 z1 F
004012C1  |.  837D F8 00    cmp    dword ptr [ebp-8], 0
5 t% g  A9 h  P0 z+ h' y+ Y004012C5  |.  75 10        jnz    short 004012D7 9 F: J- L5 j- ?$ M
004012C7  |.  83C4 F4      add    esp, -0C
8 p& z" l  F+ t8 Z$ l004012CA  |.  68 3F124000  push    0040123F                        ; /format = "Can't Create output.txt!"
6 R6 _9 U1 h' Y( \. {  y6 T6 q/ n004012CF  |.  E8 5C010000  call    <jmp.&msvcrt.printf>            ; \\printf ! ~. M7 e& X! s$ p" K
004012D4  |.  83C4 10      add    esp, 10 4 S/ d2 e5 n9 |' ~; m3 |( r& E
004012D7  |>  83C4 F4      /add    esp, -0C
+ u. J. K7 M7 a; V/ |: q; k4 }004012DA  |.  8B45 FC      |mov    eax, dword ptr [ebp-4]
& \6 z/ O$ f8 Y! a$ N9 [004012DD  |.  50            |push    eax                            ; /stream ! r+ y. O3 Y* F4 s1 W& O
004012DE  |.  E8 45010000  |call    <jmp.&msvcrt.fgetc>            ; \\fgetc
2 C$ M  \( L! x  c; L; W004012E3  |.  83C4 10      |add    esp, 10
( i+ e  ~; ~" G+ |004012E6  |.  89C0          |mov    eax, eax 8 T! S" o( b; M2 c) K( W% D6 F9 t
004012E8  |.  8945 F4      |mov    dword ptr [ebp-C], eax   G; ^0 n' E" f/ g: r5 K+ D1 E+ R
004012EB  |.  817D F4 80000>|cmp    dword ptr [ebp-C], 80
1 x% j9 W, ~% x. c004012F2  |.  7F 23        |jg      short 00401317
% {' [( |  k3 n, i" X' \/ E1 U
004012F4  |.  83C4 F8      |add    esp, -8 4 L9 }- F1 ?% o1 d& w  b& R5 y
004012F7  |.  8B45 F8      |mov    eax, dword ptr [ebp-8] 4 P5 m  {! }7 S, O7 M" P9 a
004012FA  |.  50            |push    eax                            ; /stream ! r0 z- t. O6 ]1 M
004012FB  |.  8B45 F4      |mov    eax, dword ptr [ebp-C]          ; | $ G/ e# _$ R1 e2 E2 m6 r) x; P1 }
004012FE  |.  50            |push    eax                            ; |c 3 Q7 X* a- h0 r; W% L+ q
004012FF  |.  E8 1C010000  |call    <jmp.&msvcrt.fputc>            ; \\fputc & {% C& {: y; I+ `* b
00401304  |.  83C4 10      |add    esp, 10
+ s+ b$ v& O2 K8 T- W6 U00401307  |.  83C4 F4      |add    esp, -0C
. f2 t8 r7 C! C  p' B0040130A  |.  68 58124000  |push    00401258                        ; /format = "one char outputed",LF,"" 4 \. q  a/ |3 ]! a6 e
0040130F  |.  E8 1C010000  |call    <jmp.&msvcrt.printf>            ; \\printf + ~- j& k5 M, a6 Y# D7 f) ?
00401314  |.  83C4 10      |add    esp, 10
& E* T( S3 y# P8 B* W$ G$ P% `: y00401317  |>  837D F4 FF    |cmp    dword ptr [ebp-C], -1 2 [5 D( {5 ]% e
0040131B  |.  75 03        |jnz    short 00401320 0 C( u7 u% w9 P! ]9 k
0040131D  |.  EB 03        |jmp    short 00401322 ' s7 ~: m$ @3 h. o2 P
0040131F  |  90            |nop
1 I/ C3 Z. w; b  l& f* \9 j00401320  |>^ EB B5        \\jmp    short 004012D7
( J$ S6 B( W( H% h: D00401322  |>  C9            leave 0 w. f9 d% H& f8 f0 E  [
00401323  \\.  C3            retn * ~- Z& a$ U& N) r
00401324      00            db      00
  N, U7 }0 K0 R" X00401325      00            db      00 ! N2 H- h/ ^# T/ W( d* S
00401326      00            db      00 % A0 H* F* g  P, K( \
00401327      00            db      00 . q+ L- Z# P5 E( X8 i
00401328      00            db      00 / n, P+ Q1 E* g. S
00401329      00            db      00
0 Y3 M! I9 D# G7 y5 y6 h' Z* t0040132A      00            db      00 , `$ I- l8 X% s: y+ E5 e
0040132B      00            db      00 ; |- }4 D# L* j( L. s  r% ]
0040132C      00            db      00 , }, l. {- \. ?! n0 `" F. B5 S
0040132D      00            db      00 . k  w3 @: t5 k; H, M+ J
0040132E      00            db      00
$ I* _- v* Z$ `2 j9 W2 K$ p. g0040132F      00            db      00 1 R; c. a  Y' w- q
00401330  /.  55            push    ebp
# M4 Q' l. p5 t  i9 E! v# @00401331  |.  89E5          mov    ebp, esp
7 P9 V6 g# S0 o8 y1 l00401333  |.  83EC 08      sub    esp, 8 - M) V% A* j5 ^- ~- {  p
00401336  |.  A1 10204000  mov    eax, dword ptr [402010]
, Q  h9 a, j: R1 \% E0040133B  |.  8338 00      cmp    dword ptr [eax], 0 2 ~' l& a3 L5 z2 b
0040133E  |.  74 1D        je      short 0040135D
7 j2 J) U. y" O/ D  t+ R4 \) p00401340  |>  A1 10204000  /mov    eax, dword ptr [402010] & f% y: `) q) N/ M$ J' n3 w! Y7 M
00401345  |.  8B00          |mov    eax, dword ptr [eax]
9 y4 R" }( ?; L" J9 e# ?00401347  |.  FFD0          |call    eax , e( \: d( n; j( W2 p
00401349  |.  A1 10204000  |mov    eax, dword ptr [402010]
4 T; Y4 v( @+ N2 O( {. N) C0040134E  |.  8D50 04      |lea    edx, dword ptr [eax+4] " L. Y  v2 y5 A3 ^% w& u
00401351  |.  8915 10204000 |mov    dword ptr [402010], edx ! X8 o" J! R8 s/ Y7 D5 x
00401357  |.  8378 04 00    |cmp    dword ptr [eax+4], 0 5 H3 o! O5 H9 x" x1 h# l1 m
0040135B  |.^ 75 E3        \\jnz    short 00401340 . T; v' d- _% Q* S2 A' K, K6 R- j
0040135D  |>  C9            leave % V! d6 w  G) O8 P8 S: W; h
0040135E  \\.  C3            retn : q! u1 d# E  K1 K, Y) \. |
0040135F      90            nop # e& l7 d7 }6 m" h9 x1 U6 B) N
00401360  /$  55            push    ebp
1 p/ m2 Y' B$ U* J8 @+ U, b- P9 @00401361  |.  89E5          mov    ebp, esp
$ d/ }5 P& R7 O# T00401363  |.  83EC 14      sub    esp, 14
5 q. _; v2 \: v  p+ m/ D00401366  |.  53            push    ebx : _( M" c+ ?# J! r) d' X5 S
00401367  |.  A1 58144000  mov    eax, dword ptr [401458]
6 u1 I0 j$ T0 Q/ r9 k; {+ O0040136C  |.  83F8 FF      cmp    eax, -1 2 H' b+ Z% d, J& C, g2 p  a# W
0040136F  |.  75 19        jnz    short 0040138A
( H6 c6 W1 c1 n7 S$ A% o  F00401371  |.  31C0          xor    eax, eax ( X+ q! l8 [8 b0 Q0 }
00401373  |.  833D 5C144000>cmp    dword ptr [40145C], 0 / z+ l+ ^% H2 ^) \' K3 [
0040137A  |.  74 0E        je      short 0040138A
( L4 K. }4 {5 h1 Q+ r( s  ~0040137C  |.  BA 5C144000  mov    edx, 0040145C 9 D& K' p* b1 h! h5 N+ L/ I
00401381  |>  83C2 04      /add    edx, 4
' }3 l: S( F# ?( M$ k) a% Z00401384  |.  40            |inc    eax 3 Z4 T. X3 w- H8 B
00401385  |.  833A 00      |cmp    dword ptr [edx], 0
( g$ }- J0 A$ ?- b9 {7 r4 [00401388  |.^ 75 F7        \\jnz    short 00401381 4 f! W0 ]7 c* V4 _; q" V, R
0040138A  |>  89C3          mov    ebx, eax $ Q% U5 u0 y: z8 x# h* ]" A
0040138C  |.  85DB          test    ebx, ebx ) x: T: o3 G7 A0 a. q* v- ~
0040138E  |.  74 0C        je      short 0040139C ! f8 \/ R+ A* |- ?' Z
00401390  |>  8B049D 581440>/mov    eax, dword ptr [ebx*4+401458]
8 q* N! t* D4 _9 E4 `* M, Q00401397  |.  FFD0          |call    eax . \1 n% a/ N* U" Z0 K
00401399  |.  4B            |dec    ebx 4 C" g# j5 k9 d  O
0040139A  |.^ 75 F4        \\jnz    short 00401390
, v: q' X& T7 t- [5 q0040139C  |>  83C4 F4      add    esp, -0C
4 x* E3 K  w3 R0040139F  |.  68 30134000  push    00401330                        ; /func = engoutpu.00401330 ; a' S& c( }) i# G
004013A4  |.  E8 97000000  call    <jmp.&msvcrt.atexit>            ; \\atexit
8 F* l7 c: d6 W7 R! l004013A9  |.  8B5D E8      mov    ebx, dword ptr [ebp-18]   o* [1 ]4 m8 n$ p6 ?9 O) G8 e
004013AC  |.  C9            leave - D: ?" _" q2 x; W& _
004013AD  \\.  C3            retn ) z, ]5 h( @9 w( v( U' H
004013AE      89F6          mov    esi, esi
- q9 K* q3 `; e9 U! v' D2 }004013B0  /$  55            push    ebp
4 c1 P4 @% m' x- C004013B1  |.  89E5          mov    ebp, esp
; W/ |- c% j  ]. D  U004013B3  |.  83EC 08      sub    esp, 8 ) [, |  ~; E6 I- J/ T
004013B6  |.  833D 14204000>cmp    dword ptr [402014], 0 $ T1 J; \, z% k+ y3 j4 \  `4 G
004013BD  |.  75 0F        jnz    short 004013CE
+ F, p/ |7 U* S, t004013BF  |.  C705 14204000>mov    dword ptr [402014], 1 : j3 F" J" ?/ R4 N4 o$ O/ k
004013C9  |.  E8 92FFFFFF  call    00401360 . v/ Y% Q; D2 }
004013CE  |>  C9            leave / p$ Y- l, E6 {- \+ w' N" L; i, U
004013CF  \\.  C3            retn   r$ [  P& W. R4 r& ~
004013D0  .- FF25 AC304000 jmp    dword ptr [<&msvcrt._fmode>]    ;  msvcrt._fmode
; W; k. x) x. F; _' j  u/ s/ O004013D6      90            nop
0 X& B4 E1 U8 Q# A+ B004013D7      90            nop
' N/ Y3 [: n$ G5 t* M/ s( |004013D8  .- FF25 B4304000 jmp    dword ptr [<&msvcrt._iob>]      ;  msvcrt._iob , p  N& d$ I6 f9 B, a, K  f
004013DE      90            nop
/ w5 W: R% A3 P& i& i004013DF      90            nop
) l4 j. S! C. W4 M004013E0  .- FF25 DC304000 jmp    dword ptr [<&msvcrt.__set_app_ty>;  msvcrt.__set_app_type
" R% x/ D! B  y% H004013E6      90            nop 1 H1 e+ p3 [: j, N
004013E7      90            nop
3 w; d( Y) A; |/ f004013E8  $- FF25 A4304000 jmp    dword ptr [<&msvcrt._cexit>]    ;  msvcrt._cexit % @. Q' p7 ^/ }- S+ n
004013EE      90            nop
; F) Y/ k9 M9 R8 N004013EF      90            nop 5 s( v  }4 p2 E. r, v3 h% N4 x
004013F0  $- FF25 D0304000 jmp    dword ptr [<&msvcrt.__p__environ>;  msvcrt.__p__environ
0 ^! e3 Y7 F6 S# Q$ m$ G004013F6      90            nop
8 L$ i6 o1 y. f9 x2 S2 W. P004013F7      90            nop 0 z) V9 R) w0 d: H
004013F8  $- FF25 B0304000 jmp    dword ptr [<&msvcrt._fpreset>]  ;  msvcrt._fpreset
4 t$ w2 V' b  E9 L& ^2 c004013FE      90            nop # q' Y7 q9 U* ]8 Z6 x! ^
004013FF      90            nop
; Z/ u0 J9 p# H00401400  $- FF25 D8304000 jmp    dword ptr [<&msvcrt.signal>]    ;  msvcrt.signal 5 @% ~- P# l5 o$ M
00401406      90            nop
5 J/ H" c. V: b7 w0 l3 t5 g00401407      90            nop
, r- Y% P) E1 Y+ ~% v8 C1 @  |00401408  $- FF25 A8304000 jmp    dword ptr [<&msvcrt._fileno>]    ;  msvcrt._fileno
2 P& m2 V2 Z3 ^- p# c0 ~0040140E      90            nop * I$ }5 i' O+ c, I" Y. v7 I2 A- u
0040140F      90            nop
; i- i1 H) F7 h" C2 a% h00401410  $- FF25 B8304000 jmp    dword ptr [<&msvcrt._setmode>]  ;  msvcrt._setmode
* m& s: d! V- E4 m* o2 f' _00401416      90            nop - E6 J% U* k5 G- m
00401417      90            nop ; y# v' J& m# e4 v4 G4 }1 W2 z
00401418  $- FF25 BC304000 jmp    dword ptr [<&msvcrt.__getmainarg>;  msvcrt.__getmainargs
$ L) f9 y& G+ h# F0 T9 z2 X0040141E      90            nop 7 P( X2 p( C1 h  b2 E5 `" E
0040141F      90            nop $ i( b* W! }& I0 ?
00401420  $- FF25 CC304000 jmp    dword ptr [<&msvcrt.fputc>]      ;  msvcrt.putc ( X9 }0 |1 `/ s
00401426      90            nop 2 }9 b' `% T, f$ q4 m' ^
00401427      90            nop
* u( o, j! u* ?. ]00401428  $- FF25 C4304000 jmp    dword ptr [<&msvcrt.fgetc>]      ;  msvcrt.getc / `6 ^5 v% R9 V0 l7 u
0040142E      90            nop
9 J, U6 P- ~  @0040142F      90            nop 0 ?6 I5 L7 L+ w0 T
00401430  $- FF25 D4304000 jmp    dword ptr [<&msvcrt.printf>]    ;  msvcrt.printf
4 }7 g) r. p- T2 n1 I7 U00401436      90            nop
5 ^& M" h' @2 D8 J) A2 j: i2 C- b00401437      90            nop # W. O3 w: r+ V$ u6 n( e3 p
00401438  $- FF25 C8304000 jmp    dword ptr [<&msvcrt.fopen>]      ;  msvcrt.fopen
3 e4 g& u, ^% G, R! I0040143E      90            nop
& ^" T+ A3 [" d* E+ G. _0040143F      90            nop - s" Q% t( j8 `. t8 P, r, V, B! i
00401440  $- FF25 C0304000 jmp    dword ptr [<&msvcrt.atexit>]    ;  msvcrt.atexit 9 N4 G9 D/ F6 Q4 g: N  p" O$ O
00401446      90            nop & d7 J& y7 x6 l
00401447      90            nop # {; [4 E" \/ T8 z  Y% k& g
00401448  $- FF25 98304000 jmp    dword ptr [<&KERNEL32.SetUnhandl>;  kernel32.SetUnhandledExceptionFilter $ ?6 }; A7 i; o+ s5 |6 f
0040144E      90            nop
8 [8 b1 N' J8 D! a0040144F      90            nop & d/ ]2 l( z- m8 m1 ]- {
00401450  .- FF25 94304000 jmp    dword ptr [<&KERNEL32.ExitProces>;  kernel32.ExitProcess 2 U. n) T# l$ m. P: W  J# Q$ Y# j
00401456      90            nop % B' n; K# @; g. O
00401457      90            nop
. l. l* f+ a- G00401458  .  FFFFFFFF      dd      FFFFFFFF 1 z! {' h5 L4 v
0040145C  .  00000000      dd      00000000 7 L3 b: v, |# B0 V. I. W
00401460      FF            db      FF ; V8 G! D& ?9 o9 G% `6 [
00401461      FF            db      FF - [% s1 ~" w: l& u+ Z
00401462      FF            db      FF
& D4 k  o& H; v7 z# J- m4 s00401463      FF            db      FF $ V6 v& ~( A$ P6 K( w4 W
00401464      00            db      00
6 f4 d, S3 \4 o* {/ u: ~1 L00401465      00            db      00 7 ]" a0 r' o$ w) j6 N' J& C
00401466      00            db      00
) M. I" ?4 R3 f3 T7 Q. T: K00401467      00            db      00
作者: shane007    时间: 2009-10-10 22:14
在游戏里面,也可以用相同的修改方法,但是由于代码很多,难点在于找到这个比较点。1 l, h2 z( j2 J: r9 l
深绿,你能否把C程序再修改一下,用其他的方法编制出同样功能的程序?" e7 S/ c* A+ X' W! B8 ]$ [: a
比如不用fgetc这个标准c函数,而用mfc的类似函数来编。
! \8 a$ ~+ Y9 @' m, g4 z' S让我们看看生成的汇编代码有什么区别。/ T: L4 V1 P- V, E- f2 i
你也可以试着修改一下。
作者: 深绿    时间: 2009-10-12 11:51
MFC是C++的类库吧,我不是很熟悉" f% _$ h3 w- s3 \

2 d9 n9 u: U3 [说说我对单字节内核的看法:
# l, J8 o) ]0 b% P5 a, j2 |4 p- J+ N) U7 s  w# u4 f5 i% Q
我感觉这个程序并不能很好地模拟单字节内核,因为这个程序只是过滤了一些字符,
: L0 l' |7 `: a7 B+ m. z4 F然后将剩余的输出到一个文件里。而游戏的内核,很有可能是在输出到屏幕的时候进行的过滤。! M7 D. D" f. U* d: u1 A

1 u6 p+ A( I- H/ o举个例子:当我们用记事本打开txt看到中文的时候,是记事本将中文打印到屏幕,而如果这不是记事本,是单字节的内核
8 W  E& m! V) \就很有可能无法显示中文,尽管那些中文数据都存在。
. g( K- G/ }# y$ S# a9 N5 E3 m% p7 h3 P5 l. J4 q/ @
所以,上面删掉那两行的行为其实没有什么意义,就相当于在源代码中,把判断<0x80的语句删掉,就相当于直接把input.txt的东西完全复制到output.txt里,并没有真正体现单字节内核的意义。因为真正需要考量的输出环节,是在打开记事本,把这些文字输出到屏幕上的过程。
- }' c5 X# @, r8 A# `4 K. O2 g' Z" U/ ]7 Z, W4 t  m
因此我很怀疑,游戏是否会用这种(<0x80)过滤方式。+ M6 ?+ B1 S7 L+ \: Z

9 ~* y9 K0 F1 H. X$ q中文的显示方式是读取2字节—>获得区位码—>在字库中读取数据—>显示汉字。
$ d$ n- @$ h# O- K. `
: C2 ?7 g- ?* @3 N" _# v那么英文的应该类似,读取一个字节——获得编码——在字库中读取数据——显示文字
% _9 p, l2 t/ M* R) M
, t( L7 i' _2 U1 s7 S* r: n那么当它读取进中文字节时,很有可能是获得的编码在字库中找不到数据,所以自动过滤了。6 m6 u" Z7 z' S! {$ t. n$ C. P( B
! W5 T6 H" E$ Y. ]
就我所知,很多内核不支持双字节是因为它不会在读到大于0x80的字节时多读1个字节,而并非直接过滤掉大于0x80的字节
作者: shane007    时间: 2009-10-12 13:09
其实,单字节内核一般有2种情况。0 e$ Q! \  t  `! S0 A% [: d) n
1. 对大于0x80的字节不做任何处理,输出到画面就是一个中文字符会变为2个字符
* M9 Y& @  {* x8 G8 L2. 跳过大于0x80的字节,读取后一个字节,输出到画面就是中文字符被过滤了; F% w! O/ c  L

! [7 c# z" ~5 O0 H* o真正的游戏应该会用这2种方式中的一种来处理。6 t' e+ Z( J0 I; H" z
这个单字节内核模拟程序其实只模拟了2的情况。$ P9 [( e% _1 q4 i, l) e9 P( x$ B& i
要模拟1的话就要制作一个图形程序了。% w1 u% Q7 t- _, \1 K0 S1 ]) V

' j: g# A' M9 h2 h" _这个单字节内核模拟程序本身的意义其实不大。* T9 L* X4 N5 j5 X! K( w. u" I' r
其实我是想开始更多地在汇编层次上研究汉化,当作是抛砖引玉吧。
作者: 深绿    时间: 2009-10-12 15:34
这样看来,对这两种类型的改造方式是一样的,都是让程序在碰到大于0x80的字节时两个两个读取。2 ?, m- ]1 W( g: X6 O. i( t
所不同的是后者由于要做这么个比较的处理,所以更方便我们定位到需要更改的位置。; D2 m+ w5 R2 N% z1 ^- v
这样的理解对不?
作者: shane007    时间: 2009-10-12 16:44
引用第8楼深绿于2009-10-12 15:34发表的  :! }6 I) f9 w: w& }2 \- k8 T. y
这样看来,对这两种类型的改造方式是一样的,都是让程序在碰到大于0x80的字节时两个两个读取。' U2 i, D4 V* M, Y2 [) V
所不同的是后者由于要做这么个比较的处理,所以更方便我们定位到需要更改的位置。3 ~, j7 `8 H; c7 ~! O
这样的理解对不?

% K/ `- X1 X7 m! I- L理解完全正确。
7 p& }/ n# y8 Q1 ?6 g/ Q不过,就是简单的和0x80来比较,汇编代码也会有多种形式,不如test,cmp 等等,而且程序里还会有其他和0x80比较的地方,要找到关键的比较点,非常不容易。; U, I- G* F; z' X+ W: g+ Z

% |8 R, v0 X: w. {  m0 v" ?+ N有一个笨办法,查找2进制码80。如果汇编代码是test,cmp等于语句,那么就有可能是比较点。
5 `, q0 }7 P4 i2 _0 i# _1 D5 S然后逐个nop测试,看有什么变化。
9 Z( u4 f# S( R! k$ j8 u
# b: m  l/ r' b2 R/ c7 _你可以参考一下这篇帖子
0 A0 L+ L( c% g6 ]9 }7 R. r: O  ~游戏汉化中的双字节问题处理原理! W' v1 U) ?# Z7 N# T/ i; d) {# \
https://www.chinaavg.com/read.php?tid=187095 `; O2 {; m0 _
作者好像是左贤王主力人员。




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