2013-02-11 98 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編譯的限制,這似乎是唯一的方法來做到這一點。