Process
程序可以擷取對程序記憶體某些區域的記憶體訪問嗎?
我正在尋找一種在訪問程序記憶體的特定只讀部分時觸發和擷取事件的方法。具體來說,如果我有一段程序記憶體包含許多常量值(只讀),並且我想在訪問任何這些值時擷取一個事件,事件處理程序可以在其中執行一些處理(某種增強到數據)並返回增加的值。所以,我有幾個問題:
- 這可能嗎?
- 如果是這樣,人們將如何去做呢?
- 需要什麼樣的權限(不需要訪問另一個程序的記憶體)?
- 是否有任何關於可以使用的技術的文件?
更新 1:
這裡有更多資訊,但我仍在努力弄清楚具體細節。
我正在嘗試做的是以程式方式或在編譯/連結期間標記一個記憶體區域(可能是一個頁面或更多),當訪問時,將觸發一個事件,這將導致我編寫的事件處理程序被呼叫並允許我“修復”導致事件的問題並返回試圖訪問的值。目標是能夠擁有正在執行的程式碼,並且當它嘗試訪問有問題的記憶體時,將呼叫事件處理程序並可以解決訪問並返回到原始程式碼,訪問更正/修復,以便不必修改原始程式碼。比如說一個 printf 格式字元串,我希望能夠呼叫該事件並調整或替換格式字元串,並且 printf 程式碼繼續其愉快的方式。
那有意義嗎?
- 是的
- 可能通過使用連結描述文件將變數放入單獨的記憶體頁面。用於
mprotect
將頁面標記為no access
。用於sigaction
為 SIGSEGV 設置處理程序,指定 SA_SIGINFO 以便您獲得有關所涉及地址的資訊。- 不需要特殊特權。
- 這已經做過很多次了。最初的 Bourne shell 擷取 SIGSEGV 來進行記憶體處理,但那是在 sigaction 出現之前。在你的處理程序中,你可以做任何需要修復和返回的事情。通常,這需要對訪問模式和生成的機器程式碼有一定的了解。