【发布时间】:2021-11-02 21:22:41
【问题描述】:
我知道 x64 调用约定,前四个参数在 rcx、rdx、r8、r9 中,其余的都在堆栈上。但我的问题是如何推动这些论点?
call_func PROC
push rbp
mov rbp, rsp
mov rbx, rcx ; move C function address to rbx
mov rcx, 1 ; some dummy value
mov rdx, 2 ; some dummy value
mov r8, 3 ; some dummy value
mov r9, 4 ; some dummy value
; and now I want to push fifth argument, but how?
call rbx ; call the function
mov rsp, rbp
pop rbp
ret
call_func ENDP
我已经尝试过mov QWORD PTR [rsp + 20h], 1,但是当从这个 asm 函数返回时,RIP 寄存器被设置为奇怪的值,比如 0x0000000000000001。我知道RIP寄存器是指令指针,但是为什么要修改它呢?
我又尝试了一件事,让函数接受 6 个参数,当我传递像 mov QWORD PTR [rsp + 28h], 1 这样的第六个参数时,应用程序很好,传递了第六个参数,第五个有奇怪的值。
【问题讨论】:
-
这样做会覆盖堆栈中较高的值。你应该看看
push指令。 -
您需要先分配堆栈,包括空间影子空间。例如。做
sub rsp, 48然后你可以使用你的mov QWORD PTR [rsp + 20h], 1。 -
@Jester 谢谢,现在它可以工作了,很奇怪,因为我之前尝试过这个,但可能没有
mov QWORD PTR [rsp + 20h], 1