如何读取加载程序中的自定义部分?
How can I read a custom section within the loader?
我试图在 Linux.
中的一个进程的可执行目标文件 (Elf) 中嵌入信息(一个简单的整数)
我通过将整数值作为二进制写入文件,然后使用 objcopy 命令复制二进制文件内容来实现这一点。
objcopy --add-section .customsection=binaryfile processElfFile newProcessElfFile
这样,在 newProcessElfFile 中,我有一个完美的进程副本,其中包含一个包含整数值的新部分,我可以使用
查看该部分
readelf -e newProcessElfFile
我还通过在 Libelf 库上使用一些 C 代码验证了部分值是否正确。一切正常。
现在,我想读取新节中包含的整数值,并在加载要执行的 elf 文件时执行 printk。
为了实现这一点,我需要修改内核端的加载程序代码。
现在的问题是:
- 我无法在使用 libelf 库的内核中编写代码,因此我无法像在用户端程序中那样直接访问节值。
- 包含在 linux-VERSION/fs/binfmt_elf.c 中的 elf 内核加载器,在函数 load_elf_binary() 中,不读取 elf 部分,而是访问指向 elf 段的 elf 程序头,而不是单个部分。
为了解决这个问题,我想我需要 link 我的自定义部分在一个段中以便我可以访问它。
所以我有 2 个相关问题:
- 我能否以某种方式直接读取加载程序中的自定义部分?
- 如果没有,我如何为自定义部分创建一个段 link,以便我可以使用 elf 文件程序头访问它?
另一种可能是将整数值添加为已经存在的 .rodata 部分的元素,但不幸的是,我不知道如何执行它,也不知道如何访问内核中的该部分。
ELF header(Elf32_Ehdr
或 Elf64_Ehdr
)包含指向 header table 部分的信息(成员 e_shoff
,e_shentsize
).连同段字符串 table 索引 (e_shstrndx
),此信息可用于读取段 headers 并最终定位您感兴趣的数据。
我试图在 Linux.
中的一个进程的可执行目标文件 (Elf) 中嵌入信息(一个简单的整数)我通过将整数值作为二进制写入文件,然后使用 objcopy 命令复制二进制文件内容来实现这一点。
objcopy --add-section .customsection=binaryfile processElfFile newProcessElfFile
这样,在 newProcessElfFile 中,我有一个完美的进程副本,其中包含一个包含整数值的新部分,我可以使用
查看该部分readelf -e newProcessElfFile
我还通过在 Libelf 库上使用一些 C 代码验证了部分值是否正确。一切正常。
现在,我想读取新节中包含的整数值,并在加载要执行的 elf 文件时执行 printk。
为了实现这一点,我需要修改内核端的加载程序代码。
现在的问题是:
- 我无法在使用 libelf 库的内核中编写代码,因此我无法像在用户端程序中那样直接访问节值。
- 包含在 linux-VERSION/fs/binfmt_elf.c 中的 elf 内核加载器,在函数 load_elf_binary() 中,不读取 elf 部分,而是访问指向 elf 段的 elf 程序头,而不是单个部分。
为了解决这个问题,我想我需要 link 我的自定义部分在一个段中以便我可以访问它。
所以我有 2 个相关问题:
- 我能否以某种方式直接读取加载程序中的自定义部分?
- 如果没有,我如何为自定义部分创建一个段 link,以便我可以使用 elf 文件程序头访问它?
另一种可能是将整数值添加为已经存在的 .rodata 部分的元素,但不幸的是,我不知道如何执行它,也不知道如何访问内核中的该部分。
ELF header(Elf32_Ehdr
或 Elf64_Ehdr
)包含指向 header table 部分的信息(成员 e_shoff
,e_shentsize
).连同段字符串 table 索引 (e_shstrndx
),此信息可用于读取段 headers 并最终定位您感兴趣的数据。