我有一个用 C 语言编写的应用程序,我确实需要在调用函数之前修改其中一个处理器寄存器的值。通常我会使用内联汇编来执行此操作,但众所周知,对于 64 位应用程序已将其删除。由于某些项目限制,我也无法在使用 ml64 编译的单独 .asm 文件中执行此操作。所以基本上我需要执行以下内联代码的等价物:
_asm mov r10d, 0xDEADBEEF
有谁知道 x64 固有的创造性方法或其他编译器可以让您修改内联寄存器的值?
我有一个用 C 语言编写的应用程序,我确实需要在调用函数之前修改其中一个处理器寄存器的值。通常我会使用内联汇编来执行此操作,但众所周知,对于 64 位应用程序已将其删除。由于某些项目限制,我也无法在使用 ml64 编译的单独 .asm 文件中执行此操作。所以基本上我需要执行以下内联代码的等价物:
_asm mov r10d, 0xDEADBEEF
有谁知道 x64 固有的创造性方法或其他编译器可以让您修改内联寄存器的值?
不幸的是,在查看了可能的解决方法之后,Hans 似乎是对的,根本不可能修改内联寄存器的内容。没有编译器内在函数可以做到这一点,唯一的选择是将整个函数在 64 位汇编中编写为单独的 .asm 文件并使用 ml64 编译,或者按照 Alexey 的建议执行并在之前分配一个可执行的内存块手并将操作码写入它。然后,您可以创建一个函数指针并直接调用此代码。例如,如果我想做相当于:
mov r10d, ecx
ret
只需创建一个数组来存储操作码:
BYTE copyValueToR10[] = "\x44\x8B\xD1\xC3";
然后,您可以为这个带有 PAGE_EXECUTE 保护的小功能分配 VirtualAlloc 内存。接下来只需创建一个函数指针,您就可以开始了。绝对是一种肮脏的方法,但考虑到没有内联汇编或想要使用 ml64 编译的限制,这似乎是唯一的另一种方法。