首页 > 解决方案 > 如何解析PE文件不使用API

问题描述

我根据这篇文章学习了如何解析PE文件

在本文中,他们使用现有的 API 和结构

现在我想自己重写一个程序,而不调用api和可用的结构。阅读PE文件的一些信息如下图所示

在此处输入图像描述

我想问的是算法或开发人员如何创建它们。可以给我一些提示或链接吗?我需要使用 fread() 和 fseek() 来逐一阅读,对吧??

谢谢

编辑:哦,我好奇,想了解更多

标签: c++cparsingportable-executable

解决方案


一般有两种方法:

  • 如果您确定二进制格式将始终与相同架构上的相同二进制文件一起使用,则可以将数据读入内存并将其视为“指向结构的指针”。这很可能是原始作者实现它的方式。缺点是这段代码不能跨架构甚至编译器标志(结构中的填充、对齐等)移植。
  • 另一种更便携的方法是逐个读取数据条目。这导致大量代码与结构非常相似,但它是可移植的和通用的。这些类型的二进制文件格式通常与使用它们的代码一起发展,您可以轻松地插入版本和 if 语句来改变它们的读取方式。

    例如,使用著名开源项目的流 API ,您将阅读前几个条目,如下所示:

Common::SeekableReadStream * s = ...;
PIMAGE_DOS_HEADER d = new IMAGE_DOS_HEADER;
d->e_magic = s->readUint16LE();
d->e_cblp = s->readUint16LE();
d->e_cp = s->readUint16LE();
...

作为这两种方法的中间地带,我开始喜欢Kaitai struct,您可以在其中以声明性样式编写格式规范,并让其编译器为您生成结构定义,以及要读取(和编写!)的代码这些文件格式。

看看他们画廊的相应摘录:

  mz_header:
    seq:
      - id: magic
        size: 2
      - id: last_page_extra_bytes
        type: u2
      - id: num_pages
        type: u2
      - id: num_relocations
        type: u2

推荐阅读