2011-06-12 213 views
1

任何人都可以解釋下面的asm代碼嗎?它能做什麼? 我已經評論了一點了..
編輯:C++,與微軟的Visual C++ 2008速成Eddition編譯 - >重組x86 asm:幫助反彙編代碼

.text:39552AF5 pop  ecx 
.text:39552AF6 push eax    ; void * 
.text:39552AF7 lea  eax, [ebp+procedureVariable_C] ; get a proc variable from stack to eax? 
.text:39552AFA call sub_39501565 ; call procedure with arguments: eax(void) and the lea result? 
.text:39552AFF mov  ecx, dword_395D0A44 ; dword_395D0A44("official") char gets moved into ecx 
.text:39552B05 mov  eax, ebx ; ? 
.text:39552B07 call sub_39572981 ; ? no arguments? 

.text:39501565 ; int __stdcall sub_39501565(void *)
.text:39501565 sub_39501565 proc near ; CODE XREF: sub_39501423+1Cp
.text:39501565 ; sub_39501803+1Cp ...
.text:39501565
.text:39501565 arg_0 = dword ptr 4
.text:39501565
.text:39501565 cmp [esp+arg_0], 0
.text:3950156A push edi
.text:3950156B mov edi, eax
.text:3950156D jnz short loc_39501573
.text:3950156F xor eax, eax
.text:39501571 jmp short loc_39501583
.text:39501573 ; ---------------------------------------------------------------------------
.text:39501573
.text:39501573 loc_39501573: ; CODE XREF: sub_39501565+8j
.text:39501573 mov eax, [esp+4+arg_0]
.text:39501577 lea edx, [eax+1]
.text:3950157A
.text:3950157A loc_3950157A: ; CODE XREF: sub_39501565+1Aj
.text:3950157A mov cl, [eax]
.text:3950157C inc eax
.text:3950157D test cl, cl
.text:3950157F jnz short loc_3950157A
.text:39501581 sub eax, edx
.text:39501583
.text:39501583 loc_39501583: ; CODE XREF: sub_39501565+Cj
.text:39501583 push eax ; int
.text:39501584 push [esp+8+arg_0] ; void *
.text:39501588 call sub_39501524
.text:3950158D mov eax, edi
.text:3950158F pop edi
.text:39501590 retn 4
.text:39501590 sub_39501565 endp

+0

我懷疑這段代碼使用了一個使用'EAX'和'ECX'作爲參數的調用約定。像Borland的fastcall/register約定一樣。但是,如果沒有你所稱呼的功能的內容,這很難說。如果你的程序使用某種全程序優化,這些甚至可能不是傳統的調用約定。 – CodesInChaos 2011-06-12 12:03:20

+0

添加您要調用的函數的代碼。 – CodesInChaos 2011-06-12 12:06:24

+0

太大又複雜,它是一個非常大的反彙編DLL。我想看到有關命令的一般信息..? – asm 2011-06-12 12:11:06

回答

0

執法機關不解除引用任何東西。它只是對第二個參數中的寄存器進行算術運算並將結果存儲在第一個參數中。

lea  eax, [ebp+procedureVariable_C]; 

假設procedureVariable_C是恆定偏移它增加了該偏移量來計算指針到相應的變量。

0

你想從SO知道你還不知道什麼?這是一對夫婦函數調用。第一個在EAX中通過引用傳遞本地參數,第二個將EAX作爲參數獲取,可能是第一次調用的結果,或者可能只是EBX中傳遞給此塊的內容。

我們不知道使用了哪些調用約定,無論此彙編程序是反彙編編譯器輸出還是「人」編碼,沒有上下文,不知道函數做什麼或返回什麼。我們並不完全有能力提供幫助。

這段代碼沒有什麼特別之處。有什麼問題?

RGDS, 馬丁

1

這部分

.text:39501573 
.text:39501573 loc_39501573: ; CODE XREF: sub_39501565+8j 
.text:39501573 mov eax, [esp+4+arg_0] 
.text:39501577 lea edx, [eax+1] 
.text:3950157A 
.text:3950157A loc_3950157A: ; CODE XREF: sub_39501565+1Aj 
.text:3950157A mov cl, [eax] 
.text:3950157C inc eax 
.text:3950157D test cl, cl 
.text:3950157F jnz short loc_3950157A 
.text:39501581 sub eax, edx 

看起來是掃描一個NULL字節和計算end - start + 1,其中start + 1來自edx

這就是strlen會做的!

這裏有一些魔法嗎?!

+0

謝謝,但魔術是在代碼段我評論:) – asm 2011-06-12 19:33:55