您如何可靠地提取便携式可执行文件中的附加数据?
如何提取便携式可执行文件的附加数据?
逆向工程
聚乙烯
2021-06-14 06:28:36
3个回答
澄清一下:附加数据- 也称为覆盖- 是 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:])
使用您的文件名作为参数。
就我个人而言,我通常用 Hiew 来做 - 因为 Hiew 比其他任何东西都更快启动,而且 PE 稳健:
- 转到附加数据开始
- 在
Hex
或ASM
模式下,按下F8可查看 PE 头信息 - Alt+F2转到附加数据开始处
- 在
- 选择到最后
- Keypad-
*
开始选择 - Ctrl+End转到文件底部
- Keypad-
*
再次完成选择
- Keypad-
- F2 将选择写入文件
手动完成并不难。
- 从 MZ 头中找到 PE 头,并确定节表的位置。
遍历截面表,并确定
PointerToRawData
+的最大值SizeOfRawData
。(注意:这些值需要使用 的FileAlignment
成员进行对齐IMAGE_OPTIONAL_HEADER
)。使用确定的最大值作为覆盖数据的文件偏移量。
请注意,某些安装程序/文件格式实际上并不使用此计算,而是在文件末尾有一个小预告片,指向有效负载的开头。例如,ZIP 文件格式就是这样工作的——这就是为什么无论解包器存根是 PE、DOS MZ、ELF、Mach-O 还是其他任何东西,都可以提取自解压 ZIP。
另一种选择是mewrev/pe Go 包:
package main
import (
"github.com/mewrev/pe"
"io/ioutil"
"log"
"os"
)
func main() {
file, e := pe.Open("vs_BuildTools.exe")
if e != nil {
log.Fatal(e)
}
y, e := file.Overlay()
if e != nil {
log.Fatal(e)
}
ioutil.WriteFile("vs_BuildTools.overlay", y, os.ModePerm)
}
其它你可能感兴趣的问题