2012-09-07 68 views
3

這是從一個86的EXE即得(可能)與MSVC創建拆卸。
這些循環的任何原因,還是他們只是膨脹?看似不必要循環

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 

ESI是以後的一種跳錶的使用,但這似乎對我來說,過於複雜的方式來設置ESI兩次

+1

有一個背後的代碼?或者你剛剛獲得了ASM? – SmartK8

+0

如果我沒有弄錯,它將ESI從0設置爲-17兩次。導致ESI = -17。 – SmartK8

+2

其實我只是想到了一些東西。你有沒有檢查它是否有任何額外的入口點? – harold

回答

2

如果沒有其他入口點和無自修改代碼,代碼如何可以通過一種獨特的方式:

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)這是肯定的,那就是代碼不是從別的地方修改,此代碼不能用作數據,代碼可以替換爲:

如果flags'值這個代碼結束後使用:

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

如果flags'值並不重要:

mov eax,-17 
mov ecx,0 
mov esi,-16