![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PE
跃然实验室
这个作者很懒,什么都没留下…
展开
-
PE结构
PE(Portable Executable)原创 2019-06-12 18:59:27 · 254 阅读 · 0 评论 -
PE操作类--判断PE文件
判断一个文件是否为合法PE文件通常只需判断“MZ”头和“PE”头//判断是否为PE结构BOOL CPe32 ::IsPeFile(TCHAR* pFileName){ if (pFileName == NULL) { return FALSE ; } ...原创 2019-06-10 20:34:09 · 1092 阅读 · 0 评论 -
加载PE文件——内存映射文件
将程序安装内存对齐的方式读取到内存有两种方法:1、内存映射文件2、PE加载器模拟法1、内存映射文件 lpHeader所指内存是只读的,尽管是PAGE_READWRITE// LoadPeWithMap.cpp : Defines the entry point for the console application.//#include "stdafx.h"#...原创 2019-06-10 20:34:03 · 734 阅读 · 0 评论 -
PE导出表--查找入口地址
从序号查找入口地址(1)定位到PE文件头。(2)从PE文件头中的IMAGE_OPTIONAL_HEADER32结构中取出数据目录表,并从第一个数据目录中得到导出表的地址。(3)从导出表的nBase字段得到起始序号。(4)将需要查找的导出序号减去起始序号,就得到了函数在入口地址表中的索引。(5)检测索引值是否大于导出表的NumberOfFunctions字段的值,如果大于后...原创 2019-06-10 20:33:55 · 1191 阅读 · 0 评论 -
PE导入表
导入表的位置:在PE文件的PE文件头导入表通常位于 .idata 段导入函数(Import functions )就是被程序调用但其执行代码又不在程序中的函数函数的代码位于一个或者多个DLL中动态链接 ——当PE文件被装入内存的时候,Windows装载器才将DLL装入,并将调用导入函数的指令和函数实际所处的地址联系起来导...原创 2019-06-12 18:58:05 · 688 阅读 · 0 评论 -
PE header
PE header 由三部分组成 字串 “PE\0\0”(Signature) 映像文件头(FileHeader)SizeOfImage字段(+50h)内存中整个PE映像尺寸按照“SectionAlignment”对齐的,它就是所有头和节的长度的总和 可选映像头(OptionalHeader)IMAGE_NT_HEADERS STRUC...原创 2019-06-12 18:57:43 · 957 阅读 · 0 评论 -
Windows加载器加载PE文件
加载器读取一个PE文件的过程如下:1. 先读入PE文件的DOS头,PE头和Section头。2. 然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。3. 根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定义的数据来修改所映射的页的属性。4. 如果文件被加载的地址不是Imag...原创 2019-06-11 15:13:18 · 1472 阅读 · 0 评论 -
PE重定位表
重定位表解决Pe文件实际加载基址与PE文件中所指定的加载基址不同时带来的问题。保存有待修正数据的地址EXE文件不存在重定位表:对于EXE文件来说,每个文件总是使用独立的虚拟地址空间,所以EXE总是能够按照这个地址装入,这意味着EXE 文件不再需要重定位信息。 DLL文件需要重定位表:对于DLL文件来说,由于多个DLL文件全部使用宿主EXE文件的地址空间,...原创 2019-06-11 15:13:12 · 378 阅读 · 0 评论 -
节表和节——PE文件到内存的映射
节表和节——PE文件到内存的映射.data :未初始化的数据Rsize:只存有用数据PE文件执行时 ,Windows装载器建立好虚拟地址和PE文件之间的映射关系Windows装载器在装载DOS部分、PE文件头部分和节表部分时不进行任何处理装载节的时候将根据节的属性做不同的处理内存页的属性节的偏移...原创 2019-06-11 15:13:04 · 884 阅读 · 0 评论 -
PE解析导入表--实例
//得到导入表的信息:导入库名,导入函数ID,导入函数地址void CPe32 ::GetImportTableInfo(){ if (m_bSuccess) { //空结尾的导入表结构成员 I...原创 2019-06-11 15:12:59 · 434 阅读 · 0 评论 -
RVA和RAW(文件偏移)的转换
节表和节——RVA和文件偏移的转换RVA和文件偏移的转换的转换算法(1)循环扫描节表并得到每个节在内存中的起始RVA(根据VirtualAddress字段),并根据节的大小(SizeOfRawData字段)算出节的结束RVA,最后比较判断目标RVA是否落在某个节之内。(2)如果目标RVA处于某个节之内,那么用目标RVA减去节的起始RVA,这样就得到了目标RVA相对于节起始...原创 2019-06-11 15:12:52 · 3298 阅读 · 0 评论 -
PE导出表
PE文件被执行的时候,Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入根据DLL文件中的函数导出信息对被执行文件的IAT表进行修正这些包含导出函数的DLL文件中,导出信息被保存在导出表中通过导出表,DLL文件向系统提供导出函数的名称、序号和入口地址等信息Windows装载器通过这些信息来完成动态链接的过程获取导出表...原创 2019-06-11 15:12:46 · 165 阅读 · 0 评论 -
PE文件操作类
1、分析类中需要存储的信息2、声明类3、类构造函数:传入PE文件完整路径,判断PE文件合法性,加载PE文件,为PE各部分结构体指针变量赋值。4、析构函数:释放内存5、赋值函数:为PE各结构体的指针赋值...原创 2019-06-10 20:34:16 · 222 阅读 · 0 评论 -
PE解析节表
//得到所有节的信息:节名,加载后地址,加载后大小,文件中地址,文件中大小void CPe32 ::GetSectionInfo(){ IMAGE_SECTION_HEADER * pPeSectionHeader = m_pPeSectionHeader; if (m_bSuccess) ...原创 2019-06-10 20:34:26 · 446 阅读 · 0 评论 -
加载PE文件——PE加载器模拟法
1、找到文件加载到内存的基址 通常为0x0040 00002、取得内存对齐粒度3、加载pe头,按照内存对齐粒度读取到指定起始地址的内存处4、加载各个节。得到节数目,定位节表,按照内存对齐粒度读取到内存,不足的用0填充。5、基址不对,需要重定位修复。// LoadPeWithRead.cpp : Defines the entry point...原创 2019-06-10 20:34:32 · 2338 阅读 · 0 评论 -
PE得到节缝隙的大小
DWORDGetSectionGapSize(PIMAGE_SECTION_HEADERs){//此处处理并不标准,因为有可能得出负数,先不考虑这种情况returns->SizeOfRawData -s->Misc.VirtualSize;}SizeOfRawData:物理大小M...原创 2019-06-13 11:27:17 · 413 阅读 · 0 评论 -
文件偏移——>RVA
文件偏移——>RVARVA 代表相对虚拟地址。它是相对虚拟空间里的一个地址 。举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h。每个RVA都是相对于模块的起始VA的。...原创 2019-06-13 11:27:08 · 387 阅读 · 0 评论 -
DOS文件头和DOS块
可执行文件的向下兼容性DOS下执行一个PE文件?PE文件中的DOS部分由MZ格式的文件头和可执行代码部分组成,可执行代码被称为“DOS块”(DOS stub长度不定)MZ格式的文件头由IMAGE_DOS_HEADER结构定义DOS文件头的基本作用:1、若在DOS下执行一个PE文件,系统可以将文件解释为DOS下的.exe可执行格式,...原创 2019-06-12 18:58:50 · 650 阅读 · 0 评论 -
PE修改节属性
节属性更改-----可执行//修改节属性,使之属于可执行节pLastSectionInfo->Characteristics |= IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_WRITE ;原创 2019-06-12 18:58:44 · 921 阅读 · 0 评论 -
PE获取最后一个节
PIMAGE_SECTION_HEADER GetLastSectionInfo(void * pBase){ IMAGE_DOS_HEADER * dos_head; PIMAGE_SECTION_HEADER section_header; IMAGE_NT_HEADERS32 * pPeHeader; ...原创 2019-06-12 18:58:38 · 324 阅读 · 0 评论 -
判断最后一节是否需要扩大
//判断最后一节是否需要扩大DWORD NeedLastSectionEnlargeSize(PIMAGE_SECTION_HEADER pLastSectionInfo, int ShellSize){ int gapsize; gapsize = GetSectionGapSize( pLastSectionInfo); ...原创 2019-06-12 18:58:18 · 198 阅读 · 0 评论 -
PE汇编--导出函数名实际地址
mov esi, edi ; edi kernel32 baseAddress ,PE头位置add esi, [esi+3Ch] ; esi PE文件头,3Ch是DOS头最后一项mov esi, [esi+78h] ; esi 导出表相对地址地址赋给esi ...原创 2019-06-12 18:58:12 · 339 阅读 · 0 评论 -
观察PE文件结构
一、观察PE文件结构 1、PEid:使用何种编译器;使用PEid插件 2、LordPE:是否有恶意性 1)节分配:节名字是否规范 标志位:E开头,则可执行 2)入口点: 0E000在最后一节,可能...原创 2019-06-10 20:34:56 · 258 阅读 · 0 评论 -
PE解析导出表
PE文件头文件——数据目录表导出目录位于数据目录表的起始位置指向的地址指向导入表1、函数名称字符串所在地址的RVA值2、导出函数名对应的导出序号3、导出序号对应的导出函数地址RVA值解析导出表步骤:1、找到导出目录,通过导出目录定位到导出表的文件偏移。2、查看导出表结构第七个成员(NumberOfFu...原创 2019-06-10 20:34:49 · 236 阅读 · 0 评论 -
PE解析导出表--代码
//导出表信息typedef struct _EXPORT_INFO{ char cDllName[256]; //用于保存DLL库名 pFuncInfo pFunctionInfo; //指向FUNC_INFO结构体数组,用于保存若干个函数信息 long lFuncNum...原创 2019-06-10 20:34:43 · 473 阅读 · 0 评论 -
PE对齐粒度
按照内存对齐粒度读取到内存,不足的用0填充。文件对齐粒度200内存对齐粒度1000对齐后的大小//以dwAlignment 对齐dwOperateNum 值,也就是让dwOperateNum为dwAlignment的整数倍DWORD AlignmentNum(DWORD dwOperateNum, DWORD dwAlignment ){ ...原创 2019-06-10 20:34:38 · 1584 阅读 · 0 评论 -
PE导入表-实例
目标:notepad 工具:LordPE目标:在文件中找到这个函数LordPE--计算RVA到Offset的值Import RVA:0000A048 Offset: 00009448FirstThunk RVA:0000A224 Offset: 00009624O...原创 2019-06-11 15:12:38 · 458 阅读 · 0 评论