2010-03-29 59 views
8

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

(我正在使用C++)

OS是windows。

+1

哪個操作系統? – elcuco 2010-03-29 10:01:57

+1

你爲什麼試圖這樣做?當然,唯一的原因是減少工作內存的數量,因爲您可以從光盤加載部分代碼。如果你解釋你正在嘗試做什麼,也許我們可以提供幫助。 – thecoshman 2010-03-29 10:06:56

+0

自修改代碼很難。這個操作系統是完全編寫的,因爲沒有中級語言的語法允許自修改代碼:http://valerieaurora.org/synthesis/SynthesisOS/abs.html。 – 2010-03-29 10:13:55

回答

6

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

+0

謝謝,這正是我正在尋找的 – polo 2010-03-29 12:30:11

3

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

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

您可能會將代碼標記爲不駐留在只讀頁中,但它是編譯器特定的(JIT編譯器會這樣做)。

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

-1

您的代碼駐留的內存部分通常標記爲只讀。這就是爲什麼你分段失敗。您可以嘗試通過編譯器的特殊鍵(不確定)或通過修改二進制文件(再次,並非100%可能)來從該部分刪除該標誌。

0

通常,您正在嘗試寫入代碼段,新的操作系統會阻止你這樣做。這是一些病毒的工作方式。

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