冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2009-10-8 17:41
标题: 【汉化与汇编】单字节内核模拟程序(深绿请进)
深绿,你好,有时间的话请帮忙制作一个单字节内核模拟程序。3 ], S8 I8 r. x$ K  T) z

6 y* p7 ]+ `, g4 l; G0 y; `题目吓人,其实很简单。# y8 J' K/ C/ Q! F( s7 p* v
在程序里面设定一个固定中文字符串。* }3 D4 r* q" Z/ s6 ?
然后按字节读取。小于0x80的字节输出到out.txt文件即可。
  L8 ]5 D( x8 q: D% c/ X  x; W1 ~9 L
+ {$ Y! v& l$ o0 O/ w, i3 o1 r- t+ J这个程序模拟了单字节游戏后输出乱码的情况。
9 ~+ u0 u. g- D( y3 E: q! s接下去我们可以利用它进行汇编级研究。
作者: 深绿    时间: 2009-10-10 19:10
我稍微改了一下程序,包里面有个input.txt和output.txt& Z2 x# s- ]" l4 w7 }# Y
先在input.txt里面写入字符串,然后运行程序,就会在output.txt里输出小于0x80的字节
0 V2 v8 ?. I+ D
8 P7 O4 E9 k: z6 g但是我有个疑问,汉字两个字节的机内码都是大于0x80的,这样如果原字节是纯中文的,不就没有字节被输出吗?
作者: shane007    时间: 2009-10-10 21:47
引用第1楼深绿于2009-10-10 19:10发表的  :
( V( S: E& ~; `, l& ?! j) d- M我稍微改了一下程序,包里面有个input.txt和output.txt+ {3 v) g5 r8 n  H4 _, E' C
先在input.txt里面写入字符串,然后运行程序,就会在output.txt里输出小于0x80的字节
, C6 w# Y, H, B; X- Q/ r8 Y
7 v! x8 L/ A- O2 y但是我有个疑问,汉字两个字节的机内码都是大于0x80的,这样如果原字节是纯中文的,不就没有字节被输出吗?
- q* V/ o- [9 p( o
是的,如果输入字符串是中英混合的话,输出的内容就只留下英文了。
0 H( Q0 x! u- C1 B这就模拟了汉化了文本以后,中文字符被过滤的情况。
$ _8 R3 v8 b% H1 ~0 h; c) X3 J9 G
% E6 w& v- f' n( U8 ~接下去就可以在汇编级用OD载入,开展研究了。9 g, _: g9 @4 J% }, p, g# ?
想办法把和0x80比较的地方去掉就行了。
作者: shane007    时间: 2009-10-10 21:51
看了代码,应该把ch<=128 改为 ch<128 吧?
作者: shane007    时间: 2009-10-10 22:02
由于这个程序很短,OD里面的汇编代码也很短。
' k4 ?+ f- m& M" R# s% N请看红色的部分,这就是和0x80比较的部分。
% K; |: O' A' c) C4 }+ s把这2句NOP掉,然后保存修改后的文件为exe。
/ \, Q6 e  g3 B- Y5 A; ?我们发现input.txt里面的所有内容都能被输出了。 / J8 w4 H, `. }! \7 b6 H
附上修改后的exe.
" m/ [. Q6 h" k* z深绿,你可以把这个操作过程试一下,练习一下.
0 h. V- o- L, I$ H( S, [+ q/ \
" s3 u3 m- F4 \5 u1 }00401000  /$  55            push    ebp
! d# C4 E2 M6 F9 _1 f8 q4 g00401001  |.  89E5          mov    ebp, esp . k6 _' w0 w% v; x
00401003  |.  83EC 18      sub    esp, 18 ! r3 z! n& p/ R* s
00401006  |.  C745 FC 00000>mov    dword ptr [ebp-4], 0 * a6 f; y8 T6 P5 ^' ^. i& I
0040100D  |.  83C4 F4      add    esp, -0C
. s$ u2 i# r, @' n# r00401010  |.  8D45 FC      lea    eax, dword ptr [ebp-4] 7 o/ c2 J) t# g) g# ]  X! v9 H8 `
00401013  |.  50            push    eax ' ~1 w2 {; z+ `: f2 R. m
00401014  |.  FF35 08204000 push    dword ptr [402008]
1 Z& _4 ~3 N) j0040101A  |.  8D45 F8      lea    eax, dword ptr [ebp-8] ! n) w- J2 @. n9 w5 V
0040101D  |.  50            push    eax
' `' K7 [) s0 u; G; r0040101E  |.  68 04204000  push    00402004 " _- {/ d+ N% J! ^! E0 U
00401023  |.  68 00204000  push    00402000 / ^7 f: t2 A" Y3 @' z
00401028  |.  E8 EB030000  call    <jmp.&msvcrt.__getmainargs> - P) b) z4 f, y
0040102D  |.  C9            leave
, W5 S% d1 J, M2 ]0040102E  \\.  C3            retn
7 N1 h: \  C" E9 {  t! S0040102F      90            nop
+ F% h3 O. B- m+ ~7 ~# W00401030  /$  55            push    ebp , q: V( X" b8 F) S
00401031  |.  89E5          mov    ebp, esp % Z1 F0 M( |" Y  p% d
00401033  |.  83EC 08      sub    esp, 8 " c8 z$ w! V; z) H: U6 A3 Y$ F
00401036  |.  8B15 0C204000 mov    edx, dword ptr [40200C]
, H% [0 o  ~/ P1 ~, M& r2 m0040103C  |.  85D2          test    edx, edx
8 e& l" I& Q- F( j$ Q0040103E  |.  74 7B        je      short 004010BB
* A& q. n1 R$ S0 a00401040  |.  A1 AC304000  mov    eax, dword ptr [<&msvcrt._fmode>> ) u4 _% m$ g1 n1 Z; R2 K# t
00401045  |.  8910          mov    dword ptr [eax], edx
6 n+ x: p8 v" ?$ @; F00401047  |.  A1 B4304000  mov    eax, dword ptr [<&msvcrt._iob>] : F8 p4 F$ ]; N
0040104C  |.  85C0          test    eax, eax 4 a4 F1 U, m2 Q% J
0040104E  |.  74 1E        je      short 0040106E ; k1 N# g% C: K# o0 P
00401050  |.  83C4 F8      add    esp, -8 : k4 i  B/ j' t+ V: w6 L
00401053  |.  FF35 0C204000 push    dword ptr [40200C] * x, f: u/ q  i. J/ o
00401059  |.  83C4 F4      add    esp, -0C 7 _' n7 k5 |& I/ L7 E& k. Q
0040105C  |.  50            push    eax                              ; /pstream => offset msvcrt._iob
9 P' r: ^( e, o+ D- Q, K0040105D  |.  E8 A6030000  call    <jmp.&msvcrt._fileno>            ; \\_fileno
5 }% q$ s4 k0 L3 y) e) v2 h00401062  |.  83C4 10      add    esp, 10
5 h, Z( A. l& Z1 {% L00401065  |.  50            push    eax                              ; |handle ' ^3 j) ]7 g, O9 W% V, H
00401066  |.  E8 A5030000  call    <jmp.&msvcrt._setmode>          ; \\_setmode & Y! _) H% _& T4 z
0040106B  |.  83C4 10      add    esp, 10 3 F1 W. N/ P% c: x
0040106E  |>  A1 B4304000  mov    eax, dword ptr [<&msvcrt._iob>]
8 y- g; e# |+ ~: W- q- `1 C00401073  |.  83C0 20      add    eax, 20 # U- c  m! R* Q: F1 Q7 W
00401076  |.  74 1E        je      short 00401096 ( L3 Z: k7 C, Z1 \! L' K# |7 U
00401078  |.  83C4 F8      add    esp, -8 4 Z# h4 ~$ q5 W" E* q
0040107B  |.  FF35 0C204000 push    dword ptr [40200C]
! C# q0 F' d* c6 Z. f' E# W00401081  |.  83C4 F4      add    esp, -0C
* G; s6 b- M9 ^/ ]9 t4 n00401084  |.  50            push    eax                              ; /pstream
% @; t. ]! p, i$ `  l$ v) w2 ~00401085  |.  E8 7E030000  call    <jmp.&msvcrt._fileno>            ; \\_fileno 9 {0 O' }( ]; b2 o% N3 S- }* o3 L
0040108A  |.  83C4 10      add    esp, 10
4 S7 F( Q" Z7 e9 b" j- _0040108D  |.  50            push    eax                              ; |handle
" T8 k" r+ Z" O0040108E  |.  E8 7D030000  call    <jmp.&msvcrt._setmode>          ; \\_setmode
" Q- j: ^2 q( }1 P3 X00401093  |.  83C4 10      add    esp, 10
# u  k1 O. l3 ^& ~" B: u9 g/ g, q" q2 p00401096  |>  A1 B4304000  mov    eax, dword ptr [<&msvcrt._iob>]
4 l/ H+ t: I9 Y" i7 O- g0040109B  |.  83C0 40      add    eax, 40 1 |/ e1 b) l. v# J' @1 T
0040109E  |.  74 1B        je      short 004010BB 3 t, l. a. W! @( d0 T
004010A0  |.  83C4 F8      add    esp, -8 ) _9 w. M3 A6 A8 n# ~% o5 D) p
004010A3  |.  FF35 0C204000 push    dword ptr [40200C] / V* d4 b, l, P# O9 Z4 a. u
004010A9  |.  83C4 F4      add    esp, -0C
4 o; c( p0 a7 b# i' R3 h( m" z004010AC  |.  50            push    eax                              ; /pstream ; q! L! `" T. L6 D6 D
004010AD  |.  E8 56030000  call    <jmp.&msvcrt._fileno>            ; \\_fileno - C& T) F* u) A2 i9 z  y: ?- g
004010B2  |.  83C4 10      add    esp, 10 ' \3 s; w; K) B6 z
004010B5  |.  50            push    eax                              ; |handle * W/ y6 P2 l" m+ ]0 m
004010B6  |.  E8 55030000  call    <jmp.&msvcrt._setmode>          ; \\_setmode 0 O! z- I5 C9 D3 U( u. _$ Z
004010BB  |>  C9            leave
. ~) a# a& I0 E! `004010BC  \\.  C3            retn
/ G6 T) `  G0 L5 f004010BD      8D76 00      lea    esi, dword ptr [esi]
9 V0 d. Y* x+ b! v. P3 D: m* I004010C0  /.  55            push    ebp % s0 ~# I; r; a( ~
004010C1  |.  89E5          mov    ebp, esp
1 d6 b- v2 y8 L8 Z4 B004010C3  |.  83EC 10      sub    esp, 10 ! F/ c* T( T+ }& _/ g. P
004010C6  |.  56            push    esi
% o/ N- Z. V# Y7 j004010C7  |.  53            push    ebx $ `% ]* A  I- F0 P$ O
004010C8  |.  8B45 08      mov    eax, dword ptr [ebp+8]
" q/ `0 a+ K/ k2 l2 i5 o, M: x004010CB  |.  31DB          xor    ebx, ebx
/ f6 S1 k; Z$ m; X  g. ~% P% Y. ~004010CD  |.  31F6          xor    esi, esi
% e  d; e0 `3 n8 k% n$ d004010CF  |.  8B00          mov    eax, dword ptr [eax]
1 W) J3 z7 _- y  V004010D1  |.  8B00          mov    eax, dword ptr [eax]
* }# b% K1 ?9 f4 x/ K' O004010D3  |.  3D 910000C0  cmp    eax, C0000091
$ s7 A$ J4 [$ a- Z9 O  y004010D8  |.  77 16        ja      short 004010F0 / X9 d/ e; u% p
004010DA  |.  3D 8D0000C0  cmp    eax, C000008D
9 O# t: r' ~/ y$ h004010DF  |.  73 4F        jnb    short 00401130 : O  t; ^+ N0 N
004010E1  |.  3D 050000C0  cmp    eax, C0000005 # K. R1 G' K* `5 ?4 ?
004010E6  |.  74 18        je      short 00401100 + k* s8 b9 N0 P& h6 y1 n# ]
004010E8  |.  E9 86000000  jmp    00401173
) X! J# `. n+ U7 D' E004010ED  |  8D76 00      lea    esi, dword ptr [esi] % S& N9 {: L7 Q
004010F0  |>  3D 930000C0  cmp    eax, C0000093
# n. m& }# j3 ]004010F5  |.  74 39        je      short 00401130
- X) F# J; v, S004010F7  |.  3D 940000C0  cmp    eax, C0000094
) J, K6 A$ C* ~004010FC  |.  74 37        je      short 00401135 + j9 @3 U, [, p, K& i  I
004010FE  |.  EB 73        jmp    short 00401173
3 i* B, _- k/ n00401100  |>  83C4 F8      add    esp, -8
2 h4 g) `$ D& `( G2 E4 l00401103  |.  6A 00        push    0                                ; /func = NULL
# f- s) |# m- I" h1 N- W6 ^00401105  |.  6A 0B        push    0B                              ; |sig = SIGSEGV
3 I1 O1 z6 h6 l  p8 J0 B4 b00401107  |.  E8 F4020000  call    <jmp.&msvcrt.signal>            ; \\signal 8 l1 x- Z* @  \
0040110C  |.  83C4 10      add    esp, 10
5 T5 e6 D: H4 ^4 D6 ]0040110F  |.  83F8 01      cmp    eax, 1 ; ~8 ?* H" q* Z0 P
00401112  |.  75 0E        jnz    short 00401122
% V7 d/ `' x* _9 _00401114  |.  83C4 F8      add    esp, -8
( b( a# p9 u8 l. h, \5 x00401117  |.  6A 01        push    1                                ; /func = 00000001
  ]1 i# _1 b7 g* A5 T00401119  |.  6A 0B        push    0B                              ; |sig = SIGSEGV
  Z& N; t; A" i7 `1 F5 V+ A0040111B  |.  E8 E0020000  call    <jmp.&msvcrt.signal>            ; \\signal
% G# R4 _( L5 \( \/ A, S1 A00401120  |.  EB 4C        jmp    short 0040116E $ `4 z* Q3 O" S  j+ D2 v4 s  h
00401122  |>  85C0          test    eax, eax 9 b0 x. u) z- s' w0 C  V
00401124  |.  74 4D        je      short 00401173
. X& k" L9 V  y. W, I* E' l00401126  |.  83C4 F4      add    esp, -0C 4 h9 B3 u6 J+ _& N6 x! F! K
00401129  |.  6A 0B        push    0B
( o$ q2 Q+ e; F2 @2 q& Z0040112B  |.  EB 3F        jmp    short 0040116C   w! M& H. }, ^; o3 t# S
0040112D  |  8D76 00      lea    esi, dword ptr [esi] 1 J+ }9 v  ?" |; h6 ~( b7 O
00401130  |>  BE 01000000  mov    esi, 1
/ a& t9 u, n  p9 ?5 [9 Q00401135  |>  83C4 F8      add    esp, -8 & o& _" `. ]4 d$ ~8 }, f5 \8 ~
00401138  |.  6A 00        push    0                                ; /func = NULL 3 x% h3 Z& y! F& D4 {; T
0040113A  |.  6A 08        push    8                                ; |sig = SIGFPE
* `" c% @1 e( B% C" T; M, U0040113C  |.  E8 BF020000  call    <jmp.&msvcrt.signal>            ; \\signal
/ m! H3 E2 t6 {$ w( ?00401141  |.  83C4 10      add    esp, 10 + x$ T4 H( s' e3 e3 R, U7 K
00401144  |.  83F8 01      cmp    eax, 1 % a7 |" l/ x- c
00401147  |.  75 1A        jnz    short 00401163
6 a2 C# E! a7 [  ]8 D- w00401149  |.  83C4 F8      add    esp, -8 2 J4 J* n  g& y! \6 R7 r4 I
0040114C  |.  6A 01        push    1                                ; /func = 00000001   d  z% i; q$ z8 @- h: @9 v2 z' G
0040114E  |.  6A 08        push    8                                ; |sig = SIGFPE
' ~  z4 m/ X( D. p- T0 d00401150  |.  E8 AB020000  call    <jmp.&msvcrt.signal>            ; \\signal
; o3 ^  l3 d! V00401155  |.  83C4 10      add    esp, 10 : D- B# z) [0 s. k" U3 c, K/ p3 w, F
00401158  |.  85F6          test    esi, esi
* b& J% M$ w. Q5 `% V) {" @' i8 _0040115A  |.  74 12        je      short 0040116E ! Y* B9 O0 {, ~) ]6 i% O/ O
0040115C  |.  E8 97020000  call    <jmp.&msvcrt._fpreset>          ; [_fpreset / u+ `/ y1 S* ^" B
00401161  |.  EB 0B        jmp    short 0040116E & q- }, o" o6 x) h) ^3 x7 Q
00401163  |>  85C0          test    eax, eax
0 `  x2 q6 G  R0 Y1 w4 A( N00401165  |.  74 0C        je      short 00401173
8 }+ @4 L- |/ A3 ?00401167  |.  83C4 F4      add    esp, -0C
1 l9 \: I7 `/ I3 ?0040116A  |.  6A 08        push    8
8 f. v$ @, G0 N, ]1 a- o/ V9 |0040116C  |>  FFD0          call    eax
* O/ m" X7 E3 K; P! x/ e7 u2 n0040116E  |>  BB FFFFFFFF  mov    ebx, -1
% L1 n8 x' E. G; k( ]. l5 G00401173  |>  89D8          mov    eax, ebx
& \! R2 Q7 ?) [3 o8 h5 `( e00401175  |.  8D65 E8      lea    esp, dword ptr [ebp-18]
9 S& c% M1 V( R- v+ w' F/ R00401178  |.  5B            pop    ebx 6 W* u+ J* |3 f& t! b& [# t' P5 S
00401179  |.  5E            pop    esi % _7 L+ i: A2 F9 J* m, C# p- c
0040117A  |.  C9            leave
* S* _# j, d" ?& V- f# W' F) U0040117B  \\.  C2 0400      retn    4
5 R; M1 w- t( f7 B7 }/ R1 E0040117E      89F6          mov    esi, esi
" R) [9 N  h! `% H/ F  l00401180  /$  55            push    ebp : P( b/ u, V+ s( h& Y) E9 e. @
00401181  |.  89E5          mov    ebp, esp
/ v3 [& ~% i# G00401183  |.  83EC 14      sub    esp, 14
" a7 w/ t. ~, {3 B/ X5 A: h00401186  |.  53            push    ebx
% R9 L: A* `# V) k7 M, ~2 ]3 G" T$ T00401187  |.  83C4 F4      add    esp, -0C
$ X9 m4 m( b$ [) A& W0040118A  |.  68 C0104000  push    004010C0                        ; /pTopLevelFilter = engoutpu.004010C0 " E0 W! O. I( x
0040118F  |.  E8 B4020000  call    <jmp.&KERNEL32.SetUnhandledExcep>; \\SetUnhandledExceptionFilter
  k, t1 q  t2 ?& K# R00401194  |.  83C4 FC      add    esp, -4 , ]7 o& ]0 F3 ~2 s: N
00401197  |.  E8 5C020000  call    <jmp.&msvcrt._fpreset>          ; [_fpreset ; U5 U9 R, {  e
0040119C  |.  E8 5FFEFFFF  call    00401000
- U6 j* J6 k9 u. a5 \004011A1  |.  E8 8AFEFFFF  call    00401030
+ J) H7 ]  o+ v$ q! X! m4 a004011A6  |.  83C4 FC      add    esp, -4
* T9 X9 e  d% |) y- w( T# t/ ^004011A9  |.  E8 42020000  call    <jmp.&msvcrt.__p__environ> 3 Z$ z; g8 B1 ^: E" V. e" B9 ~
004011AE  |.  FF30          push    dword ptr [eax] $ F) O" z. d3 i1 E! m$ l
004011B0  |.  FF35 04204000 push    dword ptr [402004]
1 T2 R, F9 l, z# `" ~# |4 G6 \004011B6  |.  FF35 00204000 push    dword ptr [402000] ) ], c3 b0 f% s) B
004011BC  |.  E8 AB000000  call    0040126C 0 b7 O. r; }0 i. o2 ^: S3 H; E
004011C1  |.  89C3          mov    ebx, eax
8 \* T$ R) b6 |+ }8 A004011C3  |.  83C4 20      add    esp, 20 " F6 @+ ~" M: o" ^7 `2 L, x
004011C6  |.  E8 1D020000  call    <jmp.&msvcrt._cexit>            ; [msvcrt._cexit ( J# t. K1 `5 H1 @+ F
004011CB  |.  83C4 F4      add    esp, -0C & Z9 {! W  D& K3 n
004011CE  |.  53            push    ebx                              ; /ExitCode
" e1 s/ c% S6 q! v" e004011CF  \\.  E8 7C020000  call    <jmp.&KERNEL32.ExitProcess>      ; \\ExitProcess
; d" J, P, b) q1 t3 ~* s& x004011D4 >/$  55            push    ebp 4 V; V- ]( t; p3 l  n& A
004011D5  |.  89E5          mov    ebp, esp
8 R  S2 K! z: R3 O004011D7  |.  83EC 08      sub    esp, 8 " }: n% L7 [* |# `# P* I
004011DA  |.  83C4 F4      add    esp, -0C % A8 n6 b. o3 c9 R1 g
004011DD  |.  6A 01        push    1 8 k$ R8 I( S& ?6 i
004011DF  |.  A1 DC304000  mov    eax, dword ptr [<&msvcrt.__set_a>
. d# o* ^* V$ S& c! ]' S4 `. g. u! C004011E4  |.  FFD0          call    eax                              ;  <&msvcrt.__set_app_type>
* Q$ X$ j/ Q5 n3 x004011E6  |.  E8 95FFFFFF  call    00401180 ) l  y* w. v6 x+ y
004011EB  |.  31C0          xor    eax, eax
1 ^0 L6 @" i  P! M5 X$ Q1 d1 T1 w# o004011ED  |.  C9            leave
- U" g% \, a) C; b! B004011EE  \\.  C3            retn 1 }2 q; h/ K/ I  q/ d# d! G
004011EF      90            nop ; K1 H# g  t: e% o0 Y3 O2 G
004011F0  /.  55            push    ebp
. V4 e3 W5 m1 P. `004011F1  |.  89E5          mov    ebp, esp # _- x6 P  r, ~) I3 _
004011F3  |.  83EC 08      sub    esp, 8 1 m+ w) h( ]# w: F$ k) b7 M
004011F6  |.  83C4 F4      add    esp, -0C
; m8 O: R) M6 n. O) J  ~$ f. n( |004011F9  |.  6A 02        push    2 2 o/ b3 H! F0 s1 r4 j2 U; l, ~
004011FB  |.  A1 DC304000  mov    eax, dword ptr [<&msvcrt.__set_a>
; P! R/ ~% Q4 k$ n4 p4 k5 ?9 G00401200  |.  FFD0          call    eax                              ;  <&msvcrt.__set_app_type> 5 l# g7 v$ Z" J: K! `" a! x
00401202  |.  E8 79FFFFFF  call    00401180 9 W  G' r$ N, z1 @# B3 ]& D- R
00401207  |.  C9            leave # S2 D7 I3 r) m$ m) o, k
00401208  \\.  C3            retn & o! |1 c7 H5 _; ]: U1 k
00401209      00            db      00 6 b% {# _6 \% @+ {3 a
0040120A      00            db      00
# [; f7 `( R9 {  I0040120B      00            db      00
6 s4 l6 L; w8 l3 a; I0040120C      00            db      00
0 \+ b0 c# W/ o8 y0040120D      00            db      00
, K. V: a9 y/ O& w, M( B0040120E      00            db      00 $ z7 q% W4 R0 X! q$ n3 I
0040120F      00            db      00 * S; q9 {. a6 J& d- L, k
00401210      72            db      72                              ;  CHAR 'r' # W6 O0 G; Y% F6 z; u
00401211      00            db      00
1 ~/ A6 |" i4 c  a$ r- a00401212  .  69 6E 70 75 7>ascii  "input.txt",0
  H: L5 p3 O) |0040121C  .  43 61 6E 27 7>ascii  "Can't Find input"
/ ?4 _- f" S' A; O+ e2 d( h0040122C  .  2E 74 78 74 2>ascii  ".txt!",0 : H: ~: F. J6 C* N; i
00401232      77            db      77                              ;  CHAR 'w'
6 ~4 o' O3 k- S( J00401233      00            db      00
; O% k3 ^/ {* f/ x& H00401234  .  6F 75 74 70 7>ascii  "output.txt",0 3 y. `6 F, F/ A8 ?  W
0040123F  .  43 61 6E 27 7>ascii  "Can't Create out"
* r/ O$ z4 E! Y2 A, t0040124F  .  70 75 74 2E 7>ascii  "put.txt!",0 # }, V2 y- a4 n  T" e$ n
00401258  .  6F 6E 65 20 6>ascii  "one char outpute" - T& S  H, q- e7 _1 D6 X% }
00401268  .  64 0A 00      ascii  "d
# R! D# A. b- Y" c",0
7 W6 ?: j9 V8 q' n; }( u0040126B      90            nop ) O( a- F+ p" X6 S$ z; I
0040126C  /$  55            push    ebp
0 t: H1 e7 S8 c0040126D  |.  89E5          mov    ebp, esp
  m' }' M, z8 c: p; O0040126F  |.  83EC 18      sub    esp, 18 / N$ _( K2 f" N6 Y6 g. j& t
00401272  |.  E8 39010000  call    004013B0 - i9 m4 [# w" \: k$ ]+ P3 A
00401277  |.  83C4 F8      add    esp, -8 2 ~" g% \' [) U% Z: `" a
0040127A  |.  68 10124000  push    00401210                        ; /mode = "r" 4 D5 A6 `" i5 E; l, u5 H
0040127F  |.  68 12124000  push    00401212                        ; |path = "input.txt"
" b! Z; _, C5 ]+ l# Q8 O' @2 G00401284  |.  E8 AF010000  call    <jmp.&msvcrt.fopen>              ; \\fopen / _6 o5 `, W' A6 @. x. M- X
00401289  |.  83C4 10      add    esp, 10
% O0 J  n2 o& c0040128C  |.  89C0          mov    eax, eax
( L0 F3 m3 _/ Q  y& G0040128E  |.  8945 FC      mov    dword ptr [ebp-4], eax
7 j9 M* w( |- O3 k+ Q4 c9 d00401291  |.  837D FC 00    cmp    dword ptr [ebp-4], 0
9 l6 d6 H- k5 ~- C, x00401295  |.  75 10        jnz    short 004012A7 * A) ^! g) k4 K$ I5 y+ P1 c# M
00401297  |.  83C4 F4      add    esp, -0C
/ J, U2 m% m& z3 `* v7 @0040129A  |.  68 1C124000  push    0040121C                        ; /format = "Can't Find input.txt!"
" B" U1 S9 ^$ Y3 z; Z" K: a" y6 o0040129F  |.  E8 8C010000  call    <jmp.&msvcrt.printf>            ; \\printf
3 P  I# W7 n3 l; g004012A4  |.  83C4 10      add    esp, 10
6 `6 G4 T' n7 o' z* c004012A7  |>  83C4 F8      add    esp, -8
8 \. u1 X1 z, U) M9 M004012AA  |.  68 32124000  push    00401232                        ; /mode = "w"
7 A0 t5 G, a0 T+ k004012AF  |.  68 34124000  push    00401234                        ; |path = "output.txt"
# o$ E1 {6 y# |$ _  p! x( G+ Q( f& d004012B4  |.  E8 7F010000  call    <jmp.&msvcrt.fopen>              ; \\fopen
; c+ d0 g% R3 W1 {/ n7 n004012B9  |.  83C4 10      add    esp, 10 4 q) V9 L, H8 {5 S$ X: d
004012BC  |.  89C0          mov    eax, eax
% ~" R5 y+ y/ n  ~/ ?, F004012BE  |.  8945 F8      mov    dword ptr [ebp-8], eax
3 m! `3 X" P: W004012C1  |.  837D F8 00    cmp    dword ptr [ebp-8], 0 0 J4 G( j) Y' }) D  E" e
004012C5  |.  75 10        jnz    short 004012D7 # l/ N1 V5 f6 R+ @5 n. a
004012C7  |.  83C4 F4      add    esp, -0C
  L# f6 h" A4 \' g; q- M004012CA  |.  68 3F124000  push    0040123F                        ; /format = "Can't Create output.txt!" ) D6 S' O  {5 ]3 c, f7 X
004012CF  |.  E8 5C010000  call    <jmp.&msvcrt.printf>            ; \\printf
5 V. s$ F; U6 l% C$ H004012D4  |.  83C4 10      add    esp, 10 3 Y6 ~+ b% R; y& h
004012D7  |>  83C4 F4      /add    esp, -0C . l7 ]9 ~/ t# ?% ]1 k+ M
004012DA  |.  8B45 FC      |mov    eax, dword ptr [ebp-4]
' O8 V' N) H) z* A: f1 K004012DD  |.  50            |push    eax                            ; /stream 3 [4 U6 a* F2 y9 q3 }1 t
004012DE  |.  E8 45010000  |call    <jmp.&msvcrt.fgetc>            ; \\fgetc
. s  `3 i% R5 ~# \3 x- v004012E3  |.  83C4 10      |add    esp, 10
* C! R+ J& w7 ?004012E6  |.  89C0          |mov    eax, eax
0 V5 `2 ?" F; R( n" A- E" i004012E8  |.  8945 F4      |mov    dword ptr [ebp-C], eax 8 k7 l, ?7 C; F( C8 f
004012EB  |.  817D F4 80000>|cmp    dword ptr [ebp-C], 80 . A" v1 k8 M3 b! b  U! ?# k
004012F2  |.  7F 23        |jg      short 00401317

- Q) p. i1 {' A; I2 K004012F4  |.  83C4 F8      |add    esp, -8
2 P5 M8 t* j6 |: d" ]; y4 k5 h3 A004012F7  |.  8B45 F8      |mov    eax, dword ptr [ebp-8] 5 v" W8 K* a) r6 N  t/ \
004012FA  |.  50            |push    eax                            ; /stream " m0 z# E6 G1 n, a
004012FB  |.  8B45 F4      |mov    eax, dword ptr [ebp-C]          ; | ! n! x& x5 l, Q4 p4 w
004012FE  |.  50            |push    eax                            ; |c
% y7 b/ D; {! r' H; f- B004012FF  |.  E8 1C010000  |call    <jmp.&msvcrt.fputc>            ; \\fputc ! f: z5 c: A) o
00401304  |.  83C4 10      |add    esp, 10
0 f; B/ M( z* D5 T7 ]7 F00401307  |.  83C4 F4      |add    esp, -0C
( M  _* F3 ?( s5 v8 S; ^0040130A  |.  68 58124000  |push    00401258                        ; /format = "one char outputed",LF,""
. V1 H4 T. I" \7 {, E0040130F  |.  E8 1C010000  |call    <jmp.&msvcrt.printf>            ; \\printf
& }# R4 G5 C# C: h' U00401314  |.  83C4 10      |add    esp, 10
0 n- G" c2 V' }/ _& f; b00401317  |>  837D F4 FF    |cmp    dword ptr [ebp-C], -1
1 W$ d3 b0 m: g  Z$ z% \6 h$ b0040131B  |.  75 03        |jnz    short 00401320
( _9 `4 L: ]- V  f/ q# ]; Y7 \" a0040131D  |.  EB 03        |jmp    short 00401322
- H9 u" ?. A9 w4 [& N$ G6 v% {8 j" |0040131F  |  90            |nop ! ]6 j. ?" ?" B+ s
00401320  |>^ EB B5        \\jmp    short 004012D7
$ N0 t+ }5 c9 \% M5 l00401322  |>  C9            leave
, G! m. V; _# |2 T* ^7 l$ ^00401323  \\.  C3            retn
# K! }0 ]1 |6 Y$ [( T00401324      00            db      00 9 h% V+ c3 g1 i1 k
00401325      00            db      00 % @1 H5 J% D3 I4 {2 C8 r, b
00401326      00            db      00
7 ^- F( v" U. H3 Y& u7 p00401327      00            db      00
: S" R3 O- z( y9 v3 k00401328      00            db      00
  N' O: _+ U7 I1 j' o  r$ ~00401329      00            db      00
! L4 z. B5 E- C0 e0040132A      00            db      00
  {0 V0 e$ K) \0 X5 J+ t; c0040132B      00            db      00 % e& ~; c* W7 p6 @: `) }4 H
0040132C      00            db      00
7 V& M8 e. Q3 c" t4 P+ t& ~$ T, A0040132D      00            db      00 ) r3 G1 w' X7 Z* K
0040132E      00            db      00
4 Y4 S6 y9 b8 I( f0040132F      00            db      00
7 O8 I) {" L$ f3 {+ L00401330  /.  55            push    ebp
! P1 l1 x; J, U0 _  ]4 w00401331  |.  89E5          mov    ebp, esp # j+ F( Z% ~' s7 f) E! E0 X
00401333  |.  83EC 08      sub    esp, 8 7 m. `7 t' L- z8 y3 A
00401336  |.  A1 10204000  mov    eax, dword ptr [402010]
) f, T9 t4 L: B7 r+ f8 c# A0040133B  |.  8338 00      cmp    dword ptr [eax], 0
+ Q6 T0 d- Z2 c) s) \0040133E  |.  74 1D        je      short 0040135D
1 o! y) C+ _8 H' N% ~; I00401340  |>  A1 10204000  /mov    eax, dword ptr [402010] ; S( w2 t) _( c0 L. c
00401345  |.  8B00          |mov    eax, dword ptr [eax]
' {# Q3 m& g  [; j- o00401347  |.  FFD0          |call    eax
, f/ R" q7 H1 c/ u00401349  |.  A1 10204000  |mov    eax, dword ptr [402010]
( N, V" L2 ~* V/ R' l9 X) z0040134E  |.  8D50 04      |lea    edx, dword ptr [eax+4] 8 r. }( e- Z+ s- ?9 P( M
00401351  |.  8915 10204000 |mov    dword ptr [402010], edx
1 N  i. D/ m% o00401357  |.  8378 04 00    |cmp    dword ptr [eax+4], 0
& K, Z, y$ ~2 Z. G7 t' Z( s: o+ e0040135B  |.^ 75 E3        \\jnz    short 00401340
& G" x4 C4 Z. m! k& E$ J0040135D  |>  C9            leave
8 m; o$ S6 h$ o' z) r0040135E  \\.  C3            retn / p- Z( H& ]; `' D, W3 ?  |
0040135F      90            nop
7 O& u* Q8 `" k7 t2 p/ `$ ^00401360  /$  55            push    ebp 3 \2 S# g- G3 X6 f
00401361  |.  89E5          mov    ebp, esp 6 i0 [2 d' E$ p) o
00401363  |.  83EC 14      sub    esp, 14
0 e9 s/ G, j, b0 `00401366  |.  53            push    ebx
9 m7 A8 O! M9 q2 q' \# K+ l00401367  |.  A1 58144000  mov    eax, dword ptr [401458]
" q1 N8 b: y! l% _$ W0040136C  |.  83F8 FF      cmp    eax, -1
7 K6 J7 g& {* S5 f- _. i, m0040136F  |.  75 19        jnz    short 0040138A
2 o, ]) L9 |- B1 R2 I+ }00401371  |.  31C0          xor    eax, eax
" _0 U$ p5 S1 }' @7 ^9 |8 [! s00401373  |.  833D 5C144000>cmp    dword ptr [40145C], 0 0 Q! ^4 h$ o) T0 r  b4 W
0040137A  |.  74 0E        je      short 0040138A
+ I$ n: C# [; u$ n- V$ o9 n0040137C  |.  BA 5C144000  mov    edx, 0040145C
( A5 |& [1 E5 `6 @00401381  |>  83C2 04      /add    edx, 4
$ Q4 I6 L$ z5 h% n' r8 k4 |00401384  |.  40            |inc    eax
) b: ~/ Z3 R1 e4 G$ e: Y- v00401385  |.  833A 00      |cmp    dword ptr [edx], 0 . h$ q2 o) O( t0 o6 v& [  b
00401388  |.^ 75 F7        \\jnz    short 00401381
1 P& q6 k) r8 L/ W. w* y, o0040138A  |>  89C3          mov    ebx, eax
6 |, T% P. W! Q) M. n0040138C  |.  85DB          test    ebx, ebx
6 d8 j2 Z( }2 c2 M0040138E  |.  74 0C        je      short 0040139C
" w8 F5 j% F$ o+ r$ A00401390  |>  8B049D 581440>/mov    eax, dword ptr [ebx*4+401458]
1 z0 J# h8 c- y4 _! z; e# C# H00401397  |.  FFD0          |call    eax
9 J; K3 R9 u" L& L/ H5 F9 I" R/ w00401399  |.  4B            |dec    ebx
9 G8 y4 D+ K' x) {/ i7 \0040139A  |.^ 75 F4        \\jnz    short 00401390 7 `/ m( `  k8 ~' ^" c" D$ A1 U$ I
0040139C  |>  83C4 F4      add    esp, -0C
+ H* I8 }: a7 u' D) M! Y% ]4 q# e0040139F  |.  68 30134000  push    00401330                        ; /func = engoutpu.00401330 2 S. i/ Z. q! l0 q$ a3 g2 h
004013A4  |.  E8 97000000  call    <jmp.&msvcrt.atexit>            ; \\atexit
! H! C( H2 O+ K( U5 R; e  s, b; k5 Z004013A9  |.  8B5D E8      mov    ebx, dword ptr [ebp-18]
; I+ x- P) G1 _! [1 n1 I$ u; `004013AC  |.  C9            leave   Z/ ~, g# M! y; W4 }- B
004013AD  \\.  C3            retn
6 p, L+ t8 g( l' k0 S* \004013AE      89F6          mov    esi, esi
! {  G  M7 m3 ]" }! N0 n- L4 h; H004013B0  /$  55            push    ebp
1 R0 B: L$ M& I& z, {' M004013B1  |.  89E5          mov    ebp, esp / f3 h5 `' D( r
004013B3  |.  83EC 08      sub    esp, 8 & y$ {. _& U0 ?9 r0 N7 Q# t
004013B6  |.  833D 14204000>cmp    dword ptr [402014], 0
4 m" I, ]0 G5 j+ a004013BD  |.  75 0F        jnz    short 004013CE
' o1 N4 p6 W( W8 [7 R7 r5 E004013BF  |.  C705 14204000>mov    dword ptr [402014], 1 $ s: h) ~/ s6 {& e7 l. e7 @. t
004013C9  |.  E8 92FFFFFF  call    00401360 ) i: p+ N  g6 x- \
004013CE  |>  C9            leave
) H$ m, L( @/ n! x004013CF  \\.  C3            retn : m% }: g9 p0 G! |& `, y
004013D0  .- FF25 AC304000 jmp    dword ptr [<&msvcrt._fmode>]    ;  msvcrt._fmode * ?7 e8 E( o8 ^" k$ \
004013D6      90            nop 8 Z( R8 C8 p" n* x0 H1 _
004013D7      90            nop
( w8 H% g' k. W2 ]5 R004013D8  .- FF25 B4304000 jmp    dword ptr [<&msvcrt._iob>]      ;  msvcrt._iob
' Y( d) B5 d6 O, c/ g004013DE      90            nop
5 `) q. ]8 d- ?) U004013DF      90            nop
, ~1 f$ G2 i8 \8 s004013E0  .- FF25 DC304000 jmp    dword ptr [<&msvcrt.__set_app_ty>;  msvcrt.__set_app_type
5 j5 s  S$ }5 p6 M& l004013E6      90            nop
# [! v$ s  a1 R4 q, M004013E7      90            nop
9 u, T  u. S% ?3 b. _004013E8  $- FF25 A4304000 jmp    dword ptr [<&msvcrt._cexit>]    ;  msvcrt._cexit
3 v$ q6 G) `* m. b004013EE      90            nop / }  D0 `$ ]% k* {. r& D  k2 r) z
004013EF      90            nop
1 {3 \1 w# d6 ~: m# o# d& R004013F0  $- FF25 D0304000 jmp    dword ptr [<&msvcrt.__p__environ>;  msvcrt.__p__environ
7 p' p2 n% x1 Z7 ^3 y+ O2 N004013F6      90            nop
: Q: y6 [* [2 _5 \- m8 l: g' E004013F7      90            nop 0 _( d. S- g* K4 ?: U, R6 j( E7 W* c
004013F8  $- FF25 B0304000 jmp    dword ptr [<&msvcrt._fpreset>]  ;  msvcrt._fpreset
, r. i& J  @4 s3 y- Y4 a4 m004013FE      90            nop # J( y. i/ a* Z2 q1 {! g" r* e4 g
004013FF      90            nop 7 f/ \* v! x) V1 P) z" G
00401400  $- FF25 D8304000 jmp    dword ptr [<&msvcrt.signal>]    ;  msvcrt.signal % B/ v# \9 v% C- x' o) E
00401406      90            nop
( A8 H+ }& @8 D00401407      90            nop * I* j6 {  I0 r  T" |1 c
00401408  $- FF25 A8304000 jmp    dword ptr [<&msvcrt._fileno>]    ;  msvcrt._fileno & ?" }* u, L% Q6 h  F
0040140E      90            nop
  B  N" d  b; T9 E2 k  y1 n0040140F      90            nop . M) R, M0 A! R/ ]9 _
00401410  $- FF25 B8304000 jmp    dword ptr [<&msvcrt._setmode>]  ;  msvcrt._setmode 7 q4 B* M! K3 m5 s3 R: T( `% _
00401416      90            nop ) B3 \* q' I& Z5 h8 }
00401417      90            nop 9 E' L9 x# s6 W; n
00401418  $- FF25 BC304000 jmp    dword ptr [<&msvcrt.__getmainarg>;  msvcrt.__getmainargs
4 u5 A8 }4 `! @: Y2 }& y0040141E      90            nop
) n2 C; w" h) M  r5 P* j0040141F      90            nop 6 y) L$ ^# N' R8 C; g. v
00401420  $- FF25 CC304000 jmp    dword ptr [<&msvcrt.fputc>]      ;  msvcrt.putc ; J$ A+ X) s' O' I4 ]4 t. u' a
00401426      90            nop
- B* u: }) Y+ H00401427      90            nop
7 L# a9 @" ~* \" e00401428  $- FF25 C4304000 jmp    dword ptr [<&msvcrt.fgetc>]      ;  msvcrt.getc
4 ~( v% l0 _  P! g0040142E      90            nop
4 ~6 r, d5 |& F' x# l0040142F      90            nop 0 Q9 ]1 w8 W1 d  ?
00401430  $- FF25 D4304000 jmp    dword ptr [<&msvcrt.printf>]    ;  msvcrt.printf ' P5 h1 c/ r, O, q
00401436      90            nop
* Z" z, K5 F3 Z) M0 t' B00401437      90            nop - M# J8 h3 Z. H: B: B2 ?6 Z
00401438  $- FF25 C8304000 jmp    dword ptr [<&msvcrt.fopen>]      ;  msvcrt.fopen
. F9 h) N" S' ~; O6 `2 {8 j0040143E      90            nop ' Y$ `/ z% y8 o
0040143F      90            nop % ^0 S9 [9 h& R* K4 j2 P
00401440  $- FF25 C0304000 jmp    dword ptr [<&msvcrt.atexit>]    ;  msvcrt.atexit
, v( X" S; s, Z3 J00401446      90            nop ( ~# t- j' I0 h& A; H  ]
00401447      90            nop ( R1 _+ Y5 m7 \; x9 X. ]
00401448  $- FF25 98304000 jmp    dword ptr [<&KERNEL32.SetUnhandl>;  kernel32.SetUnhandledExceptionFilter - h9 o- \0 t* R4 Z, H" A$ r
0040144E      90            nop - E, U+ a/ S; D& U! Q8 D0 o2 L$ M
0040144F      90            nop $ a* {+ L/ T4 c4 x2 C
00401450  .- FF25 94304000 jmp    dword ptr [<&KERNEL32.ExitProces>;  kernel32.ExitProcess
0 m# N. e5 l) Z9 |5 j) i1 S00401456      90            nop
- c/ W: |4 y: k. H9 a1 B0 F! c- j5 E00401457      90            nop
# i. z- N& i% i$ L; D+ f00401458  .  FFFFFFFF      dd      FFFFFFFF
( u6 y! @# d* }( x0040145C  .  00000000      dd      00000000 % I* b, n* T! @: V
00401460      FF            db      FF
) i+ I5 H4 N8 p/ e9 H00401461      FF            db      FF , |: z/ F2 F# C# b* ~4 R  a& U
00401462      FF            db      FF   [( V2 D  Q5 O/ w% }- g% N2 Q
00401463      FF            db      FF ) u/ B% y/ O0 H9 U/ w0 Z; Y
00401464      00            db      00 : U3 p7 M4 H) o  J: f
00401465      00            db      00 0 ~& z0 n, Q4 k* P% }
00401466      00            db      00
8 g& N, `4 r) b4 Y8 q0 N/ ^00401467      00            db      00
作者: shane007    时间: 2009-10-10 22:14
在游戏里面,也可以用相同的修改方法,但是由于代码很多,难点在于找到这个比较点。
' H1 t( N& \- {+ k深绿,你能否把C程序再修改一下,用其他的方法编制出同样功能的程序?
; u# j5 g4 u. @; X" M! M比如不用fgetc这个标准c函数,而用mfc的类似函数来编。7 H6 R, P# p3 `8 Y. P$ g/ `) S
让我们看看生成的汇编代码有什么区别。! e) C7 {# c5 G* J% i
你也可以试着修改一下。
作者: 深绿    时间: 2009-10-12 11:51
MFC是C++的类库吧,我不是很熟悉; J: N% s& i! R' M! t: z

0 [) r. v7 X, t. C说说我对单字节内核的看法:
0 t9 ~$ z( _# c/ [) M/ `1 P% y6 X- b. I3 d1 h
我感觉这个程序并不能很好地模拟单字节内核,因为这个程序只是过滤了一些字符,$ z! M$ ?: F; T: W: A
然后将剩余的输出到一个文件里。而游戏的内核,很有可能是在输出到屏幕的时候进行的过滤。- h; g7 k: k& e

' P; S' J2 m/ p$ L) s! ^4 i$ E举个例子:当我们用记事本打开txt看到中文的时候,是记事本将中文打印到屏幕,而如果这不是记事本,是单字节的内核( V7 U: Y2 I! P5 D
就很有可能无法显示中文,尽管那些中文数据都存在。
( o3 Z& e" ?: f1 R' p- E: k( G1 J& F
所以,上面删掉那两行的行为其实没有什么意义,就相当于在源代码中,把判断<0x80的语句删掉,就相当于直接把input.txt的东西完全复制到output.txt里,并没有真正体现单字节内核的意义。因为真正需要考量的输出环节,是在打开记事本,把这些文字输出到屏幕上的过程。
0 T" o/ c3 {( u
8 I# d3 F8 i6 T3 i- {6 B9 H因此我很怀疑,游戏是否会用这种(<0x80)过滤方式。
/ ?1 N! q  k; S' _5 X$ J* ~; r3 b
中文的显示方式是读取2字节—>获得区位码—>在字库中读取数据—>显示汉字。* Y9 @5 O- z7 N( B2 T1 ^# ]5 E
( R, i6 M# U' f
那么英文的应该类似,读取一个字节——获得编码——在字库中读取数据——显示文字( d: v. d/ ]3 J1 g$ I% w5 l" I
1 n) E' z5 h/ s- F' u
那么当它读取进中文字节时,很有可能是获得的编码在字库中找不到数据,所以自动过滤了。
& o! k8 H3 N- H3 I: F3 l5 y7 O; ]$ ?4 q( ~5 b
就我所知,很多内核不支持双字节是因为它不会在读到大于0x80的字节时多读1个字节,而并非直接过滤掉大于0x80的字节
作者: shane007    时间: 2009-10-12 13:09
其实,单字节内核一般有2种情况。
1 z" F; O  L4 J+ t- x1. 对大于0x80的字节不做任何处理,输出到画面就是一个中文字符会变为2个字符
- @* r. P' \8 `  L: x+ c2. 跳过大于0x80的字节,读取后一个字节,输出到画面就是中文字符被过滤了
* E/ Z" F9 r9 I  M5 N* |
, l9 V& T) `$ M; ~4 z. v真正的游戏应该会用这2种方式中的一种来处理。  E" f# V& q7 f8 ^0 ^
这个单字节内核模拟程序其实只模拟了2的情况。
. Z# Y/ k7 h) a+ t  Y9 |" T要模拟1的话就要制作一个图形程序了。
' l. z% b# e( k6 k/ {, v& u- F% O8 Z& e
这个单字节内核模拟程序本身的意义其实不大。
! M& c4 y. I+ a: N, [. M其实我是想开始更多地在汇编层次上研究汉化,当作是抛砖引玉吧。
作者: 深绿    时间: 2009-10-12 15:34
这样看来,对这两种类型的改造方式是一样的,都是让程序在碰到大于0x80的字节时两个两个读取。
  l! i4 s# k9 r所不同的是后者由于要做这么个比较的处理,所以更方便我们定位到需要更改的位置。; G! d: I( A: l
这样的理解对不?
作者: shane007    时间: 2009-10-12 16:44
引用第8楼深绿于2009-10-12 15:34发表的  :2 h  \2 c% O. e2 {( w$ w! B
这样看来,对这两种类型的改造方式是一样的,都是让程序在碰到大于0x80的字节时两个两个读取。( _) u; k% u5 Z+ C9 V
所不同的是后者由于要做这么个比较的处理,所以更方便我们定位到需要更改的位置。
* n9 p2 n' u. z8 n" u0 n这样的理解对不?
0 F$ S4 Y" @% D8 @8 S8 J* z. j, R
理解完全正确。' [& \$ k, v; E8 ~9 L' R
不过,就是简单的和0x80来比较,汇编代码也会有多种形式,不如test,cmp 等等,而且程序里还会有其他和0x80比较的地方,要找到关键的比较点,非常不容易。" N# {& _4 N& F8 X+ w7 @

+ e+ c' B' D4 `2 I有一个笨办法,查找2进制码80。如果汇编代码是test,cmp等于语句,那么就有可能是比较点。
3 x4 O0 z* f9 H( E2 @然后逐个nop测试,看有什么变化。6 n, b+ Y: g8 A+ F, j& b4 R

, U4 i" Y' n! j- G) ~1 r% B你可以参考一下这篇帖子2 F  I( J0 G2 O/ p( j
游戏汉化中的双字节问题处理原理/ o- b+ S3 T& m8 e; l  D( J8 T
https://www.chinaavg.com/read.php?tid=18709! N; z$ L" x' D% G# j3 L: y5 t- k7 Z" g
作者好像是左贤王主力人员。




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