arg在ASM函数中包含什么?

时间:2013-12-11 18:07:35

标签: c assembly reverse-engineering

Main

push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h
sub     esp, 30h
mov     dword ptr [esp], 8 ; size
call    _malloc
mov     [esp+2Ch], eax
mov     dword ptr [esp+4], 4
mov     eax, [esp+2Ch]
mov     [esp], eax
call    __start

__start

arg_0= dword ptr  8
arg_4= dword ptr  0Ch

push    ebp
mov     ebp, esp
mov     eax, [ebp+arg_4]
mov     edx, eax
sar     edx, 1Fh
shr     edx, 1Eh
add     eax, edx
and     eax, 3
sub     eax, edx
mov     [ebp+arg_4], eax
mov     eax, [ebp+arg_4]
cmp     eax, 1
jz      short loc_80489F0

上面的代码代表了我正在处理的项目的一部分,我需要将此程序集反向工程为相应的C代码。我相信我将main()放在堆栈上,其中[esp]包含指向malloc的指针,[esp + 4]包含数字4。

我在确定哪个arg包含时遇到了一些困难,我假设arg_0包含4,但是arg_4让我被抛弃了。

arg_0和arg_4是指什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

将定义视为C中的#define arg_0 8#define arg_4 0xc。它们由编译器发出,以可读方式将参数的符号名称连接到堆栈上的偏移量。在这种情况下, arg_4从基指针开始为正12。在这个调用约定(看起来像Microsoft)中,基指针ebp指向前一个基指针,它位于返回地址之下。相对于ebp,参数处于正偏移量,而局部(自动)变量处于负偏移量。

编译器已在Main中应用了一个优化,以便为malloc_start的两次调用构建堆栈帧,其中一个设置为esp。要查看发生了什么,请绘制由sub esp, 30h指令分配的堆栈的48个字节的图片,并仔细跟踪每个指令。真相将会消失。