x86 asm:帮助反汇编代码

时间:2011-06-12 11:54:23

标签: assembly reverse-engineering disassembly

有人可以解释我的asm代码吗?它能做什么? 我已经评论了一下..
编辑:C ++,使用MS Visual C ++ 2008 Express Eddition编译 - >重组

.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

3 个答案:

答案 0 :(得分: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

看起来正在扫描一个空字节并计算end - start + 1,其中start + 1来自edx

这就是strlen会做的事情!

这里有些魔法吗?!

答案 1 :(得分:0)

lea没有取消引用任何内容。它只是在第二个参数中对寄存器进行算术运算,并将结果存储在第一个参数中。

lea     eax, [ebp+procedureVariable_C];

假设procedureVariable_C是一个常量偏移量,它会添加该偏移量来计算指向相应变量的指针。

答案 2 :(得分:0)

你想知道你还不知道的是什么?这是几个函数调用。第一个在EAX中通过引用传递一个本地参数,第二个获取EAX作为参数,可能是第一次调用的结果,或者也许只是在EBX中传递给该块的内容。

我们不知道使用什么调用约定,这个汇编程序是反汇编的编译器输出还是“人工”编码,没有上下文,没有关于函数执行或返回的线索。我们并没有很好的帮助。

此代码没有任何异常。有什么问题?

RGDS, 马丁