簡體   English   中英

用gcc修改內存中的下一條指令

[英]Modify next Instruction in memory with gcc

我想在獲取之前修改下一條指令,在foo函數中的“ 如何在C或匯編中修改堆棧上的返回地址 ”的最佳答案中, *p指向main函數中的下一條指令。 我想修改*p指向的內容。 例如,我想將下一條指令更改為跳轉指令。 我該怎么做?

void foo()
{
    void** p = search((void**)&p, __builtin_return_address(0));
    // modify content of where *p points at.
}

int main()
{

    foo();
    //next instruction. *p points here
    return 0;
}

我想使用intel Core-i7 3632QM處理器上的gcc編譯器執行此操作。

例如,我想將下一條指令更改為跳轉指令。 我該怎么做?

在具有現代操作系統的桌面系統上,除非正在執行的程序已經注意將代碼保存在讀寫內存頁中 ,否則不能這樣做。 默認情況下,代碼加載到只讀內存頁中。

只是一個想法。 正如在評論中已經提到的那樣, 寫入執行 [通常]不能設置在相同的內存范圍內。 但是任何POSIX系統都應該有動態鏈接器的接口( dlopen()dlclose() ,...)。 因此,有一種方法可以在運行時修改進程內存布局,動態鏈接器使用它。

如果修改動態鏈接器或使用與其使用的相同接口是可接受的選項,則可能可以轉儲內存段(或將其復制到另一個范圍),進行修改,釋放原始段並將修改后的段加載到同一范圍內。

暫無
暫無

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

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