簡體   English   中英

如何從內核模塊中查找動態鏈接/加載的庫的PHDR?

[英]How to find the PHDR of dynamically linked/loaded libraries from a kernel module?

我需要從內核訪問進程的程序頭表(或節頭),以便從Linux內核模塊中找到.eh_frame和.eh_frame_hdr節的地址。 在用戶空間中,我將使用dl_iterate_phdr(),但我需要一個內核空間解決方案。 如果可能的話,就不需要遍歷elf文件。

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

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

有沒有辦法只依靠內存而不依靠elf文件來做到這一點?

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

我們可以使用以下bash行驗證所有正在運行的進程和已加載的共享庫的可執行文件映射都從偏移量0x0開始:

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

它輸出所有不是從偏移量0x0開始的可執行映射,因此沒有輸出意味着Ehdr位於可執行vm_areas的開頭。

暫無
暫無

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

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