【问题标题】:Visual Studio 2010 x64 __setReg Equivalent Compiler IntrinsicVisual Studio 2010 x64 __setReg 等效编译器内部
【发布时间】:2013-01-26 20:05:41
【问题描述】:

我有一个用 C 语言编写的应用程序,我确实需要在调用函数之前修改其中一个处理器寄存器的值。通常我会使用内联汇编来执行此操作,但众所周知,对于 64 位应用程序已将其删除。由于某些项目限制,我也无法在使用 ml64 编译的单独 .asm 文件中执行此操作。所以基本上我需要执行以下内联代码的等价物:

_asm mov r10d, 0xDEADBEEF

有没有人知道 x64 的创造性方法或其他编译器可以让您修改内联寄存器的值?

【问题讨论】:

  • 为什么您需要更改寄存器?哪个寄存器?
  • 这是不可能的。你已经排除了替代方案。
  • 您仍然可以将机器代码放入数组中,使底层内存可执行并执行它。创意怎么样?
  • 因为我已经有用汇编编写的代码,要求在调用之前在 r10 寄存器中存在一个值。
  • @Alexey 这可能行得通。是的,这很有创意:)

标签: windows visual-studio-2010 assembly x86-64 intrinsics


【解决方案1】:

不幸的是,在查看了可能的解决方法之后,Hans 似乎是对的,根本不可能修改内联寄存器的内容。没有编译器内在函数可以做到这一点,唯一的选择是将整个函数在 64 位汇编中编写为单独的 .asm 文件并使用 ml64 编译它,或者按照 Alexey 的建议执行并在之前分配一个可执行的内存块手并将操作码写入它。然后,您可以创建一个函数指针并直接调用此代码。例如,如果我想做相当于:

mov r10d, ecx
ret

只需创建一个数组来存储操作码:

BYTE copyValueToR10[] = "\x44\x8B\xD1\xC3";

然后您可以为这个带有 PAGE_EXECUTE 保护的小函数分配 VirtualAlloc 内存。接下来只需创建一个函数指针,您就可以开始了。绝对是一种肮脏的方式,但考虑到没有内联汇编或想要使用 ml64 编译的限制,这似乎是唯一的其他方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多