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(),大小为零.
从汇编语言调用Malloc
这是一个非常简单的功能:在rdi中传递你想要的BYTES数量作为唯一参数."打电话给malloc." 您将获得指向rax中返回的已分配字节的指针.要在之后清理空间,将指针复制到rdi,然后"免费调用"(我在下面留下免费的,因为你需要堆栈才能正确完成).
这是汇编内存访问的完整示例.我调用malloc来获得40个字节的空间.malloc在rax(64位版本的eax)中返回此空间的起始地址.也就是说,rax寄存器就像一个指针.然后,我可以使用通常的汇编括号语法从指向内存中读取和写入:
Run Code Online (Sandbox Code Playgroud)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您可以指定要使用括号前面的"DWORD"进行32位内存写入和读取,而不是通过ecx寄存器进行复制,如下所示:
Run Code Online (Sandbox Code Playgroud)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