簡體   English   中英

有沒有比解析/ proc / self / maps更好的方法來計算內存保護?

[英]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.

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