【问题标题】: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);

【问题讨论】:

    标签: c assembly x86 reverse-engineering


    【解决方案1】:

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

    注意:接收到的内存块的内容没有初始化。

    ma​​lloc() 的语法:

    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 websitemalloc和其他内存调用使用操作系统API函数在堆上分配和释放内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-10
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2011-12-10
      • 2016-10-26
      • 2016-02-12
      相关资源
      最近更新 更多