2016-07-27 57 views
0

爲了從linux內核模塊中找到.eh_frame和.eh_frame_hdr部分的地址,我需要訪問內核進程的程序頭部表(或者部分頭部)。在用戶空間中,我會使用dl_iterate_phdr(),但我需要一個內核空間解決方案。如果可能的話,它不需要通過elf文件。如何從內核模塊中找到動態鏈接/加載庫的PHDR?

輔助矢量具有AT_PHDR字段,但它無助於找到動態鏈接/加載的庫的PHDR。

我的另一個想法是對vm_areas進行迭代,以找到任務內存中每個具有可執行mmap的文件的PHDR地址。這個解決方案的問題是,加載後可以更改或刪除elf文件。

有沒有辦法做到這一點只依賴內存,而不是在精靈文件?

回答

0

它看起來像Elf標題(它有phdr表的文件偏移量 - 通常與內存中的偏移量相同)始終位於可執行文件mmaps的開頭。由於我找不到關於Ehdr外觀的任何文件,所以它看起來並不可靠,但它似乎在實踐中存在。這可能是因爲它必須在Elf文件的開頭,並且頁面大小和對齊使可執行段從偏移0x0開始。

我們可以驗證它的可執行映射在所有正在運行的進程偏移爲0x0啓動和加載的共享對象與此慶典行:

sudo cat /proc/*/maps | awk '{ print $2 " " $3 " " $6;}' | egrep '^..x.' | grep -vE '.... 0{8}' 

它輸出的所有可執行文件映射不偏移量爲0x0開始,所以沒有輸出意味着Ehdrs在可執行文件vm_areas的開頭。