2013-02-11 68 views
0

我有一个应用程序,我用C编写的,我真的需要在调用函数之前修改其中一个处理器寄存器的值。通常我会用内联汇编来做到这一点,但是我们都知道已经删除了64位应用程序。由于某些项目限制,我也无法在单独使用ml64编译的.asm文件中执行此操作。所以基本上我需要执行下面的代码内嵌相当于:Visual Studio 2010 x64 __setReg等价编译器固有

_asm mov r10d, 0xDEADBEEF 

有谁知道一个创意方法或一些其他编译器的内部针对x64,这将允许你修改寄存器内联的价值?

+0

*为什么*你需要更改注册?哪个注册? – 2013-02-11 17:08:58

+0

这是不可能的。你已经消除了另一种选择。 – 2013-02-11 17:50:30

+3

您仍然可以将机器代码放入数组中,使底层内存可执行并执行它。那对创意来说如何? – 2013-02-11 18:23:00

回答

1

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

mov r10d, ecx 
ret 

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

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

然后,您可以存储的VirtualAlloc与PAGE_EXECUTE保护这个小功能。接下来只需创建一个函数指针,然后你就可以开始了。绝对是一种肮脏的方式来做到这一点,但考虑到没有内联asm或想使用ml64编译的限制,这似乎是唯一的方法来做到这一点。