2011-12-22 35 views
1

我在C中編寫程序,並使用內聯asm。在內聯彙編代碼中有一些地址,我想在運行時修補它們。C - 在運行時內聯asm修補程序

代碼的快速樣品是這樣的:

void __declspec(naked) inline(void) 
{ 
     mov eax, 0xAABBCCDD 
     call 0xAABBCCDD 
} 

的說我希望修改從主C程序0xAABBCCDD值。 我試圖做的就是調用VirtualProtect,它是函數的指針,以便使其可寫,然後調用memcpy將相應的值添加到代碼中。

DWORD old; 
VirtualProtect(inline, len, PAGE_EXECUTE_READWRITE, &old); 

但是,VirtualProtect失敗,GetLastError()返回487這意味着訪問無效地址。任何人都有關於這個問題的線索? 謝謝

+0

爲什麼你想這樣做?似乎應該有更好的方法來解決讓你想要做到這一點的真正問題。你怎麼決定0xAABBCCDD的實際價值?可能有辦法可以讓這種替代「免費」,取決於該地址來自何處。 – Flexo

+0

(也可以從語法和系統調用中猜測這是Win32/MSVC--你可能想明確指出標籤和/或問題)。 – Flexo

+0

你究竟想要做什麼?你是否試圖在目標進程中創建鉤子,以便跳轉到你的函數?如果是這樣的話,你應該用'VirtualProtect'來覆蓋你將要覆蓋的內存塊來創建鉤子,而不是你的函數,並且你還需要跳出你的codecave('call' +'ret'或者'jmp'到函數末尾的特定地址)。 – AusCBloke

回答

1

這不工作?

int X = 0xAABBCCDD; 

void __declspec(naked) inline(void) 
{ 
     mov eax, [X] 
     call [X] 
} 
+0

是的,但地址不是靜態的。我會在運行時得到它。 – user1112347

+0

嗯,當然,你會在運行時得到它。然後,在調用匯編函數之前,您將執行一行代碼「X = the_address_I_got_at_runtime;」。 –

+0

是的。但忘了提到一些重要的東西。我想要做的就是修補代碼並將其注入到另一個進程中,並從那裏運行它。不在我的過程中。但重點是,我想在運行時在任何地方在內聯寫入一個值。這就是爲什麼我試圖將這個功能標記爲virtualprotect可寫。問題是,VirtualAlloc失敗... – user1112347