影子经纪人-官网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 147|回复: 10

PE文件笔记一 PE介绍

[复制链接]

该用户从未签到

2

主题

2

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2021-7-19 22:19:28 | 显示全部楼层 |阅读模式
个人笔记来到新篇章:PE
先前的笔记传送门:逆向基础笔记一 进制篇
之后的笔记索引:
PE文件笔记二 PE文件的两种状态
PE文件笔记三 DOS部分
PE文件笔记四 PE文件头之标准PE头
PE文件笔记五 PE文件头之扩展PE头
PE文件笔记六 节表和节
PE文件笔记七 RVA与FOA转换
PE文件笔记八 实战之HOOK程序添加弹窗
PE文件笔记九 实战之HOOK程序添加弹窗续
PE文件笔记十 扩大节
PE文件笔记十一 新增节
PE文件笔记十二 修正内存对齐
PE文件笔记十三 合并节
PE文件笔记十四 导出表
PE文件笔记十五 导入表
PE文件笔记十六 代码重定位
PE文件笔记十七 重定位表
PE

需要用到的工具

十六进制文本编辑工具:WinHex和UltraEdit
工具论坛随便一搜或者百度就有,这里就不提供了
PS:这两个工具在论坛虚拟机中的工具包里都有集成
工具的作用

首先要明确任何文件在计算机的存储都是0或1(二进制)
上面的两个工具就是用于查看文件在计算机存储的内容
由于0和1比较冗长,所以使用十六进制来显示数据
准备好工具后正式开始学习PE
学习PE前需要先了解一下可执行文件
可执行文件

什么是可执行文件

可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件
可执行文件的格式

Windows平台

PE(Portable Executable)文件结构
翻译为:可移植(这里的可移植局限于Windows平台,不同版本的Win10 Win7 WinXp等)         可执行
Linux平台

ELF(Executable and Linking Format)文件结构
翻译为:执行 和 连接 格式
常见可执行文件

.exe        .sys .dll等都是windows下的可执行文件(它们都遵循PE文件结构的格式
常见非可执行文件

    .txt .png .mp4等等都是非可执行文件,它们都需要使用其它可执行文件的软件进行加载.txt可以使用Notepad、UltraEdit等 文本 工具查看.png可以使用PhotoShop等 图片 工具查看.mp4可以使用PotPlayer等 播放器 工具查看
为什么要学习PE

    PE文件是Windows可执行程序必须满足的规范对软件的加壳和脱壳都基于PEEXE文件如何加载到内存中也涉及PE的知识一个合格的逆向人员,必须熟悉PE
如何识别PE文件

PE文件特征(PE指纹)

前2个字节

分别用UltraEdit打开.exe .dll .sys 文件,观察特征前2个字节
本人使用的三个文件分别为:
.exe:EverEdit.exe(文本编辑工具)
.dll:dbghelp.dll(调试跟踪相关的一个dll,在C:\Windows\System32\dbghelp.dll里拷贝的)
.sys:passTp.sys(自己写的一个驱动程序,作用嘛大家懂的( ̄︶ ̄)↗ )
.exe
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(1)
.dll
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(2)
.sys
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(3)
可以看到这三个文件的头2个字节都是4D 5A(ASCII码为MZ)
3Ch位置数据

再看这三个文件各自位于3Ch位置的数据
.exe
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(4)
数据为:F0
.dll
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(5)
数据为F8
.sys
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(6)
数据为D8
对应数据的位置

.exe
先前的数据为F0,查看对应F0位置的2字节数据
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(7)
.dll
先前的数据为F8,查看对应F8位置的2字节数据
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(8)
.sys
先前的数据为D8,查看对应D8位置的2字节数据
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(9)
可以看到无论是exe、dll还是sys,通过上述方式找到的数据都为:50 45(对应ACSII码为PE)
小总结

如果一个文件,它的头两个字节为4D 5A(ASCII码为MZ),并且通过3Ch位置的数据再找到的位置里的数据为PE则基本可以断定这个文件是Windows下的可执行文件(满足PE结构)
反例

随便拉一个图片png文件进来看看
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(10)
很显然,开头的两个字节就已经表明它不是一个PE文件了
PS:识别可执行文件不能通过文件的后缀名来判断,而应该采用上述的方式进行判断,因为后缀名是可以改的ˋ( ° ▽、° )
PE文件总体结构

通过前面可以得知如何识别一个文件是否是PE文件
但是前面在前面为什么是查看一个文件的前2个字节和3Ch的位置,以及其它位置数据作用呢
这便是PE结构所规定
下面是PE文件的总体结构
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(11)
可以看到先前判断PE文件特征里的头两个字节对应这里的文件头:DOS ‘MZ’ HEADER
后面根据3Ch得到的50 45(对应ACSII码为PE)对应这里的PE文件头中的"PE"
PE在C中的定义

PE文件结构自然是一种数据结构,不过这种数据结构比较复杂
在C语言的winnt.h这个头文件中定义了PE文件结构相关的结构体
可以通过C语言中PE的定义来更好地学习PE
随便创建一个空的控制台项目,然后引入winnt.h这个头文件
  1. #include<winnt.h>
  2. int main(int argc, char* argv[])
  3. {
  4.         return 0;
  5. }
复制代码
然后在头文件这里右键→打开文档<winnt.h>即可
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(12)
接下来结合winnt.h这个头文件学习PE文件的总体结构:
DOS部首

该部分结构对应winnt.h中的_IMAGE_DOS_HEADER结构体
可以在先前打开的winnt.h中Ctrl+F搜索_IMAGE_DOS_HEADER
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(13)
查找后得到:
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(14)
对应代码为:
  1. typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
  2.     WORD   e_magic;                     // Magic number
  3.     WORD   e_cblp;                      // Bytes on last page of file
  4.     WORD   e_cp;                        // Pages in file
  5.     WORD   e_crlc;                      // Relocations
  6.     WORD   e_cparhdr;                   // Size of header in paragraphs
  7.     WORD   e_minalloc;                  // Minimum extra paragraphs needed
  8.     WORD   e_maxalloc;                  // Maximum extra paragraphs needed
  9.     WORD   e_ss;                        // Initial (relative) SS value
  10.     WORD   e_sp;                        // Initial SP value
  11.     WORD   e_csum;                      // Checksum
  12.     WORD   e_ip;                        // Initial IP value
  13.     WORD   e_cs;                        // Initial (relative) CS value
  14.     WORD   e_lfarlc;                    // File address of relocation table
  15.     WORD   e_ovno;                      // Overlay number
  16.     WORD   e_res[4];                    // Reserved words
  17.     WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
  18.     WORD   e_oeminfo;                   // OEM information; e_oemid specific
  19.     WORD   e_res2[10];                  // Reserved words
  20.     LONG   e_lfanew;                    // File address of new exe header
  21.   } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
复制代码
关于DOS头里的成员的具体说明这里暂且不表,留作的笔记再详细说明
这里主要说明一下各部分的大体作用
首先的这个DOS部首,可以说是Windows的历史遗留问题了,因为Windows程序最早是在DOS系统(16位系统)上运行的
所以该部分主要是给DOS用的(向下兼容)
PE文件头(NT头)

该部分结构对应winnt.h中的_IMAGE_NT_HEADERS结构体
使用同样的方法得到对应的代码:
  1. typedef struct _IMAGE_NT_HEADERS {
  2.     DWORD Signature;
  3.     IMAGE_FILE_HEADER FileHeader;
  4.     IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  5. } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
复制代码
可以看到PE文件头对应的结构体中还包含了其它结构体,这里依旧只介绍大体作用,细节留作之后的笔记
这里的PE文件头相对于先前的DOS部首则是给Windows使用的
块表(节表)

该部分结构对应winnt.h中的_IMAGE_SECTION_HEADER结构体
使用同样的方法得到对应的代码:
  1. typedef struct _IMAGE_SECTION_HEADER {
  2.     BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
  3.     union {
  4.             DWORD   PhysicalAddress;
  5.             DWORD   VirtualSize;
  6.     } Misc;
  7.     DWORD   VirtualAddress;
  8.     DWORD   SizeOfRawData;
  9.     DWORD   PointerToRawData;
  10.     DWORD   PointerToRelocations;
  11.     DWORD   PointerToLinenumbers;
  12.     WORD    NumberOfRelocations;
  13.     WORD    NumberOfLinenumbers;
  14.     DWORD   Characteristics;
  15. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
复制代码
块表主要用来表示当前文件一共分为几个部分,和后面的块相对应
块表决定了后面的块,每一块从哪里开始,里面存储的数据是什么等等


块部分是由前面的块表决定的,是具体的存储数据的部分
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(15)
总结

网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(16)
网络新闻动向交流-个人笔记来到新篇章:PE先前的笔记传送门:逆向基础笔记一 进制篇之后的笔记索引:PE文件笔记二 PE文件(17)

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:20:05 | 显示全部楼层
想要深度学习PE结构的可以去看武汉大学彭国军教授在B站的课https://www.bilibili.com/video/BV1HD4y1m7VJ?p=24
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:20:31 | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:20:50 | 显示全部楼层
感谢老师的辛勤付出,让我受益匪浅。
回复

使用道具 举报

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-19 22:21:49 | 显示全部楼层
好家伙,又更新新的了
回复

使用道具 举报

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-19 22:22:10 | 显示全部楼层
感谢分享
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:22:23 | 显示全部楼层
感谢分享
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:22:40 | 显示全部楼层
我在疯狂摸鱼,明明还有正事要做的
搞了这个笔记这下得好好忏悔做正事了
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:23:39 | 显示全部楼层
谢谢分享
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-19 22:24:27 | 显示全部楼层
只要大佬分享,我就没贴都追
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭Powered by ©科大讯飞语音云

QQ|Archiver|手机版|小黑屋|TBC ( 鄂ICP备19004742号(鄂ICP备19004742号-2) )|网站地图|鄂ICP备19004742号(鄂ICP备19004742号-2) 联系站长

GMT+8, 2021-7-29 14:00 , Processed in 0.796875 second(s), 68 queries .

Powered by TBC! X3.4

© 2001-2020 TBC.. 技术支持 by 中国c.n.m安全小组

快速回复 返回顶部 返回列表