c++ visual studio 64bit | save registers value

c++ visual studio 64bit | save registers value

本文关键字:save registers value 64bit visual studio c++      更新时间:2023-10-16

我正在使用绕道来钩住一些函数,这个函数在寄存器中保存了一些变量,以便挂接到函数并在钩子后返回实际代码(并且为了它能工作(我需要将值保存在这些寄存器中并在之后加载它们。对于 32 位版本,我刚刚运行了以下代码:

DWORD esireg = 0;
DWORD eaxreg = 0;
__asm
{
mov esireg, esi
mov eaxreg, eax
}

现在我的代码运行,完成后我加载寄存器。

__asm
{
mov esi, esireg
mov eax, eaxreg
}

我的问题是,在 64 位的 Visual 中,在 Google 中搜索了一点后没有内联程序集,任何人都有任何想法,我如何保存寄存器值并在写入之后写入那里?

我尝试创建一个外部asm文件,如以下视频所示:https://www.youtube.com/watch?v=XqZCkYr1FB8

问题是我需要将寄存器值保存到变量中,因此当我尝试写入时:

savereg proc
mov esireg, esi
savereg endp

它说:"未定义的符号Esireg">

伙计们有什么想法吗?

您已经发现需要单独的程序集代码源。如果要保存寄存器,可以将它们保存在程序集源文件或C++源文件中声明的全局变量中。如果变量是在C++源文件中声明的,则它们需要在C++文件中公开,并在程序集源文件中声明为"extrn"。将数据保存在程序集文件中的示例:

.data
raxreg  dq      0
rsireg  dq      0
.code
;       ...
mov     raxreg,rax
mov     rsireg,rsi
;       ...
mov     rax,raxreg
mov     rsi,rsireg

若要在生成中包含程序集文件,需要定义自定义生成步骤。右键单击程序集源文件名,然后单击属性。关闭"从构建中排除",然后定义自定义构建步骤。对于调试版本,请使用:

command line: ml64 /c /Zi /Fo$(OutDir)examplea.obj examplea.asm
outputs:      $(OutDir)examplea.obj

对于发布版本,不使用/Zi

command line: ml64 /c /Fo$(OutDir)examplea.obj examplea.asm
outputs:      $(OutDir)examplea.obj