相关疑难解决方法(0)

阴影空间示例

编辑:

我在下面接受了一个答案,并在代码的最终修订版中添加了自己的答案。希望它能向人们展示阴影空间分配的实际示例,而不是更多的单词。

编辑2:我还设法在(所有内容的)YouTube视频的注释中找到了调用约定PDF的链接,该链接在Shadow Space和Linux的Red Zone上有一些有趣的花絮。可以在这里找到:http : //www.agner.org/optimize/calling_conventions.pdf

原版的:

我在这里和整个Internet上都看过其他几个问题,但是当在64位Windows程序集中调用子例程/ Windows API时,似乎找不到合适的分配“影子空间”的示例。

我的理解是:

  • 来电者应sub rsp,<bytes here>call callee
  • 被调用方应使用它来存储寄存器(如果需要)(或局部变量,如果不需要保存寄存器)
  • 呼叫者将其清除,例如: add rsp,<bytes here>
  • 分配的数量应与32个字节对​​齐

考虑到这一点,这就是我尝试过的方法:

section .text

start:

    sub rsp,0x20 ; <---- Allocate 32 bytes of "Shadow space"

    mov rcx,msg1
    mov rdx,msg1.len
    call write

    add rsp,0x20

    mov rcx,NULL
    call ExitProcess

    ret

write:

    mov [rsp+0x08],rcx      ; <-- use the Shadow space
    mov [rsp+0x10],rdx      ; <-- and again

    mov rcx,STD_OUTPUT_HANDLE   ; Get handle to StdOut
    call GetStdHandle

    mov rcx,rax         ; …
Run Code Online (Sandbox Code Playgroud)

windows 64-bit assembly nasm

5
推荐指数
1
解决办法
1220
查看次数

标签 统计

64-bit ×1

assembly ×1

nasm ×1

windows ×1