c++ visual studio 64bit | save registers value
c++ visual studio 64bit | save registers value
我正在使用绕道来钩住一些函数,这个函数在寄存器中保存了一些变量,以便挂接到函数并在钩子后返回实际代码(并且为了它能工作(我需要将值保存在这些寄存器中并在之后加载它们。对于 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
相关文章:
- c++ visual studio 64bit | save registers value
- 序列化没有"save"方法的大型结构
- Save MoveIt! Octomap
- "save"的设计模式
- 如何在MSXML中将变量传递给IXMLDOMDocument::save方法
- 调用未定义的函数"save"
- Qt:通过 QMainWindow::save/restoreState 控制 DockWidgets
- QPixmap::save() 返回成功,但不生成任何文件
- Save away ostringreader.str().c_str()
- 用于"Save as"的SQLlite和用于大文件的自动保存功能
- IPersistFile::Save方法始终无法保存快捷方式
- 如何在 Windows 上使用 GetSave文件名检测"Save as type:"组合框何时更改?
- Directx 11 Registers
- SetThreadContext x64 volatile registers
- 以编程方式调用"Save to PDF..."表
- 你能在这个简单的代码中从析构函数"save"动态内存吗?
- 如何检查 QImage::save() 是否已完成写入磁盘
- Arduino save http variable