Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解析PE文件不使用API_C++_C_Parsing_Portable Executable - Fatal编程技术网

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

C++ 如何解析PE文件不使用API,c++,c,parsing,portable-executable,C++,C,Parsing,Portable Executable,我学习了如何根据这个解析PE文件 在本文中,它们使用现有的API和结构 现在我想自己重写一个程序,不需要调用api和可用的结构 我想问的是算法,还是开发人员是如何创建它们的。可以给我一些提示或链接吗? 我需要用fread()和fseek()一对一地阅读,对吗 多谢各位 编辑:哦,我很好奇,想了解更多通常有两种方法: 如果您确定二进制格式将始终与相同体系结构上的相同二进制文件一起使用,则可以将数据读入内存,并将其视为“指向结构的指针”。这很可能是原作者实现它的方式。缺点是此代码不能跨体系结构甚

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

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

现在我想自己重写一个程序,不需要调用api和可用的结构

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

多谢各位


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

通常有两种方法:

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

    例如,使用一个著名的开源项目的示例,您可以阅读以下前几个条目:

作为这两种方法之间的中间地带,我喜欢这样做:您以声明式风格编写格式规范,并让其编译器为您生成结构定义,以及读取(和写入!)这些文件格式的代码

请看下面的相应摘录:


你为什么想自己做这件事?这仅仅是一种学习经历还是好奇心(这很好,但请在你的问题中添加一个注释)?或者你认为自己重写会解决其他问题吗?一般来说,这样的事情并不琐碎,而且取决于你将如何使用它,如果你自己编写它,犯错误的几率要高于使用现有API。谢谢你,伙计,只是好奇,想了解更多。你能给我一些提示吗?本文中的程序不使用任何现有的API,只使用反映PE头不同部分的现有结构。你最需要知道的就是这篇文章。你可以通过谷歌搜索诸如“微软PE头”之类的东西来找到更多关于PE头的信息。这个问题对于目前的网站来说太广泛了。继续尝试,如果遇到任何困难,开始一个具体的问题。
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();
...
  mz_header:
    seq:
      - id: magic
        size: 2
      - id: last_page_extra_bytes
        type: u2
      - id: num_pages
        type: u2
      - id: num_relocations
        type: u2