PE文件结构2(实现PE文件载入)
现在我们已经学完了PE文件格式,但是尚还停留在纸上谈兵的阶段,作为Windows系统上的可执行文件格式,PE文件结构总是和结构体,指针等紧密联系在一起的。理解它的最好方法就是通过写一个类似LordPE的程序来帮助我们理解PE文件结构的底层实现逻辑。计算机到底是如何实现对于PE文件结构的读取和分析的,到底是怎么找到每一个数据的地址的,这是为我们今天研究的关键。
问题关键
1.如何读取导入文件
2.如何找到每个结构体的地址
3.熟悉PE文件结构对应的结构体(参考PE文件结构1)
一. 如何读取文件
首先通过CreatFileA函数打开文件;然后通过HeapAlloc函数分配空间;最后经过ReadFile函数读取文件内容至指定空间。这几个与文件有关的WindowsAPI函数是我们处理PE文件的关键。
二. 找到每个关键结构体的指针
在PE文件结构1当中已经介绍了,PE文件结构的每个组成部分都有其对应的结构体,那么只要我们熟悉了结构体的组成然后找到每个结构体对应的指针,那么问题也就解决了。
现在依次介绍每个部分对应指针应该如何寻址:
DOS首部:dosHeader = (PIMAGE_DOS_HEADER)lpBuffer;这里的lpBuffer其实就是文件的起始句柄了,PE文件是从DOS首部开始的,所以只要将起始句柄类型转化一下为对应的指针即可。
PE文件首部:ntHeader = (PIMAGE_NT_HEADERS)(lpBuffer + dosHeader->e_lfanew);这里就是一个RVA和VA的概念了,相对于文件起始地址为RVA也就是dosHeader->e_lfanew,加上文件的起始地址后才是我们可以用来寻址的指针。
ntHeader->FileHeader.Machine;
ntHeader->OptionalHeader.Magic;
由于PE文件首部内部还包含了两个结构体,这里举两个例子。
区块首部:imageSectionHeaderStruct = (PIMAGE_SECTION_HEADER)((DWORD)lpBuffer + dosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS32));要找到区块表的首部地址就需要先找到PE文件首部地址再加上PE文件首部大小,即为对应的区块首部地址。
由于节块的数目是不一定的,需要通过循环将其依次打印。
for (int i = 0; i < numSections; i++)
{
printf("SECTION HEADER #%d\n", i);
printf("\t%s\n", imageSectionHeaderStruct->Name);
printf("\t\tVirtual Size: 0x%x\n", imageSectionHeaderStruct->Misc.VirtualSize);
printf("\t\tVirtual Address: 0x%x\n", imageSectionHeaderStruct->VirtualAddress);
printf("\t\tRaw Size: 0x%x\n", imageSectionHeaderStruct->SizeOfRawData);
printf("\t\tRaw Address: 0x%x\n", imageSectionHeaderStruct->PointerToRawData);
printf("\t\tReloc Address: 0x%x\n", imageSectionHeaderStruct->PointerToRelocations);
printf("\t\tRelocations Number: 0x%x\n", imageSectionHeaderStruct->NumberOfRelocations);
printf("\t\tLine Numbers: 0x%x\n", imageSectionHeaderStruct->NumberOfLinenumbers);
printf("\t\tCharacteristics: 0x%x\n", imageSectionHeaderStruct->Characteristics);
imageSectionHeaderStruct++;
}
三. 导入表等的打印
导入表,导出表和资源表相对来说就比较麻烦一点,需要先在数据目录表当中寻找对应地址,然后再去数据段找到相应数据打印。
这里以导入表为例:
IMAGE_IMPORT_DESCRIPTOR* ImportTables = (IMAGE_IMPORT_DESCRIPTOR)(RTF(rvaaddr) + pBegin); 这里我们先找到导入表的数据目录表对应的地址。 2. 然后找到对应的IAT地址,即int firstthunk = (int)ImportTables2->FirstThunkl;```这就是我们需要找的地址,之后依次打印即可。
感兴趣的可以查看https://github.com/FULLSHADE/pe-Parser。
PE文件结构2(实现PE文件载入)的更多相关文章
- PE文件结构详解(一)基本概念
PE(Portable Execute) 文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 何扩展名.那 ...
- 再探.NET的PE文件结构(安全篇)
一.开篇 首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软 ...
- PE文件结构(四) 输出表
PE文件结构(四) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输出表 一般来说输出表存在于dll中.输出表提供了 文件里函数的名字跟这些函数的地址, PE装载器通过输出表来改 ...
- PE文件结构(五岁以下儿童)基地搬迁
PE文件结构(五岁以下儿童) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 基址重定位 链接器生成一个PE文件时,它会如果程序被装入时使用的默认ImageBase基地址(VC默认 ...
- COFF/PE文件结构
COFF/PE文件结构 原创 C++应用程序在Windows下的编译.链接(二)COFF/PE文件结构 2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下, ...
- PE文件结构及其加载机制
一.PE文件结构 PE即Portable Executable,是win32环境自身所带的执行体文件格式,其部分特性继承自Unix的COFF(Common Object File Format)文件格 ...
- PE文件结构(三) 输入表
PE文件结构(三) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输入表 输入函数,表示被程序调用可是它的代码不在程序代码中的,而在dll中的函数.对于这些函数.磁盘上的可执行文 ...
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...
- PE文件结构学习
PE:Portable Executable File Format(可移植的执行体).Windows平台主流可执行文件格式..exe与.dll文件都是PE格式.32位的叫做PE32,64位的叫做PE ...
- PE文件结构详解(六)重定位
前面两篇 PE文件结构详解(四)PE导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的: 在这里 ...
随机推荐
- 2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1。
2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1. 福大大 答案2021-03-19: 按行遍历二维数组,构造直方图. 单调栈,大 ...
- 开发者一定要知道的 API 管理五大趋势
API First 大势所趋,APIaaS(API 作为服务)也将受到越来越多企业和组织的选择,研发团队对 API 研发管理工具的要求也水涨船高. API 在今天的数字化世界中扮演着至关重要的角色,随 ...
- windows系统下python下载与安装以及可视化工具PyCharm安装
1.python下载 python下载官网: https://www.python.org/ http://python.p2hp.com/ 中文网 点击进入官网,进入window下载页面. http ...
- antd 在webpack.config配置主题色
虽然官方提供了craco-less 来 覆盖less-loader 提供的 less 变量,但自己也想试着修复config来配置一下 首先需要运行 yarn eject 来暴露webpack的配置 其 ...
- 代码随想录算法训练营Day9|字符串KMP算法总结
代码随想录算法训练营 代码随想录算法训练营Day9字符串|KMP算法 8. 实现 strStr() 459.重复的子字符串 字符串总结 双指针回顾 28. 实现 strStr() KMP算法 题目链接 ...
- 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别
这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: import torch imp ...
- 海量数据运维要给力,GaussDB(for Cassandra)来助力
摘要:应用运维管理平台(AOM)和Cassandra是两个不可分割的组成部分,它们共同构成了一个高效的解决方案,可以帮助企业在应用运维业务上取得巨大的优势.在这篇文章中,我们将介绍AOM和Cassan ...
- C++面试八股文:聊一聊指针?
某日二师兄参加XXX科技公司的C++工程师开发岗位第17面: 面试官:聊一聊指针? 二师兄:好的. 面试官:你觉得指针本质上是什么? 二师兄:这要从内存地址开始说起了.如果有一块容量是1G的内存,假设 ...
- KeyChrone-K8使用体验
盛名之下,其实难副.我是这应该是我对K8的初上手体验.抛开Mac的使用者,我想其他人应该很难对这款键盘爱得起来.一直以来对手头的Filco的有线比较介意,想换个无线键盘.因为平时调程序比较多,所以F功 ...
- 韩顺平Spring体系化笔记(内含ioc,aop,动态代理等底层原理)
Spring Spring 核心学习内容 IOC.AOP. JdbcTemplate.声明式事务 1.Spring 几个重要概念 Spring 可以整合其他的框架(Spring 是管理框架的框架) S ...