如何可靠地在便携式可执行文件中提取附加数据?

评论

(有人问我这个问题)

#1 楼

需要澄清的是:附加数据-也称为叠加-是PE文件的一部分,未被标头覆盖。



PE文件格式,在某些极端情况下可能很难确定,因此最好使用诸如pefile之类的健壮库。

这是一个简单的Python脚本,它依赖于pefile提取附加数据:

import pefile
import sys

filename = sys.argv[1]
with open(filename, "rb") as s:
    r = s.read()

pe = pefile.PE(filename)
offset = pe.get_overlay_data_start_offset()

with open(filename + ".app", "wb") as t:
    t.write(r[offset:])


以文件名作为参数使用。速度比其他任何方式都快,并且还具有PE健壮性:


HexASM模式下按附加数据开始


F8查看PE标头信息

Alt + F2转到附加数据的开头


选择直到结尾


>
键盘-*开始选择

键盘-*再次完成选择


F2将选择内容写入文件


评论


您可能还希望跳过现有的Authenticode签名。

– 0xC0000022L♦
13年5月6日在13:53

否,Authenticode签名必须位于文件的最后,否则将无法通过验证。您不能(再)在签名后附加数据。

–彼得·弗里
13年5月7日在17:11

附加数据的末尾可能会有一个签名,因此可能要等到文件底部才选择签名。

–天使
13年5月7日在18:40

如果有签名,那么它将被记录在数据目录中,因此您在此处具有起始偏移量和大小,这非常简单

–evlncrn8
2014年10月11日22:50

#2 楼

手动操作并不难。


从MZ头中找到PE头并确定节表的位置。
遍历节表并确定PointerToRawData + SizeOfRawData的最大值。 (注意:这些值可以使用FileAlignmentIMAGE_OPTIONAL_HEADER成员进行对齐)。
使用确定的最大值作为覆盖数据的文件偏移。

请注意,某些安装程序/文件格式实际上并没有使用此计算,而是在文件末尾有一个小的预告片,该预告片指向有效负载的开头。例如,ZIP文件格式就是这样的-这就是为什么无论解压缩存根是PE,DOS MZ,ELF,Mach-O还是其他任何东西都可以提取自解压ZIP的原因。

评论


不,这还不够。 SizeOfRawData可以具有任何值,即使在一个小文件中也可以有几GB。这时受VirtualSize约束。准确确定图像的结尾并非易事。

–彼得·弗里
13年5月6日在19:13

@peterferrie什么是好的算法?我实际上正在尝试实现一个。 pefile大致按照此处的建议进行操作。

– Karsten Hahn
14年5月13日在8:12



@Veitch,我对其他问题的回答现在有示例代码和描述,应该是您所需要的。

–彼得·弗里
14年5月13日在22:35