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

use*_*458 15 c x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

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

我估计8个字节将是被分配的内存的大小; 但是,我不确定这条线.

mov      eax, [esp+2ch] 
Run Code Online (Sandbox Code Playgroud)

malloc对eax做了什么?

那么这是等效的C代码吗?

int main(void)
{
int *ptr1;
ptr1 = (int *)malloc(sizeof(8));
*ptr1 = 4;
__start(*ptr1);
Run Code Online (Sandbox Code Playgroud)

Saj*_*ath 17

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

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

malloc()的语法:

void*malloc(size_t size);

参数:

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

返回值:

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

正如Lawlor博士CS 301讲座中所述:

从汇编语言调用Malloc

这是一个非常简单的功能:在rdi中传递你想要的BYTES数量作为唯一参数."打电话给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
Run Code Online (Sandbox Code Playgroud)

您可以指定要使用括号前面的"DWORD"进行32位内存写入和读取,而不是通过ecx寄存器进行复制,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

对于汇编语言中的malloc,请参见此链接malloc

  • x84_64和x86在各种操作系统上有不同的调用约定,因此这个答案只是切线相关.例如,在OP的情况下,参数显然是在堆栈上传递的,而不是在寄存器中传递. (2认同)
  • 你为什么在谈论x86_64? (2认同)

Adm*_*ama 5

我想强调一下其他好答案中没有提到的事情。

内部如何malloc运作?它在汇编中做什么来创建所需的内存?

根据该网站malloc其他内存调用使用操作系统 API 函数来分配和释放堆上的内存。

  • 正是我正在寻找的答案,谢谢! (3认同)