[英]Is there a better way than parsing /proc/self/maps to figure out memory protection?
在Linux(或Solaris)上有一種比手動解析/proc/self/maps
更好的方法,以確定您是否可以讀取,寫入或執行存儲在內存中一個或多個地址的任何內容?
例如,在Windows中,您有VirtualQuery
。
在Linux中,我可以mprotect
以更改這些值,但我無法讀回它們。
此外,有沒有什么方法可以知道這些權限何時發生變化(例如,有人在我背后的文件上使用mmap
),而不是做一些非常具有侵略性的事情並在進程中的所有線程上使用ptrace
並攔截任何嘗試進行可能的syscall
影響記憶圖?
更新:
不幸的是,我在JIT中使用它,它幾乎沒有關於它正在執行的代碼的信息,以獲得常量的近似值。 是的,我意識到我可以有一個可變數據的常量映射,比如Linux使用的vsyscall頁面。 我可以放心地假設任何未包含在初始解析中的內容都是可變且危險的,但我對這個選項並不完全滿意。
現在我做的是讀取/proc/self/maps
並構建一個我可以二進制搜索的結構,以獲得給定地址的保護。 每當我需要了解一些不在我的結構中的頁面時,我會重新閱讀/ proc / self / maps,假設它已經在此期間添加,或者我將要進行段錯誤。
它似乎解析文本以獲取此信息,而不知道它何時更改是非常苛刻的。 ( /dev/inotify
對/proc
幾乎任何東西都不起作用)
我不知道Linux上的VirtualQuery
等價物。 但是其他一些可能或可能不起作用的方法是:
你設置了一個信號處理程序捕獲SIGBUS / SIGSEGV並繼續你的讀或寫。 如果內存受到保護,將調用您的信號捕獲代碼。 如果不是,則不會調用您的信號捕獲代碼。 無論哪種方式,你贏了。
您可以在每次調用mprotect
並構建相應的數據結構,以幫助您了解區域是讀還是寫保護。 如果您可以訪問使用mprotect
所有代碼,這是很好的。
您可以通過將代碼鏈接到重新定義函數mprotect
的庫來監視進程中的所有mprotect
調用。 然后,您可以構建必要的數據結構,以了解區域是讀還是寫保護,然后調用系統mprotect
來實際設置保護。
您可以嘗試使用/dev/inotify
並監視文件/proc/self/maps
以進行任何更改。 我想這個不起作用,但值得嘗試。
sorta是/是/ proc / [pid | self] / pagemap,內核中的文檔,請注意: https : //lkml.org/lkml/2015/7/14/477因此它並非完全無害...... 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.