从microsoftc++中读取RSP寄存器
visual Reading the RSP register from Microsoft C++
由于内联汇编器在编译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对象文件,该文件内联执行汇编程序。
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- xmm 寄存器中的__m128何时?
- 英特尔 Pin:分析例程检测 ah 寄存器而不是 RSP (REG_STACK_PTR)
- 如何读取寄存器:RAX、RBX、RCX、RDX、RSP.RBP、RSI、C或C++中的RDI
- 从microsoftc++中读取RSP寄存器