-1

我正在使用 detour 挂钩一些函数,该函数将一些变量保存在寄存器中,以便挂钩到函数并在挂钩后返回真实代码(并且为了它能够工作)我需要将值保存在这些寄存器并在之后加载它们。使用 32 位版本,我只运行了以下代码:

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

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

__asm
{
    mov esi, esireg
    mov eax, eaxreg
}

我的问题是,在视觉上的 64 位中,在 google 中搜索了一下后没有内联汇编,任何人都知道如何保存寄存器值,然后写入那里?

我尝试在此视频中创建一个外部 asm 文件:https ://www.youtube.com/watch?v=XqZCkYr1FB8

问题是我需要将寄存器值保存到一个变量中,所以当我尝试编写时:

savereg proc
    mov esireg, esi
savereg endp

它说:“未定义的符号 esireg”

有什么想法吗?

4

1 回答 1

1

您已经发现您需要一个单独的汇编代码源。如果要保存寄存器,可以将它们保存在汇编源文件或 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
于 2020-01-26T13:53:30.590 回答