2016-03-02 29 views
1

僅使用其內存映像可以提取已加載共享庫的導出符號?在運行時定位ELF共享庫導出

我在說的是.dynsym部分列出的符號。據我所知,我們可以這樣:

  1. 找到庫的基地址。
    例如,通過讀取/proc/<pid>/maps,可以找到從磁盤庫中映射的內存區域,然後我們可以查找ELF魔術字節以找到ELF標頭,從而爲我們提供基地址。

  2. 從程序頭中找到PT_DYNAMIC段。
    解析ELF標題,然後遍歷程序標題以找到包含.dynamic部分的段。

  3. 提取動態符號表的位置。
    對ElfN_Dyn進行迭代結構可以找到帶有DT_TAB和DT_SYMTAB的d_tags。這些將爲我們提供字符串表(帶有符號名稱)和動態符號表本身的地址。

這就是我偶然發現的地方。 .dynamic部分有一個標記爲字符串表(DT_STRSZ)的大小,但沒有指示符號表大小。它只包含單個條目的大小(DT_SYMENT)。我如何檢索表格中符號條目的數量?

應該可以推斷,從.dynsym節的大小,但ELF文件在內存中表示爲段。節表不需要加載到內存中,只能通過讀取相應的文件(可靠地)訪問。

我相信這是可能的,因爲動態鏈接器必須知道符號表的大小。但是,動態加載器可能已經將其存儲在文件被加載的地方,並且鏈接器僅使用緩存的值。雖然將符號表加載到內存中看起來有點愚蠢,但不會加載少數幾個字節的大小。

回答

2

動態符號表的大小必須從符號散列表(DT_HASHDT_GNU_HASH)推出:this answer給出了一些代碼。

標準哈希表(不再用於GNU系統)是quite simple。的第一個條目是nchain它是:

符號表中的條目的數量應該等於nchain

的GNU哈希表是更加複雜。

相關問題