#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健壮性:
在
Hex
或ASM
模式下按附加数据开始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
的最大值。 (注意:这些值可以使用FileAlignment
的IMAGE_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
评论
(有人问我这个问题)