Linux 基于头信息计算ELF文件的大小

Linux 基于头信息计算ELF文件的大小,linux,reverse-engineering,executable,elf,Linux,Reverse Engineering,Executable,Elf,我理解可以根据(即,e_shoff+(e_shentsize*e_shnum))计算ELF文件的大小(即,它的结束位置),假设有一个节头表(“SHT”),并且SHT是ELF的最后一部分 但是,加载二进制文件不需要SHT,我想知道如果SHT丢失(例如,一个剥离的二进制文件),是否可以计算相同的信息。我们可以利用程序头或其他偏移量以编程方式计算大小吗 我们可以利用程序头或其他偏移量吗 二进制文件开始运行所需的信息包含在程序头中(使用readelf-wla.out查看其中的内容) 您可以通过查找phd

我理解可以根据(即,
e_shoff+(e_shentsize*e_shnum)
)计算ELF文件的大小(即,它的结束位置),假设有一个节头表(“SHT”),并且SHT是ELF的最后一部分

但是,加载二进制文件不需要SHT,我想知道如果SHT丢失(例如,一个剥离的二进制文件),是否可以计算相同的信息。我们可以利用程序头或其他偏移量以编程方式计算大小吗

我们可以利用程序头或其他偏移量吗

二进制文件开始运行所需的信息包含在程序头中(使用
readelf-wla.out
查看其中的内容)

您可以通过查找
phdr->p_offset+phdr->p_filesz
的最大值来计算二进制文件所需的最小大小。如果以该大小截断文件,它应该继续工作(或者至少加载并到达
main

但是该文件可能包含任意数量的附加不可加载节,因此,如果您计算的大小小于磁盘上的文件大小,请不要感到惊讶

是否需要这些附加部分完全取决于可执行文件——它可能有
打开的代码
s
argv[0]
查找到某个偏移量,以及
从那里读取数据(在这种情况下,应用程序将在截断后停止工作)

附言

假设…SHT是精灵的最后一部分


这个假设不一定是正确的,当然也不要求文件是正确的
ELF
文件。

谢谢您的回复!我稍微澄清了我的问题。我的目标是以编程方式而不是通过readelf实现这一点。任何你推荐的通过迭代程序头来跟踪
p_offset+phdr->p_filesz
?@AshkanHosseini答案都是一样的——你可以用编程的方式读取程序头(实际上很容易),就像
readelf
一样。偏移量和计数在ELF文件头中找到。有道理,谢谢。是的,我将使用
e_phnum
然后索引信息。那就不可能得到确切的尺寸了?只估计?