c++ - 如何解析PE文件不使用API
问题描述
我根据这篇文章学习了如何解析PE文件
在本文中,他们使用现有的 API 和结构
现在我想自己重写一个程序,而不调用api和可用的结构。阅读PE文件的一些信息如下图所示
我想问的是算法或开发人员如何创建它们。可以给我一些提示或链接吗?我需要使用 fread() 和 fseek() 来逐一阅读,对吧??
谢谢
编辑:哦,我好奇,想了解更多
解决方案
一般有两种方法:
- 如果您确定二进制格式将始终与相同架构上的相同二进制文件一起使用,则可以将数据读入内存并将其视为“指向结构的指针”。这很可能是原始作者实现它的方式。缺点是这段代码不能跨架构甚至编译器标志(结构中的填充、对齐等)移植。
另一种更便携的方法是逐个读取数据条目。这导致大量代码与结构非常相似,但它是可移植的和通用的。这些类型的二进制文件格式通常与使用它们的代码一起发展,您可以轻松地插入版本和 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
推荐阅读
- centos6 - 如何让 Node-RED 进程与 Cent-OS6 一起工作?
- django - PermissionError:[Errno 13] 权限被拒绝:'C:\\Users\\...\\AppData\\Local\\Temp\\tmp24xoaa7g'
- kubernetes - Pod 有未绑定的即时 PersistentVolumeClaims kong-ingress-controller
- mongodb - 如何计算 MongoDB 中按月(日期字段)分组的用户数?
- git - git pull 会包含新的子模块吗?
- sql - 如何创建在同一列上使用不同聚合算法的 SSRS 报告?
- reactjs - 在 React 中,我如何编码拆分公共页面(例如登录)以将它们与安全页面分开?
- php - 慢 PHP 例程
- python - 为什么我的网络抓取代码没有像应有的那样提取数据?
- ansible - 如何在 Ansible 中读取多行参数