我想編寫一個實用程序從ELF二進制文件中刪除程序頭文件。例如,當我運行readelf -l/my/elf時,我得到了所有程序頭文件的列表:PHDR INTERP ... GNU_STACK GNU_RELRO。當我運行我的實用程序時,我想以相同的順序返回所有相同的程序標題,減去我刪除的那個。有沒有更簡單的方法來做到這一點,從頭開始重新創建整個ELF,跳過不需要的頭?如何從ELF二進制文件中刪除程序頭文件
4
A
回答
1
有沒有更簡單的方法從頭
當然這樣做比重建整個ELF:程序頭形成在由ehdr.e_phoff
的偏移給出一個固定的記錄表,包含.e_phentsize
字節.e_phnum
項。
要刪除一個條目,只需複製剩餘的條目,然後遞減.e_phnum
。這裏的所有都是它的。
注意:刪除一些條目可能會導致動態加載程序崩潰。 GNU_STACK
是唯一可以刪除但沒有太多傷害的標頭(我能想到)。
更新:
是,設置.p_type
到PT_NULL
是另一個(更簡單)的方法。但是這些條目通常不會出現,並且您可能會發現一些系統,其中PT_NULL
將在加載程序(或某些其他程序)中觸發斷言。
最後,增加一個新的Phdr
可能會很棘手。通常沒有空間來展開表格(緊接着是其他一些數據,例如.text
)。您可以將表重定位到文件末尾,並將.e_phoff
和.e_phnum
設置爲與新表對應,但許多程序期望整個Phdr
表在裝入時可在運行時使用,並且這不易於安排,因爲文件末尾的新位置將不會被任何PT_LOAD
分段「覆蓋」。
0
GNU二進制文件描述符庫(libbfd)可能會有幫助。
相關問題
- 1. C#如何從二進制文件中刪除換行符?
- 2. 如何從歷史記錄中刪除二進制文件?
- 3. 如何從二進制文件中刪除特定的行?
- 4. 刪除二進制Java文件
- 5. 使用removePIE刪除應用程序二進制文件的ALSR
- 6. 如何從.NET程序集中檢索二進制文件?
- 7. 從C++中的二進制文件中刪除結構
- 8. 如何從文件的開頭刪除??
- 9. 反向工程一個ELF二進制文件
- 10. 從二進制文件中刪除字節
- 11. 從二進制文件中刪除字符
- 12. 從二進制文件中刪除項目
- 13. 從二進制dll文件中刪除C++類名稱
- 14. 如何從運輸二進制文件中排除部分應用程序?
- 15. 哪些文件可以安全地從MinGW-w64二進制文件中刪除?
- 16. C++二進制文件方法是從文件中刪除內容?
- 17. 如何在Perl程序中複製二進制文件
- 18. 如何從Cocoa應用程序運行二進制文件?
- 19. 如何從java中的二進制圖像文件中刪除行?
- 20. 如何從目標文件製作Mach-O二進制文件?
- 21. 在ELF或二進制文件中有特定ABI的簽名?
- 22. 在ELF二進制文件中修改asm指令
- 23. 如何從二進制文件讀取C文本文件?
- 24. 如何從二進制MS Office文檔中刪除宏?
- 25. 如何從XCode 6 App提交菜單中刪除二進制文件?
- 26. 如何從編譯的二進制文件中刪除字符串(.so)
- 27. 使用python從大型二進制文件中刪除字符序列
- 28. Java - 從.wav中刪除頭文件
- 29. 如何在另一個二進制文件中定義二進制文件?
- 30. bash - 從文件夾中選取文件,進程,刪除
其實,我決定的技術是將我刪除的那個轉換爲PT_NULL。但我也會嘗試你的技巧,聽起來很合理。順便說一句,反過來呢?添加一個? – blueness 2011-05-15 10:46:48
關於添加一個,應該可以在最後一箇舊的Phdr結束後插入整個填充頁(4k),然後調整PT_LOAD條目以確保(1)Phdr表仍然映射到內存中,並且(2)所有現有的PT_LOAD映射仍然獲得它們打算擁有的相同虛擬地址。 – 2012-02-02 06:23:21