欢迎大家一起来Hacking水友攻防实验室学习,渗透测试,代码审计,免杀逆向,实战分享,靶场靶机,求关注
PE文件学习
推荐工具:lord PE、stud PE 《PE权威指南》,了解格式,看雪,吾爱破解 ,EXE是如何组成的,如何逆向一个EXE文件和安卓文件。
- 这些东西不能不知道
EXE文件和DLL文件实际上是一样的,唯一的区别就是用一个字段标示出了这个文件是EXE文件还是DLL文件
64位不过就是把32位的字段拓展成64位,也叫PE32+文件,没本质区别。
PE文件的定义基本都在“我的电脑”——下的“winnt.h”头文件中。
而在这个“winnt.h”文件中的image format下就是系统定义的PE结构:
我们需要能看懂这张图片:(桌面)
- PE文件基础知识
Pe文件是一个平面地址结构,所有代码和数据都被合并在一起,组成一个很大的结构。
文件的内容被分为不同的区块(堆、栈……),各个区块按照页边界来对齐,区块没有大小限制,是一个连续的结构(区块 = 很多连续的页合起来)。
PE文件被放在硬盘中的时候,按照那张图一样放着,但是使用pe文件的时候要映射到内存中,注意映射过来之后不是100%格式没变,在硬盘中啥样在内存中还是啥样。而是由一个叫做PE装载器的东西决定哪里要映射哪里不要映射。一般文件较高偏移位置也要映射到较高的内存地址。
映射关系如下:
我们在使用(调用)一个pe文件的时候必须抓住它的基地址,一般使用函数:
HMODULE GETModuleHandle (LPCTSTR IpModuleName)
返回一个句柄指针(基地址编号,可以理解为基地址,指向这个基地址的指针) , 一个pe文件可以视为一个模块,参数是指向这个pe文件(模块)名称的指针。
- DOS头部分
小甲鱼PE详解之IMAGE_DOS_HEADER结构定义即各个属性的作用(PE详解01)_fish_c的博客-优快云博客
- PE头(NT)
小甲鱼PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)_fish_c的博客-优快云博客
PE文件头(Image_NT_Header)挨着DOS stub,在执行pe文件的时候,pe装载器将从IMAge_DOS_Header结构体中的elfanew中找到pe头的起始偏移量,加上基地址就可以得到pe头文件的指针。
就拿上图来说:00h + D0h = D0h pe头指针 = IMage 基址 + dos_header ->elfanew
从这里开始看到的是NT部分(pe头部分):
一开始是signature 5045表示是pe头标记(P/E的anscii码)
然后是文件头file_header:这个结构体包括:
机器平台(CPU类型):014c说明这是x86平台的CPU
这个EXE文件拥有的区块表数目:4块
文件何时被创建:
可选文件头大小:一般32位是00 E0,64位是00F0,决定了后面的可选文件头大小多大
文件信息标志,文件属性:012F , 这个需要或运算结合微软的表格来。
接下来是可选映像头部,
小甲鱼PE详解之IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用(PE详解03)_fish_c的博客-优快云博客
特别大一块,
这个地方记着不可以背,只是工具书!
Address of entry point,
Image base :
对于EXE文件来说,由于每个文件总是使用独立的虚拟地址空间,优先装入地址不可能被**模块占据,所以EXE总是能够按照这个地址装入,这也意味着EXE 文件不再需要重定位信息。对于DLL文件来说,由于多个DLL文件全部使用宿主EXE文件的地址空间,不能保证优先装入地址没有被**的DLL使用,所以 DLL文件中必须包含重定位信息以防万一。因此,在前面介绍的 IMAGE_FILE_HEADER 结构的 Characteristics 字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_STRIPPED 位总是为0,而EXE文件的这个标志位总是为1。
在链接的时候,可以通过对link.exe指定/base:address选项来自定义优先装入地址,如果不指定这个选项的话,一般EXE文件的默认优先装入地址被定为00400000h,而DLL文件的默认优先装入地址被定为10000000h。
数据块如果可以一致,那就是“兼容”。