前言

PE文件的全称是Portable Executable ,意为可移植的可执行文件,常见的有EXE,DLL,SYS,COM,OCX,PE文件是微软Windows操作系统上的程序文件。

简单来理解,就是一种数据结构。我们知道知道CPU只认识二进制数,所以可执行文件保存在磁盘中都是以二进制数保存的,不过为了查看,所以市面上的编辑器都是用16进制显示的,比如下面这样,使用010Editer打开一个PE文件:

PE文件结构如下:

有的数据结构是用来执行的代码,有的数据结构是用来保存数据。

基础知识

  • 基地址(ImageBase):当PE文件通过Windows加载器载入内存后,内存中的版本称为模块,映射文件的起始地址称为模块句柄,可通过模块句柄访问内存中其他数据结构,这个内存起始地址就称为基地址。
  • 虚拟地址(VA):在Windows系统中,PE文件被系统加载到内存后,每个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址。
  • 相对虚拟地址(RVA):可执行文件中,有许多地方需要指定内存中的地址。例如,应用全局变量时需要指定它的地址。为了避免在PE文件中出现绝对内存地址引入了相对虚拟地址,它就是在内存中相对于PE文件载入地址的偏移量。

它们之间的关系:虚拟地址(VA) = 基地址(Image Base)+相对虚拟地址(RVA)

  • 文件偏移地址(Offset):当PE文件存储在磁盘中时,某个数据的位置相对于文件头的偏移量称为文件偏移地址(File Offset)。文件偏移地址从PE文件的第一个字节开始计数,起始值为0

PE 头解析

MS—DOS头解析

​ 首先是DOS头和DOS存根,它们的存在主要是用来兼容DOS系统。当我们的程序运行在DOS系统的时候,就会运行DOS存根中的代码,代码内容就是输出一段字符串告诉用户,这个程序不能在16位系统运行。

​ 而DOS头保存了程序的信息,DOS头的定义如下:

typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE headerWORD   e_magic;                     // Magic numberWORD   e_cblp;                      // Bytes on last page of fileWORD   e_cp;                        // Pages in fileWORD   e_crlc;                      // RelocationsWORD   e_cparhdr;                   // Size of header in paragraphsWORD   e_minalloc;                  // Minimum extra paragraphs neededWORD   e_maxalloc;                  // Maximum extra paragraphs neededWORD   e_ss;                        // Initial (relative) SS valueWORD   e_sp;                        // Initial SP valueWORD   e_csum;                      // ChecksumWORD   e_ip;                        // Initial IP valueWORD   e_cs;                        // Initial (relative) CS valueWORD   e_lfarlc;                    // File address of relocation tableWORD   e_ovno;                      // Overlay numberWORD   e_res[4];                    // Reserved wordsWORD   e_oemid;                     // OEM identifier (for e_oeminfo)WORD   e_oeminfo;                   // OEM information; e_oemid specificWORD   e_res2[10];                  // Reserved wordsLONG   e_lfanew;                    // File address of new exe header} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

这里面有用的信息就两个:

  1. 第一个成员e_magic,作为判断是否为PE文件的一个表示,如果不是"MZ"(16进制0x5A4D),那就不是PE文件,如果是还要看PE头标识。

  2. 最后一个成员e_lfanew,指定PE头的开始位置距离文件的偏移,它的数值就是NT头的开始地址。如下图,这里是E8,那么NT头开始地址就是E8的地方。

PE头结构如下:

注意:e_magic是word类型,占两个字节;Signature是dword类型,占四个字节。

Signature表示是否是PE,vs中有一个宏来定义它:

PE头其实由两部分组成,一个是标准PE文件头,一个是可选头。

先说标准PE头:

标准PE头

在VS中继续跟进查看PE文件头结构体:

typedef struct _IMAGE_FILE_HEADER {WORD    Machine;  //运行平台,在不同平台上,其值也不一样WORD    NumberOfSections; //区段数据数量DWORD   TimeDateStamp; //文件什么时候被创建的DWORD   PointerToSymbolTable; //指向符号表的偏移指针DWORD   NumberOfSymbols; //符号表中的符号数量WORD    SizeOfOptionalHeader; //文件头扩展头的大小WORD    Characteristics; //PE文件的属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

下面做一些重点介绍:

Machine:

微软也给出了相应平台的宏定义:

NumberOfSections:

用loadPE打开一个PE文件,可以看到其区段:

常用区段:
.text: 代码段,里面的数据都是代码,有的编译器也叫做code段,其实都是宏定义的;
.data:数据段(可读写),存放全局变量和静态变量;
.rdata:数据段(只读);
.idata:导入数据区段,存放导入表数据信息;
.edata:导出数据区段,存放导出表数据信息;
.rsrc:资源段;
.bss:存放未初始化数据;
.crt:c++ 运行时库 runtime;
.reloc:重定位;
.tls:线程局部存储。

Characteristics

PE文件的属性,相应宏定义如下:

扩展PE头

其结构体成员如下:

typedef struct _IMAGE_ROM_OPTIONAL_HEADER {WORD   Magic; //文件类型的标识 32位的PE还是64位PEBYTE   MajorLinkerVersion; //链接器主版本号BYTE   MinorLinkerVersion;//链接器子版本号DWORD  SizeOfCode; //区段的总大小DWORD  SizeOfInitializedData; //已初始化数据段的大小DWORD  SizeOfUninitializedData;//未初始化数据段的大小DWORD  AddressOfEntryPoint; // 程序入口RVADWORD  BaseOfCode; //代码段机址RVADWORD  BaseOfData;//数据段基址RVADWORD  BaseOfBss;//入口点,文件在内存中的首选装入地址DWORD  GprMask;DWORD  CprMask[4];DWORD  GpValue;
} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;typedef struct _IMAGE_OPTIONAL_HEADER64 {WORD        Magic;BYTE        MajorLinkerVersion;BYTE        MinorLinkerVersion;DWORD       SizeOfCode;DWORD       SizeOfInitializedData;DWORD       

免杀基础之一文学废PE文件格式相关推荐

  1. python免杀基础——三步(查杀、连接、代码)情况

    python免杀基础 目录 python免杀基础 1.远程调用shellcode.使用windowAPI: (1)查杀情况 (2)连接情况 (3)代码情况 2.远程加载shellcode和执行代码 ( ...

  2. GoPass系列免杀基础(一)

    Goby社区第 23 篇插件分享文章 全文共:7730 字 预计阅读时间:20 分钟 小板凳提示:过数字全家桶(开启晶核).某绒.卡巴.WD.某管家.魔法保姆.机器人.橘子,全程新手简单版,欢迎师傅们 ...

  3. TideSec远控免杀学习一(免杀基础+msfvenom隐藏的参数)

    参考链接:https://mp.weixin.qq.com/s/3LZ_cj2gDC1bQATxqBfweg 参考资料 免杀技术有一套:https://anhkgg.com/aanti-virus/ ...

  4. 【黑客免杀攻防】读书笔记6 - PE文件知识在免杀中的应用

    0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描. 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的. 修改区段名 1.1 移动PE文件头位置免杀 工具:PeC ...

  5. 【黑客免杀攻防】读书笔记1 - 初级免杀基础理论(反病毒软件特征码提取介绍、免杀原理、壳)...

    在52pojie发表<xxxx>病毒查杀的帖子后,感谢论坛里的会员GleamJ牛不但指出我文章后所添加服务名字符串作为特征码方式的不足,还分享了他工作中4种提取特征码的方法.让我更加觉得要 ...

  6. PHP-Webshell免杀研究

    不想当将军的士兵不是好士兵,不想getshell的Hacker不是好Hacker~ 有时候我们在做攻防对抗时经常会碰到可以上传webshell的地方,但是经常会被安全狗.D盾.护卫神.云锁等安全软件查 ...

  7. 免杀的N种姿势-基础篇

    免杀概念 免杀,也就是反病毒(AntiVirus)与反间谍(AntiSpyware)的对立面,英文为Anti-AntiVirus(简写Virus AV),逐字翻译为"反-反病毒", ...

  8. 黑客攻击-木马免杀之PE文件

    当你好不容易弄出来一个木马(具体可参考这里)的时候,却被杀毒软件轻易的就检测出来了,那一切岂不是白费了.Win10中的windows defender基于流量检测很容易把常见的木马程序检测出来,那怎么 ...

  9. 远控免杀从入门到实践(1):基础篇

    郑重声明 1.文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 2.文中提到的杀软检测指标是 virustotal.com(简称 ...

  10. 远控免杀专题文章(1)-基础篇

    脉搏文库 TideSec [](javascript:void(0)) 2020-02-20 6,218 *前**言* 一直是从事web安全多一些,对waf绕过还稍微有些研究,但是对远控免杀的认知还大 ...

最新文章

  1. mysql两列查询结果列拼接一个表输出_sql select语句,查询出两列结果拼接在一起...
  2. devmem 实际应用到 驱动中 通用接口
  3. @Data注解使用后get set报错解决方法
  4. 12- Library at ROM
  5. VS2010(VS2008)下安装配置OpenCV
  6. 树莓派debian配置lamp【解决apache不显示php】
  7. SQL Server将数据库中的表复制到另一个数据库
  8. 短板决定高度 | 人工智能的数学基础
  9. 大学计算机试卷分析报告,(最新整理)大学试卷分析报告
  10. 好莱坞标志将以NFT形式进行慈善拍卖
  11. 小程序云函数实现微信支付如此简单
  12. 苏宁易购正在“酝酿”下一场蝶变?
  13. Router Support for Fine-Grained Latency Measurements阅读笔记
  14. 计算机制图基本知识6,机械制图基础知识
  15. migration php,Lavarel常用语句之Migration
  16. 同一个人两次被雷电击中,张益唐攻克世纪难题朗道-西格尔零点猜想?
  17. 导数的定义、性质与求导
  18. 计算机动画 vr技术应用,三维动画与VR交互和虚拟现实性技术的结合
  19. 产能提升咨询项目阶段评审结果
  20. 缓冲器74HC541D/SN74HC541PWR/74HC541PW/AIP74HC541最新中文资料

热门文章

  1. 华为在海外市场受损,三星则因此而取得利润与份额齐升
  2. 《Complete Guide to Value Investing》读书总结
  3. 完美编译暗黑世界1.4的win32版本(支持线程和联网模块)
  4. 快速学好一门编程语言
  5. android u盘检测工具,android USBU盘 接入检测
  6. gin框架03--html 模板渲染
  7. 工作总结报告不会做,做不好?资深PMO和PM教你五步学会工作汇报【真正厉害的人,不仅要会做,更要会说】
  8. 关于UnsupportedClassVersionError的错误处理
  9. 隐藏式营销二维码美化生成器
  10. 知原理检验题目——第13周