elfedit
是一個用于修改 ELF(可執行與可鏈接格式)文件頭的工具。它允許用戶根據指定的條件(如機器類型、文件類型、操作系統/ABI)匹配并更新 ELF 文件的頭部信息。支持 32 位和 64 位 ELF 文件,以及包含 ELF 文件的歸檔文件(如靜態庫 .a
)。
基本語法
elfedit [選項] elffile...
elffile...
:需修改的 ELF 文件路徑,支持多個文件同時處理。
選項
選項 | 功能說明 |
---|---|
--input-mach=machine | 設置輸入文件的匹配機器類型(如 i386 , x86-64 )。若未指定,則匹配所有機器類型。 |
--output-mach=machine | 修改 ELF 文件頭的機器類型為指定值(如 x86-64 )。必須為 --input-mach 支持的類型。 |
--input-type=type | 設置輸入文件的匹配文件類型(rel 可重定位、exec 可執行、dyn 共享庫)。未指定則匹配所有類型。 |
--output-type=type | 修改 ELF 文件頭的文件類型為指定值(如 exec )。需與 --input-type 類型一致。 |
--input-osabi=osabi | 設置輸入文件的匹配操作系統/ABI(如 GNU , Linux , Solaris )。未指定則匹配所有。 |
--output-osabi=osabi | 修改 ELF 文件頭的 OSABI 為指定值(如 Linux )。需與 --input-osabi 支持的類型一致。 |
-v, --version | 顯示 elfedit 的版本信息。 |
-h, --help | 顯示命令的幫助信息和可用選項。 |
@file | 從文件中讀取附加命令行選項(支持嵌套 @file )。 |
示例
-
修改文件的機器類型為
x86-64
:elfedit --output-mach=x86-64 my_program
-
同時修改文件類型和 OSABI:
elfedit --input-type=exec --output-type=dyn --output-osabi=Linux my_library.so
-
批量處理并指定過濾條件:
elfedit --input-mach=i386 --output-osabi=GNU --output-mach=x86-64 *.o
-
從文件讀取選項:
創建options.txt
:--output-osabi=Linux --input-type=dyn
執行命令:
elfedit @options.txt my_binary
擴展場景
- 逆向工程:修改 ELF 頭以繞過某些安全檢查或兼容性限制。
- 調試與分析:調整文件類型(如將共享庫改為可執行文件)以簡化調試流程。
- 系統移植:修改 OSABI 字段以適配不同操作系統(如從
GNU
改為Linux
)。
退出狀態
- 0:成功修改所有匹配的 ELF 文件。
- 非零:因參數錯誤、文件不可讀或權限問題導致失敗。
注意事項
-
必需選項:
- 必須至少指定一個輸出選項(
--output-mach
,--output-type
,--output-osabi
)。 - 輸入選項(如
--input-mach
)用于過濾需修改的文件,未指定則匹配所有類型。
- 必須至少指定一個輸出選項(
-
風險提示:
- 修改 ELF 頭可能導致文件不可執行或損壞,務必備份原始文件。
- 需確保修改后的機器類型、文件類型和 OSABI 與目標平臺兼容。
-
支持的類型:
- 機器類型:
i386
,IAMCU
,L1OM
,K1OM
,x86-64
。 - 文件類型:
rel
(可重定位)、exec
(可執行)、dyn
(共享庫)。 - OSABI:
none
,GNU/Linux
,Solaris
,FreeBSD
,AIX
等。
- 機器類型:
-
特殊用法:
@file
參數:
可通過文件批量指定復雜選項,例如:
其中elfedit @options.txt file1 file2
options.txt
內容可能為:--input-mach=x86-64 --output-osabi=Linux