2015-08-13 27 views
1

我寫一個應用程序來加載自己的DLL和重寫一些代碼在目標進程中實現的東西。我用Cheat Engine檢查了內存塊,發現我想重寫的內存區域是「Execute/Read only」。但奇怪的是(至少對我來說)我可以通過外部程序使用WriteProcessMemory重寫內存塊,但不能使用我加載到目標進程內存的自己的DLL使用memcpy。無法寫入與memcpy的內存,但細跟WriteProcessMemory的

是否有任何其他的方式來改寫過程中的操作碼,或者我需要使用WriteProcessMemory的改寫呢?

+0

'WriteProcessMemory'可能繞過內存頁面訪問保護。 'memcpy'只是一個簡單的for循環。你不能在你所在的同一個進程上調用'WriteProcessMemory'嗎? –

+0

我的蜘蛛感官刺痛這裏...即使你有一個正當的理由這樣做(和你**不**,無論你爲什麼認爲你做什麼或你的理由是什麼),如果你不能圖爲什麼'memcpy'失敗,那麼你沒有資格去做你想做的事情。對不起,生硬。 –

+0

@Colonel呃,沒有。現在就是這樣。 WriteProcessMemory修改保護。做到這一點,你可以使用memcpy。 for循環不相關。 –

回答

1

要更改可執行內存,你通常需要使用VirtualProtect()更改訪問標記爲要寫入內存頁面。 WriteProcessMemory()想必爲你設置這些標誌。

+0

也許,也許不是:「* lpBaseAddress [in]一個指針的基地址中指定的進程來的數據被寫入其中**數據傳輸發生之前,系統會驗證在指定的基地址和存儲器的所有數據大小可用於寫入訪問,如果不可訪問,則函數失敗**。*「。我懷疑(但我可能錯了)「驗證寫訪問」包括更改正在寫入的內存的訪問標誌。但是,由於'WriteProcessMemory()'主要用於調試器,所以它也可以。 –

+0

@Remy WPM會修改保護 –