如何在调用堆栈时调用来自NASM dll的malloc

时间:2018-02-09 00:26:19

标签: assembly dll malloc nasm ctypes

我使用Python CType调用64位NASM dll。下面的示例是一个精简版本,它使用malloc简单地分配80个字节的内存,然后返回。

根据昨天在How to use malloc and free in 64-bit NASM?发表的帖子的回复,我想我可以从rsp中减去40个字节,调用malloc,并从malloc返回时添加rsp,32。我认为malloc会在返回时从堆栈中弹出8字节的返回地址,然后我将其他32个字节添加到rsp并从DLL返回。但是,在进入malloc时,堆栈帧不是16字节对齐的,所以这就是我认为问题所在。

我得到的错误是“访问冲突写入0x0000000000000000”,所以显然我写入了一些不属于我的调用函数的内存。

我还没有找到任何关于在这种情况下我应该做什么到16字节对齐的信息。

这是NASM代码:

[BITS 64]

export CallTest_fn

extern malloc

section .data align=16
temp_var: dq 1534.76
counter: dq 0
sizeof_array: dq 80
array_pointer: dq 0

section .text

;__________

CallTest_fn:
push rdi
push rbp

; Allocate memory buffer
mov rcx,qword[sizeof_array]
xor rax,rax
sub rsp,40
call malloc
add rsp,32

pop rbp
pop rdi
ret

.data部分中的变量和开始和结束时的push-pop序列供以后使用,但我将它们保留在这里。

这是Python ctypes代码:

hDLL = ctypes.WinDLL(r"C:/NASM_Test_Projects/Test_Malloc_Return/Test_Malloc_Return.dll")
CallTest = hDLL.CallTest_fn
CallTest.restype = ctypes.c_int64

ret_ptr = CallTest()  #call the dll

非常感谢您对此的任何帮助。

0 个答案:

没有答案