c++ - 如何解析PE文件不使用API

标签 c++ c parsing portable-executable

我学习了如何根据此article解析PE文件

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

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

enter image description here

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

谢谢

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

最佳答案

通常有两种方法:

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

    例如,使用一个著名的开源项目的stream 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,您在其中以声明性样式编写格式的规范,并让其编译器为您生成struct定义,以及用于读取(和写入!)这些代码的代码。文件格式。

    看看their gallery的相应摘录:
      mz_header:
        seq:
          - id: magic
            size: 2
          - id: last_page_extra_bytes
            type: u2
          - id: num_pages
            type: u2
          - id: num_relocations
            type: u2
    

    关于c++ - 如何解析PE文件不使用API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59782844/

    相关文章:

    c++ - IAR C/C++ 比较运算符行为

    c++ - C++ 中的私有(private)运算符删除

    c - 即使出现错误后程序仍继续运行

    c++ - 函数中二维字符数组的长度

    java - Xtext解析EMF模型接口(interface)

    c++ - 只有 static 和 const 变量可以分配给一个类?

    c++ - GCC如何处理变量重定义

    c - 如何创建一个函数来比较不区分大小写的字符串,而不使用 strcmpi()

    c - 拆分/解析并从 char 数组中获取值

    regex - Powershell Parsing Help - 如何将文件夹名称列表输出到文本文件中