2011-05-04 109 views
4

我想編寫一個實用程序從ELF二進制文件中刪除程序頭文件。例如,當我運行readelf -l/my/elf時,我得到了所有程序頭文件的列表:PHDR INTERP ... GNU_STACK GNU_RELRO。當我運行我的實用程序時,我想以相同的順序返回所有相同的程序標題,減去我刪除的那個。有沒有更簡單的方法來做到這一點,從頭開始重新創建整個ELF,跳過不需要的頭?如何從ELF二進制文件中刪除程序頭文件

回答

1

有沒有更簡單的方法從頭

當然這樣做比重建整個ELF:程序頭形成在由ehdr.e_phoff的偏移給出一個固定的記錄表,包含.e_phentsize字節.e_phnum項。

要刪除一個條目,只需複製剩餘的條目,然後遞減.e_phnum。這裏的所有都是它的。

注意:刪除一些條目可能會導致動態加載程序崩潰。 GNU_STACK是唯一可以刪除但沒有太多傷害的標頭(我能想到)。

更新:

是,設置.p_typePT_NULL是另一個(更簡單)的方法。但是這些條目通常不會出現,並且您可能會發現一些系統,其中PT_NULL將在加載程序(或某些其他程序)中觸發斷言。

最後,增加一個新的Phdr可能會很棘手。通常沒有空間來展開表格(緊接着是其他一些數據,例如.text)。您可以將表重定位到文件末尾,並將.e_phoff.e_phnum設置爲與新表對應,但許多程序期望整個Phdr表在裝入時可在運行時使用,並且這不易於安排,因爲文件末尾的新位置將不會被任何PT_LOAD分段「覆蓋」。

+0

其實,我決定的技術是將我刪除的那個轉換爲PT_NULL。但我也會嘗試你的技巧,聽起來很合理。順便說一句,反過來呢?添加一個? – blueness 2011-05-15 10:46:48

+0

關於添加一個,應該可以在最後一箇舊的Phdr結束後插入整個填充頁(4k),然後調整PT_LOAD條目以確保(1)Phdr表仍然映射到內存中,並且(2)所有現有的PT_LOAD映射仍然獲得它們打算擁有的相同虛擬地址。 – 2012-02-02 06:23:21

0

GNU二進制文件描述符庫(libbfd)可能會有幫助。

相關問題