elf 打标记技术
方案列举
在 Linux上,可以使用命令行工具 objcopy
来给编译好的二进制打上标记,根据参数的不同实现方式也有差别:
方式一:添加 section
具体步骤如下:
1.准备一个任意二进制文件,假设为 demo
2.运行打标签命令:objcopy
--add-section unioncode
=demo demo
3.运行查看标签命令:objdump
-h demo
logan@logan-PC:~/work/temp/bin$ objdump -h demo
demo: 文件格式 elf64-x86-64
节:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 00000000004002a8 00000000004002a8 000002a8 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 00000000004002c4 00000000004002c4 000002c4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
......
32 .debug_str 00045921 0000000000000000 0000000000000000 00048c87 2**0
CONTENTS, READONLY, DEBUGGING
33 .debug_ranges 000002b0 0000000000000000 0000000000000000 0008e5a8 2**0
CONTENTS, READONLY, DEBUGGING
# 这里已经加上了 section
34 unioncode 00091600 0000000000000000 0000000000000000 0008e858 2**0
CONTENTS, READONLY
方式二:追加 .strtab
在 elf 文件中,可以使用字符串表节(.strtab
)来存储字符串,通过添加一个自定义的字符串来实现标记。具体步骤如下:
1.打开二进制文件,使用 objdump
或 hexeditor
工具查看 ELF 文件的节表信息,找到 .strtab
节的偏移量和大小。
2.将自定义的字符串添加到该节的末尾,并在字符串末尾添加一个 NULL 字符。
3.在 elf 文件的符号表节(.symtab
)中添加一个符号,用于引用新添加的字符串。可以使用 objcopy
工具来实现,具体命令如下:
objcopy --add-symbol <symbol_name>=<str_offset> <binary_file>
其中,<symbol_name> 是新添加的符号名称,<str_offset
> 是新添加的字符串在 .strtab
节中的偏移量。 相比方式一,本方法明显要复杂许多。
方式三:添加 .note section
该字段专用于注释,可以添加更多信息,使用命令如下:
objcopy --add-section .note.your_note=your_note_file.elf your_input_file.elf your_output_file.elf
注意:该命令中的提示字符需要四字节对齐,否则会报错
其中 .elf 是注释文件,需要满足规定的格式 Elf64_Note
:
struct Elf64_Note {
Elf64_Word n_namesz; // 名称的大小
Elf64_Word n_descsz; // 描述信息的大小
Elf64_Word n_type; // 注释类型
char *n_name; // 注释名称
char *n_desc; // 描述信息
};
运行命令可以得到:
# 添加
logan@logan-PC:~/work/temp/bin$ objcopy --add-section .note.builder=your.elf target target
# 查询结果
logan@logan-PC:~/work/temp/bin$ readelf -n target
Displaying notes found in: .note.ABI-tag
所有者 Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
OS: Linux, ABI: 3.2.0
Displaying notes found in: .note.gnu.build-id
所有者 Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Build ID: ec8c0ba711b17f71ffe6c74e98b047908bf89903
# 这部分是新添加的,其中“description data“的值为UUID
Displaying notes found in: .note.builder
所有者 Data size Description
Owner 0x00000020 NT_VERSION (版本)
description data: 22 32 64 36 66 34 64 34 34 63 38 64 34 66 35 63 39 64 33 65 33 66 33 66 39 65 37 63 31 63 35 65