3

これは、(おそらく) MSVC で作成された x86 exe から逆アセンブルされたものです。
これらのループの理由は何ですか?

00428D08   |> B9 02000000    MOV ECX,2
00428D0D   |> 33C0           /XOR EAX,EAX
00428D0F   |> 8BF0           |/MOV ESI,EAX
00428D11   |. 48             ||DEC EAX
00428D12   |. 83F8 E9        ||CMP EAX,-17
00428D15   |.^7F F8          |\JG SHORT File.00428D0F
00428D17   |. 49             |DEC ECX
00428D18   |.^75 F3          \JNZ SHORT File.00428D0D

ESIESI後で一種のジャンプ テーブルで使用されますが、これは2 回設定する非常に複雑な方法のように思えます

4

1 に答える 1

1

追加のエントリポイントや自己変更コードがない場合、コードをウォークスルーするための独自の方法が1つあります。

mov ecx,2              ; ecx = 2
xor eax,eax            ; eax = 0, ecx = 2, SF = 0, ZF = 0
mov esi,eax            ; eax = 0, ecx = 2, esi = 0, no changes to flags
dec eax                ; eax = 0xFFFFFFFF, ecx = 2, esi = 0, SF = 1, ZF = 0
cmp eax,-17            ; OF = 0, SF = 1, ZF = 0
jg SHORT File.00428D0F ; jump if (SF==OF and ZF==0) -> jump.

mov esi, eax; eax= 0xFFFFFFFF、ecx= 2、esi= 0xFFFFFFFF ... 16の内部ループの後、状況は次のようになります。

mov esi,eax            ; eax = -16, ecx = 2, esi = -16
dec eax                ; eax = -17, ecx = 2, esi = -16, SF = 1, ZF = 0
cmp eax,-17            ; OF = 0, SF = 0, ZF = 1
jg SHORT File.00428D0F ; jump if (SF==OF and ZF==0) -> no jump.
dec ecx                ; eax = -17, esi = -16, ecx = 1, SF = 0, ZF = 0

外側のループは簡単です。00428D08(このコードの先頭)以外に他のエントリポイントがないことが確実な場合mov ecx,2、つまりコードが他の場所から変更されておらず、このコードがデータとして使用されていない場合、コードは次のように置き換えることができます。

このコードの終了後にフラグの値が使用される場合:

mov eax,-17
cmp eax,-17
mov ecx,1
dec ecx
mov esi,-16

フラグの値が重要でない場合:

mov eax,-17
mov ecx,0
mov esi,-16
于 2012-09-07T22:41:08.243 に答える