从microsoftc++中读取RSP寄存器

visual Reading the RSP register from Microsoft C++

本文关键字:RSP 寄存器 读取 microsoftc++      更新时间:2023-10-16

由于内联汇编器在编译x64体系结构时在Microsoft c++中不可用,我无法弄清楚如何访问RSP寄存器(堆栈指针)。我知道我可以使用RtlCaptureContext读取它,但这也会执行许多不必要的操作。而且它会慢几千倍(对于我来说,这是不可接受的)。如果我写一个单独的ASM函数,RSP显然会改变,所以这也不是一个选择。

那么如何使用Microsoft c++读取x64 RSP寄存器的内容呢?

您可以使用_AddressOfReturnAddress()(参见MSDN参考)的内在属性间接获得它。显然,您无法确切地知道当前堆栈帧停止的位置,但是您可以使用任何堆栈变量并通过查看生成的程序集来猜测它。

结合Olipro的建议:在独立函数中使用_AddressOfReturnAddress(),获得堆栈地址变得非常容易。更不用说用C编写的函数很有可能只包含对这个内部函数的调用,而被内联。

好的,我已经摆弄了一下,让它工作了;您不能让编译器内联它,但幸运的是,您不需要它,只需将它放入.s或.asm文件中并使用' ml64/c yourasm进行编译。S",并将。obj交给链接器。

.CODE
     getRSP PROC
     mov rax, rsp
     add rax, 8
     ret
     getRSP ENDP
     END

那么在C端你只需要extern "C" __int64 getRSP();

您是否意识到_AddressOfReturnAddress的内在?这不是RSP寄存器本身,但它本身有点不稳定。

我能想到的只有两种方法:

1)创建一个ASM文件,其中包含将rsp移动到rax中并返回的指令,然后看看是否可以让编译器将其内联。

2)如果上面是一个不去,声明一个易失性指针变量,并使用__nop()内在给自己足够的空间来修补必要的指令后构建(或者检查,只是分配一个值给你的易失性指针几次,并替换它)

__getCFS, __getPSP,可能是__getReg ?

您还可以链接到一个MinGW-w64对象文件,该文件内联执行汇编程序。