我想編寫一個實用程序從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. 如何擴展ELF二進制文件
- 2. 從二進制文件中刪除
- 3. 從文本文件中刪除二進制控制字符
- 4. 如何從歷史記錄中刪除二進制文件?
- 5. 如何從二進制文件中刪除特定的行?
- 6. 如何從DLL二進制文件中刪除函數
- 7. C#如何從二進制文件中刪除換行符?
- 8. 如何從二進制文件中刪除前n個字符
- 9. 將整個ELF二進制文件轉儲爲可讀的頭文件和節
- 10. 刪除二進制Java文件
- 11. 從ELF二進制文件中提取函數字節
- 12. 使用removePIE刪除應用程序二進制文件的ALSR
- 13. iPhone應用程序提交和刪除二進制文件
- 14. 在ELF文件中的多個程序頭文件
- 15. 如何從.NET程序集中檢索二進制文件?
- 16. 從C++中的二進制文件中刪除結構
- 17. 如何刪除二進制文件中的元素?
- 18. 如何從文件的開頭刪除??
- 19. 反向工程一個ELF二進制文件
- 20. 從二進制文件中刪除項目
- 21. 從Windows二進制文件中刪除msvcp90d.dll依賴項
- 22. 從二進制dll文件中刪除C++類名稱
- 23. 從二進制文件中刪除字符
- 24. 從二進制文件中刪除字節
- 25. 如何從運輸二進制文件中排除部分應用程序?
- 26. C++二進制文件方法是從文件中刪除內容?
- 27. 哪些文件可以安全地從MinGW-w64二進制文件中刪除?
- 28. 如何在Perl程序中複製二進制文件
- 29. 如何從Cocoa應用程序運行二進制文件?
- 30. 如何從一個二進制文件
其實,我決定的技術是將我刪除的那個轉換爲PT_NULL。但我也會嘗試你的技巧,聽起來很合理。順便說一句,反過來呢?添加一個? – blueness 2011-05-15 10:46:48
關於添加一個,應該可以在最後一箇舊的Phdr結束後插入整個填充頁(4k),然後調整PT_LOAD條目以確保(1)Phdr表仍然映射到內存中,並且(2)所有現有的PT_LOAD映射仍然獲得它們打算擁有的相同虛擬地址。 – 2012-02-02 06:23:21