PE解析器与加载器编写指南
PE解析器与加载器编写指南
最近准备去实习,看公司要求应该开发PE相关的查杀引擎,因此再回头复习一下PE格式,重新写一个PE解析器和PE加载器,再此记录下有关坑。
PE解析器部分:
1)如何确定节区表
正确计算方法: pSection = pNtHeader + sizeof(IMAGE_NT_HEADER) 。
错误计算方法:pSection = pFile + sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADER)。
原因:DOS_HEADER后面还留有一段数据,并不紧跟着NT_HEADER,因此你这样计算是错误的!
2)RVA与FOA的转换
我们现在是PE解析,其都基于FOA,因此我们现在只讲解RVA->FOA进行转换,在后面的PELoader这块,我们再来分析FOA->RVA。
其分析是基于节表的,循环遍历节表,判断其落在相关区间,然后在差值计算,得到对应的FOA,如下图:
3)导入表的解析
导入表是当DLL加载时,根据该PE文件的导入表对其进行修复操作,之后函数找到该函数就可以找到对应的函数地址。
现在我们来回顾一下导入表结构,其导入表结构如下:
如果我们要获取整张表的数据,我们需要建立一个二维数组,对应着两行数据,因此我们设计了如下数据结构:
现在,随之而来的一个问题:如何确定导入表的个数?PE文件的数据结构似乎没有一个数据表明其个数。
答案是其连续0为结束,因此我们申请一块中间内存进行比较即可。(这种方式在PE文件解析中经常用到)。
下面就是初始化导入表的代码,很好理解:
4)导出表的解析
导出表主要是三张子表,函数名称表,函数序号表,函数地址表,这三张表用一张图就很好解决。
因此我们采用如下数据结构存储:
解析代码:
先遍历函数地址表,地址和序号初始化,名字先设置为NULL,之后我们再遍历名称和序号表,根据序号将其赋值。
5)重定位的解析
重定位表构造相对简单,其sizeOfBlock是加上块头部8字节的大小,计算偏移是要注意不要再加多了。
重定位元素也很简单,以WORD为单位,但要注意高4位为0x3才有效,修复重定位表时要检查该位是否有效。
我们开始是如下的数据结构:
下面为重定位表的解析,其依然采用中间变量的方法:
PE加载器
PE加载器,就是将一个PE文件映射到自己的内存,然后启动其main函数运行程序。
一个PELoader的实现,需要有几个注意点:修复IAT表;修复重定位表;将内存属性写为可执行。
1)修复IAT表
这里有两个函数 LoadLibrary 和 GetProcAddress,这两个函数能帮助我们很好的找到目标函数,其代码如下:
2)修复重定位表
3)修改属性并执行Main函数
我们开始将文件映射时,其是只读属性,在修复之后如果执行Main函数会触发0xc0000005页权限访问异常。
因此我们需要通过如下代码将其置为可执行属性,当然这里存在瑕疵,但是我们只是写个简单Demo,也没太多要求。
PE解析器与加载器编写指南的更多相关文章
- C编译器、链接器、加载器详解
摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...
- Day18 (一)类的加载器
一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这个虚拟机实例也就随之消亡. 如果在同一台计算机上同时运行多个Java程序 ...
- KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器
无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...
- jQuery Mobile 手动显示ajax加载器,提示加载中...
在使用jQuery Mobile开发时,有时候我们需要在请求ajax期间,显示加载提示框(例如:一个旋转图片+一个提示:加载中...).这个时候,我们可以手动显示jQuery Mobile的加载器,大 ...
- JavaScript AMD 模块加载器原理与实现
关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者 ...
- xLua自定义加载器
xLua入门基础 环境配置 github下载xLua文件: xLua是腾讯开发,据说比较先进: 下载下来后将Plugins和XLua文件夹考进项目: Plugins多平台权限:XLua和C#交互: t ...
- 【译】CLR类型加载器设计
前言 本文翻译自BotR中的一篇,原文链接 Type Loader Design ,可以帮助我们了解CLR的类型加载机制(注意是Type类型,而不是Class类),文中涉及到术语或者容易混淆的地方,我 ...
- How Tomcat Works 读书笔记 八 加载器 上
Java的类加载器 具体资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
- PE可执行文件加载器
PE文件加载器 模仿操作系统,加载pe文件到内存中 该项目主要是为了检测pe的学习程度,是否都完全理解了.当然没有完全理解 实现功能的如下: 模仿操作系统,加载pe文件到内存中,然后执行待执行的pe文 ...
随机推荐
- 自动网络搜索(NAS)在语义分割上的应用(一)
[摘要]本文简单介绍了NAS的发展现况和在语义分割中的应用,并且详细解读了两篇流行的work:DARTS和Auto-DeepLab. 自动网络搜索 多数神经网络结构都是基于一些成熟的backbone, ...
- MYSQL SQL 语句修改字段默认值
alter table tablename alter column drop default; (若本身存在默认值,则先删除) alter table tablename alter column ...
- javaweb之Servlet,http协议以及请求转发和重定向
本文是作者原创,版权归作者所有.若要转载,请注明出处. 一直用的框架开发,快连Servlet都忘了,此文旨在帮自己和大家回忆一下Servlet主要知识点.话不多说开始吧 用idea构建Servlet项 ...
- CGAL代码阅读跳坑指南
CGAL代码阅读跳坑指南 整体框架介绍 CGAL中的算法和数据结构由它们使用的对象类型和操作参数化.它们可以处理满足特定语法和语义需求的任何具体模板参数.为了避免长参数列表,参数类型被收集到一个单独的 ...
- HTML常用API(位置信息、音频视频)
感谢:链接(讲解的很详细) 位置信息 1.代码: <script type="text/javascript"> navigator.geolocation.getCu ...
- QTabWidget 中 关于Tab 关闭和添加的基本教程!
QTabWidget是PyQt5 中使用较为广泛的容器之一,经常会在日常使用的软件中用到它:QTabwidget是由几个标签组成,每个标签可以当作一个界面,下面就是应用Qtabwidget的一个简单例 ...
- 使用 LIKE 的模糊查询
字符串匹配的语法格式如下: <表达式1> [NOT] LIKE <表达式2> 字符串匹配是一种模式匹配,使用运算符 LIKE 设置过滤条件,过滤条件使用通配符进行匹配运算,而不 ...
- Python基础002---基础知识
一.标识符 标识符是自己定义的,是开发人员在程序中自己定义的一些符号和名称,如变量名.函数名等.在 Python 里,标识符由字母(区分大小写).数字.下划线组成,且数字不能开头.常用的命名方法有小驼 ...
- .Net Core基础的健康检查
前言 健康检查能查看我们的应用程序当前是否是一个健康的运行状态.微软已经给我们提供了健康检查轮子,只需要简单的配置就能完成服务的状态检查.一起来实现一个最简单的健康检查吧. 开始 新建一个空的webA ...
- 【JMeter_05】创建第一个简单的接口脚本
聚合数据:提供了很多开放的API,可以去练习使用https://www.juhe.cn/ 如果有小伙伴对HTTP协议不是很了解,可以看下这里 http://home.ustc.edu.cn/~xie1 ...