编写PE文件解析器(一)

2023-10-26

第一篇先写一个PE格式解析器,学了那么久了写出来防止自己忘记,顺便练练手。PE格式解析是比较基础的内容,后面再越写越深。我写这个不是介绍pe格式,而是说编写解析代码,解释定义什么的网上一堆就不粘了,重要的定义我尽量简洁的描述清楚就行,如果想知道每一个定义或者字段是用来干嘛的,在pecoff文档里写的很清楚。业余时间写的,时间不充裕写得很慢,写错请斧正,转载请注明,高手轻批。


解析前需要弄清楚的是RVA相对虚拟地址和RA相对地址,RVA是系统的loader加载到内存中用的,RA是解析文件用的。PE里存的偏移地址大部分都是RVA,因为它是要加载到内存中使用的,所以pe里存rva会快一些。

写解析代码的时候如果想让RVA和RA通用, 需要对载入的方式进行区分,因为后面文章会讲到修改PE内容往里面塞东西和其它一些什么的,所以为了方便我写成通用的。

用读文件或者用GetModuleHandle之类的函数载入,读文件方式解析时需要做rva2ra转换,GetModuleHandle载入的是运行中的进程,已经映射好了,就不用做转换了,把得到的地址作为基址,直接把它转成PCHAR就行。

几乎所有的定义都在winnt.h里,一般使用时只要导入这个就行,只有一些不太常用的定义在其它头文件里。

下面开始:


1、IMAGE_DOS_HEADER【Dos头】

这个段应该是历史遗留问题,需要到的只有e_magic和e_lfanew两个字段。e_magic直接判断等于IMAGE_DOS_SIGNATURE就行,一般pe是以0x4D5A开始的,看定义有其它的值,但是我没见过有其它值的pe。e_lfanew是用来跳过dos stub的,就是用21中断显示那一段英文的代码,删掉这段代码也没关系,以后再写。其它字段可以全部无视。


2、IMAGE_NT_HEADERS【Nt头】

通过base+dosHeader->e_lfanew偏移得到。这个结构分为32版本和64位版本,包含Signature(PE的为IMAGE_NT_SIGNATURE,就是PE\0\0)、FileHeader和OptionalHeader,其中只有OptionalHeader有32和64的区别,其它都是一样,解析到这里的时候需要注意区分是否为32或64位的pe,其信息记录在OptionalHeader字段中,字段中的Magic记录了该pe类型,因为Magic所在位置是一样的,所以可以用PIMAGE_NT_HEADERS32(base + DosHeader->e_lfanew)->OptionalHeader.Magic判断值,再确定使用IMAGE_NT_HEADERS32还是IMAGE_NT_HEADERS64来定这个结构的类型,声明的时候直接用union就行,直接以32位版本赋值后也不用改。

IMAGE_FILE_HEADER FileHeader相对有用的地方是NumberOfSections和SizeOfOptionalHeader。其它有用的信息都记录在OptionalHeader里。(叫做可选,实际上非常重要)


2.1、IMAGE_FILE_HEADER【文件头】

Machine记录机器类型,后面会用到。FileHeader里的NumberOfSections记录了PE节的数量,SizeOfOptionalHeader记录了可选头的大小,第一个节头是紧跟着可选头的&#x

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写PE文件解析器(一) 的相关文章

  • 图解使用两块 Survivor 区的原因

    如果只使用一块 Survivor 区 当发生一次 Minor GC 时 回收 Eden 区的垃圾 把存活的对象复制到 Survivor 区 如下图 ok 目前看起来并没有什么区别 但是当发生第二次 Minor GC 时 问题就出现了 我们来
  • Kerberos认证流程及基本操作

    一 Kerberos的三个角色 Kerberos主要是有三个重要的角色 1 访问服务的Client 2 提供服务的Server 3 KDC Key Distribution Center 密钥分发中心 其中报错AS authorizatio
  • vim 的 auto-pairs 设置

    https github com jiangmiao auto pairs 转载于 https www cnblogs com zach0812 p 11514673 html
  • RestTemplate详细配置及日志打印

    目录 1 RestTemplate配置类 2 RestTemplateLog拦截器类 3 使用 1 RestTemplate配置类 包括连接池 超时时间 拦截器 异常处理 字符集 response多次读取 使用httpclient进行配置
  • node.js中时间戳和日期之间的转换

    今天在做项目的时候遇到可需要在时间戳和日期之间转换的问题 忙了很长时间 这里总结记录一下 首先 我们来了解一下js里面的Date对象 Date对象是JavaScript提供的日期和时间的操作接口 它有多种用法 1 new Date mill
  • 解决Windows10中Virtualbox安装虚拟机没有64位选项

    今天想在Windows 10系统安装完Virtualbox虚拟机 然后打算装一个CENTOS系统 但是选择安装系统的时候竟然没有64位操作系统的选项 经过一阵Google 终于解决了 在这里盘点一下出现这种情况的几种原因 解决Windows
  • 《深度学习入门》(鱼书)笔记 第一章 Python入门

    coding utf 8 class Man 示例类 示例类 def init self name self name name print Initilized def hello self print Hello self name d
  • Springboot缓存 注解@CachePut,@Cacheable,@CacheEvict 的作用及用法。

    在Spring Boot中 提供了一些用于缓存处理的注解 包括 CachePut Cacheable 和 CacheEvict 这些注解可以帮助简化缓存操作 并与底层缓存框架 如Ehcache Redis等 集成使用 1 CachePut
  • jenkins部署聚合项目报错[FATAL] Non-resolvable parent POM for xxx: Could not find artifact xxx

    项目改为聚合工程后使用jenkins部署时报错 如下 ERROR The build could not read 2 projects gt Help 1 org apache maven project ProjectBuildingE
  • 蓝桥杯 全球变暖【BFS】

    题目链接 AcWing 1233 全球变暖 你有一张某海域 N N像素的照片 表示海洋 表示陆地 如下所示 其中 上下左右 四个方向上连在一起的一片陆地组成一座岛屿 例如上图就有 2座岛屿 由于全球变暖导致了海面上升 科学家预测未来几十年
  • HTML5网页播放pcm语音流 VUE JS播放pcm语音流

    git源码地址 https github com SunnyWoo pcm voice git 效果图 将下面的组件文件直接放到我们的vue项目中运行即可看到效果
  • 计算机的工作原理

    文章目录 前言 一 计算机组成 二 工作原理 1 首先指令输入 由鼠标 键盘完成 2 计算机对指令 输出的处理 由CPU完成 3 计算机对信息的储存 由内存 磁盘完成 4 计算机输出信息 由显卡 显示器完成 总结 前言 电脑最直白 人话的描
  • Metasploit中meterpreter/reverse_tcp+exploit/multi/handler攻击实战教程

    由于是实战 肯定要一个服务器对吗 为了不搞破坏 我这里就不用服务器了 我现在已经用另一台电脑搭建了一个网站 用phpstudy快速搭建的 这台电脑IP是 192 168 1 103 我用的是渗透测试系统Kali Linux 由于此系统是自带
  • (十八)LCD1602实验

    本节我们来完成另一种在单片机上的显示的编程 使用LCD1602液晶显示器来显示我们想要输出的字符 输出 I LOVE MCU 和 MCU LOVE I 这两个短字符串 完成我们51单片机的最后一个简单实验 之后可能就会直接放几个简单项目在上
  • redis是单线程为什么速度还快

    1 完全基于内存 绝大部分请求是纯粹的内存操作 非常快 2 数据结构简单 对数据操作也简单 Redis中的数据结构是专门进行设计的 3 采用单线程 避免了不必要的上下文切换和竞争条件 也不存在多进程或者多线程导致的切换而消耗CPU 不用去考

随机推荐

  • windows server 2008修改远程桌面连接数

    安装了windows server 2008 R2 现在要远程连接 开启了服务器上的远程桌面连接 使用管理员远程登录 默认情况下windows server 2008只允许一个连接 默认一个账号最大2个连接 因需要两台电脑连接 在windo
  • 悬浮窗_今天聊聊悬浮窗搜题

    相信大部分的小伙伴都已经结课吧 忙着复习 忙着考试接下来给大家推荐一个 实用的软件 答题助手 答题助手有什么用呢 他可以帮你在手机上考试的时候 自己又不会的题目可以进行悬浮窗搜索 功能还是不错的 答题助手具体的功能介绍 1 悬浮窗扫题 大家
  • 混沌电路学习笔记

    历年电赛仪表 信号题 混沌信号产生实验装置 任务 要求 说明 思路 关键字提取 非线性系统的动态方程 蔡氏电路Chua s circuit wiki版本蔡氏电路 LTspice仿真实践 范德坡电路Vanderbilt circuit 考比兹
  • S-100电子海图标准简述 电子海图开发一百篇第五十篇

    通用海道测量数据模型 S 100 是国际海道测 量组织 IHO 以 ISO 19100 系列标准为基础 用面向对象的表示方法 以组件式理论框架将海道测量地理空间相关数据进行组织和交换的标准 IHO 于 2010 年 1 月发布 S 100
  • NVIDIA CUDA 高度并行处理器编程(一):CUDA简介

    NVIDIA CUDA 高度并行处理器编程 一 CUDA简介 1 数据并行性 2 CUDA的程序结构 3 向量加法kernel函数 4 设备全局存储器与数据传输 5 kernel 函数与线程 1 数据并行性 数据并行性是一种属性 这种属性支
  • Flutter学习(BottomNavigationBar、FloatingActionButton、Drawer、AppBar、PreferredSize)

    1 BottomNavigationBar BottomNavigationBar 是底部导航条 可以让我们定义底部Tab切换 bottomNavigationBar是Scaffold组件的参数 2 FloatingActionButton
  • 宏任务和微任务

    同步任务 逐条进行 异步任务 1 gt 固定时间 setTimeout setInterval requestAnimationFrame 帧时间固定 promise 每个时间段一样 2 gt 非固定时间 加载文件和加载图片 通信 固定时间
  • 视频无损放大软件:Enhance AI for Mac(支持m1)

    Topaz Video Enhance AI for Mac是一款专业的AI视频无损放大软件 topaz video enhance ai mac版使用时间信息有效提高视频质量和细节 从而达到最好的视频放大 去隔行 降噪和还原效果 而且放大
  • 基于JT808-2019,JT809-2019,JT1078与苏标主动安全协议的部标平台开发

    前言 开发一个可靠的支持视频与Adas的部标平台并不是那么容易 需要从网关 流媒体到应用平台架构再到前端界面友好性的交互 可能需要很多工程师历时好几个月 下面是根据几个方面分别对整个部标平台进行简单介绍 网关 之前的blog也写了很多关于网
  • Servlet——文件的上传

    1 文件上传注意点 必须要有form表单 请求方式必须是post请求 get请求有长度限制 enctype属性必须是multipart form data 数据以多段形式拼接 以二进制流的形式发送到服务器 利用servlet代码接受对应的文
  • WPF 中的window 窗体

    Window 窗体不能嵌套窗体 UserControl 用户控件 布局的时候像窗体那样布局就可以了 Page把窗体以网页形式展现 而一个XAML页面里只能有一个顶级元素 而顶级元素里面只能有一个子元素 因此要有布局控件 Window窗体属性
  • 【解决报错selenium-python】AttributeError: ‘Test_ActionChains‘ object has no attribute ‘driver‘

    Python selenium自动化测试脚本报错 AttributeError Test ActionChains object has no attribute driver 解决方法 在编代码的时候几次遇到同样的问提 找到解决方案后发现
  • python异步操作MySQL(aiomysql)

    安装aiomysql 依赖 Python3 4 asyncio PyMySQL 安装 pip install aiomysql 应用 基本的异步连接connection import asyncio from aiomysql import
  • 疯壳AI语音及人脸识别3-3语音传输与解析显示

    详情地址 https fengke club GeekMart views offline ai 购买链接 https fengke club GeekMart su fKw7Nb7oC jsp 视频地址 https fengke club
  • 源码安装PHP

    安装PHP 阿铭写这本教程时 php当前最新版本为5 5 相信大多网站还在跑着5 2甚至更老的版本 其实5 2版本的php很经典也很稳定 因为阿铭的公司一直在使用5 2版本 但是考虑到版本太老 难免会有些漏洞 所以建议你使用5 3或者5 4
  • 电子科技大学操作系统期末复习笔记(一):操作系统概述

    目录 前言 操作系统概述 操作系统的目标与功能 操作系统的定义 目标 功能 操作系统的历史 单用户系统 简单批处理系统 多道批处理系统 分时系统 个人电脑 分布式系统 互联网时代 移动计算时代 实时系统 操作系统的基本特征 并发 共享 虚拟
  • C++系统的避免各种指针错误

    C 常见的内存问题与解决 原始指针 1 动态内存使用者 仅仅是使用 不负责该对象的生命周期 这种情况下原始指针不会有任何问题 简洁明了 不会影响引用计数 更不会导致循环引用 2 几乎所有的第三方库都是以这种方式使用用户的数据的 智能指针 1
  • linux sleep 头文件

    include
  • Burpsuite使用

    Burpsuite使用 简介 Burp Suite 是用于攻击web 应用程序的集成平台 它包含了许多工具 并为这些工具设计了许多接口 以促进加快攻击应用程序的过程 所有的工具都共享一个能处理并显示HTTP 消息 持久性 认证 代理 日志
  • 编写PE文件解析器(一)

    第一篇先写一个PE格式解析器 学了那么久了写出来防止自己忘记 顺便练练手 PE格式解析是比较基础的内容 后面再越写越深 我写这个不是介绍pe格式 而是说编写解析代码 解释定义什么的网上一堆就不粘了 重要的定义我尽量简洁的描述清楚就行 如果想