簡體   English   中英

在運行時更改代碼

[英]Changing code at runtime

我有一個指向函數的指針(我從vtable獲得),我想通過在運行時更改匯編代碼(更改幾個字節)來編輯函數。 我嘗試使用memset並嘗試直接分配新值(類似於mPtr [0] = X,mPtr [1] = Y等)但我不斷得到分段錯誤。 我該如何更改代碼?

(我正在使用C ++)

操作系統是Windows。

通常:如果使用API​​調用VirtualAlloc分配內存,則可以使用API​​調用VirtualProtect更改內存屬性。 使用API​​調用VirtualQuery檢查第一個內存屬性

根據操作系統和/或體系結構,您可能會或可能不會寫入可執行頁面。

檢查有關在英特爾(IA-32e)手冊中將頁面標記為可執行或只讀的文檔。 代碼可能位於只讀部分,因此,您可能無法寫入。

您可以將代碼標記為不駐留在只讀頁面中,但它是特定於編譯器的(JIT編譯器執行此操作)。

在MSVC下,您可以使用#pragma部分創建讀寫部分,並使用#pragma alloc_text將函數放入其中。

通常,您試圖寫入代碼段,新的操作系統將阻止您執行此操作。 這是一些病毒的工作方式。

有一些API可以刪除該保護,但它們依賴於操作系統。

代碼所在的內存部分通常標記為只讀。 這就是你得分段失敗的原因。 您可以嘗試通過編譯器的特殊鍵(不確定)或通過修改二進制文件(再次,不是100%可能)來從節中刪除此標志

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM