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