_malloc 在汇编中到底做了啥?
Posted
技术标签:
【中文标题】_malloc 在汇编中到底做了啥?【英文标题】:What exactly does _malloc do in assembly?_malloc 在汇编中到底做了什么? 【发布时间】:2013-12-28 21:28:01 【问题描述】: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);
【问题讨论】:
【参考方案1】:函数 malloc() 将分配 size
字节大的内存块。如果可以分配请求的内存,则返回指向内存块开头的指针。
注意:接收到的内存块的内容没有初始化。
malloc() 的语法:
void *malloc(size_t size);
参数:
内存块的大小,以字节为单位。
返回值:
如果请求成功,则返回指向内存块的指针。
如果函数未能分配请求的内存块,则返回 NULL,也可以通过成功调用大小为零的 malloc()
返回 NULL。
如this CS 301 lecture by Dr. Lawlor中所述:
从汇编语言调用 Malloc
这是一个非常简单的函数:将 BYTES 的数量传递给你 want 作为唯一的参数,在 rdi 中。 “调用malloc。”你会得到一个 指向在 rax 中返回的分配字节的指针。清理空间 之后,将指针复制到 rdi,然后“免费通话”(我要离开了 关闭下面的免费,因为您需要堆栈才能正确执行此操作)。
这是汇编内存访问的完整示例。我打电话给 malloc 获得 40 字节的空间。 malloc 返回 this 的起始地址 rax 中的空间(eax 的 64 位版本)。也就是 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 寄存器复制,您可以指定您想要一个 使用括号前的“DWORD”进行 32 位内存读写, 像这样:
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
【讨论】:
x84_64 和 x86 在不同的操作系统上有不同的调用约定,所以这个答案只是切线相关的。例如,在 OP 的情况下,参数显然是在堆栈中传递的,而不是在寄存器中。 你为什么说 x86_64?【参考方案2】:我想强调另一个很好的答案中没有提到的东西。
malloc
在内部是如何工作的?它在汇编中做了什么来创建所需的内存?
根据this website、malloc
和其他内存调用使用操作系统API函数在堆上分配和释放内存。
【讨论】:
以上是关于_malloc 在汇编中到底做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )