_malloc究竟在汇编中做了什么?

时间:2013-12-11 03:46:16

标签: c assembly x86 reverse-engineering

public main
main proc near
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

上面的代码代表了我正在处理的大型项目的一部分。我试图将此代码转换为C等效,但我很难理解malloc如何工作。

我认为8个字节将是所分配内存的大小;但是,我不确定这条线。

mov      eax, [esp+2ch] 

malloc对eax做了什么?

此外,这是否等同于C代码?

int main(void)
{
int *ptr1;
ptr1 = (int *)malloc(sizeof(8));
*ptr1 = 4;
__start(*ptr1);

2 个答案:

答案 0 :(得分:17)

函数malloc()将分配一个size字节大的内存块。如果可以分配所请求的内存,则将指针返回到内存块的开头。

注意:未初始化收到的内存块的内容。

malloc()的语法:

void * malloc(size_t size);

<强>参数:

内存块的大小(以字节为单位)。

返回值

如果请求成功,则返回指向内存块的指针。 如果函数未能分配请求的内存块,则返回NULL,成功调用大小为malloc()时也可返回NULL。

this CS 301 lecture by Dr. Lawlor中所述:

  

从汇编语言调用Malloc

     

这是一个非常简单的功能:传递 BYTES 的数量   想要作为唯一的参数,在rdi中。 “打电话给malloc。”你会回来的   指向rax中返回的已分配字节的指针。清理空间   然后,将指针复制到rdi,然后“免费拨打电话”(我要离开了   关闭下面的免费,因为你需要堆栈来正确地做到这一点。

     

这是汇编内存访问的完整示例。我把malloc叫做   获得40个字节的空间。 malloc返回此的起始地址   rax中的空间(64位版本的eax)。也就是rax寄存器   就像一个指针。然后,我可以从中读取和写入   使用通常的汇编括号语法指向内存:

mov edi, 40; malloc's first (and only) parameter: number of bytes to allocate
extern malloc
call malloc
; on return, rax points to our newly-allocated memory
mov ecx,7; set up a constant
mov [rax],ecx; write it into memory
mov edx,[rax]; read it back from memory
mov eax,edx; copy into return value register
ret
     

您可以指定您想要的,而不是通过ecx寄存器进行复制   32位存储器使用括号前面的“DWORD”进行写入和读取,   像这样:

mov edi, 40; malloc's first (and only) parameter: number of bytes to allocate
extern malloc
call malloc
; on return, rax points to our newly-allocated memory
mov DWORD [rax],7; write constant into memory
mov eax,DWORD [rax]; read it back from memory
ret

对于汇编语言中的malloc ..请参阅此链接malloc

答案 1 :(得分:0)

我想强调其他好答案中未提及的内容。

malloc在内部如何工作?在组装中如何创建所需的内存?

根据this websitemalloc和其他内存调用,使用 操作系统API函数 在堆上分配和释放内存。 / p>