我在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這意味着訪問無效地址。任何人都有關於這個問題的線索? 謝謝
爲什麼你想這樣做?似乎應該有更好的方法來解決讓你想要做到這一點的真正問題。你怎麼決定0xAABBCCDD的實際價值?可能有辦法可以讓這種替代「免費」,取決於該地址來自何處。 – Flexo
(也可以從語法和系統調用中猜測這是Win32/MSVC--你可能想明確指出標籤和/或問題)。 – Flexo
你究竟想要做什麼?你是否試圖在目標進程中創建鉤子,以便跳轉到你的函數?如果是這樣的話,你應該用'VirtualProtect'來覆蓋你將要覆蓋的內存塊來創建鉤子,而不是你的函數,並且你還需要跳出你的codecave('call' +'ret'或者'jmp'到函數末尾的特定地址)。 – AusCBloke