系统安全及免杀(7) PE的前世今生(1)-浅谈PE文件结构

本文所载网络安全技术仅为技术研究与学习之用,严禁用于非法攻击、侵入他人系统等违法违规行为。所有内容均需遵守国家相关法律法规,滥用所产生的一切法律责任,由行为人自行承担,与本文作者、发布者无关。


书…不接上回哈哈,直接谈免杀的东西还是不太能直接发,懂得都懂,虽然发的都是已经很保守的东西了,懂得懂得吧只能说是

黑克外传之shellcode传奇这个系列后面还会有,等我再总结一下,这一集先开个新系列哈哈

鄙人技术浅陋,经网上四处观看浏览总结得此文,如有不足希望师傅们多包容⊙﹏⊙

下面开始正文喵

概览 – what’s PE

不是体育课的意思(

PE 全称 Portable Executable,是 Windows 中的可执行文件格式,基于 COFF 文件格式(Common Object File Format)而来

准确的说 PE 文件格式是对 COFF 文件格式的扩展,其中 PE File Header 部分其实就是标准的 COFF 文件格式

COFF

解释一下上文提到的 “COFF”

COFF 是一种用于存储编译后机器代码、数据、重定位信息及符号表的二进制文件格式,最初源自 DEC 的 VAX/VMS 系统,后来被 Windows 和早期 UNIX 等平台采用,是 PE 格式的直接基础,Windows 的 .obj 目标文件至今仍使用 COFF 标准

粗略理解就是一种规定的格式,我比较喜欢自顶向下的学习,此处仅作了解,暂时不会深究其作用原理 🙂


PE 文件虽说是 windows 的可执行文件,但是不只是 exe,还有包含 DLL ,SRV(内核模块)、CPL(控制面板项)在内的等等文件,同时所有的PE文件要想被系统“认识”首先要有规范的结构和格式,这也是开头就说了的

Windows PE Loader

先引入一个东西,Windows PE Loader,顾名思义是个加载器,就像之前的文章中我们制作过 shellcode 的加载器,用来加载 shellcode 一样的

Windows PE Loader 是 Windows 操作系统内核的核心组件,属于系统加载器(Loader)的一部分,作用是解析 PE 格式的可执行文件、完成内存映射与初始化,最终将程序控制权交给 PE 文件的入口点,是 PE 文件想要成功“启动”的关键

不同态的loader

Loader 还分为内核态和用户态的不同情况,所作的工作和功能实现的所属都不太一样

核心的功能实现位于 Windows 内核的 ntoskrnl.exe(内核态)和用户态的 ntdll.dll / kernel32.dll中

内核态的 loader,也就是所属的 ntoskrnl.exe 是系统启动后,进程创建阶段的内核态 Loader 核心(启动阶段的 PE 加载主要由 Winload 完成,属于 boot manager 组件)

用户态的 Loader ,就是上面说的功能了,负责PE 结构解析、重定位、导入表解析、DLL 依赖加载

原本的 PE 就是躺在硬盘里面的一段字,等到加载器来了,文件就太平了(bushi)文件就能解析成可执行的东西放进内存了,一并解决了运行前的依赖与地址修正问题,

当双击 PE 文件 / 系统创建进程时,Windows 会先创建空的进程地址空间,随后立即调用 PE Loader 开始工作,直到程序入口点执行后,Loader 的工作才基本完成。

这个东西想深入讲解并且和免杀对抗的思路联动起来能讲很多,只不过本节主要是针对 PE 文件的结构和特点,说说 PE 会被 loader 解析的格式长啥样,暂时不做过多展开(*^_^*)

PE 格式

终于进入正题了

一个PE文件需要包含特定的内容,Windows PE Loader 才能正确解析它,并将它载入内存,通常的PE文件结构如下图(图源来自网络搜集,侵删)

如图所示,上图所示,一个PE文件的主要部分包括:DOS Header、DOS Stub、NT Headers、Section Table(又称Section Headers)、Section

查看真实文件结构的话可以用 PE-Bear,也可以用 010editor(ctf做杂项的常用工具)加载一下 PE 模板就可以

下面挨个说说

DOS Header

从 PE 文件起始位置开始的一个 64 字节大小的结构体,因为它和 DOS Stub 的存在,PE 也叫 MS-DOS 可执行文件

在Windows中,它俩的存在只是为了向后兼容,当它运行在MS-DOS下时,DOS Stub被执行,输出一条消息并退出(PE文件中的其他部分不会被执行),没有它们的话,PE文件在MS-DOS下执行将会报错

typedef struct _IMAGE_DOS_HEADER {
    WORD   e_magic;
    WORD   e_cblp;
    WORD   e_cp;
    WORD   e_crlc;
    WORD   e_cparhdr;
    WORD   e_minalloc;
    WORD   e_maxalloc;
    WORD   e_ss;
    WORD   e_sp;
    WORD   e_csum;
    WORD   e_ip;
    WORD   e_cs;
    WORD   e_lfarlc;
    WORD   e_ovno;
    WORD   e_res[4];
    WORD   e_oemid;
    WORD   e_oeminfo;
    WORD   e_res2[10];
    LONG   e_lfanew;
  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

如上是 DOS Header 的结构体的定义,位于 winnt.h 中

关注其中2个字段:

  • e_magic:DOS头的第一个成员,类型为WORD表示大小是2字节,它有一个固定值0x5A4D,对应的ASCII是”MZ”,它的作用可以理解为MS-DOS下可执行文件标识
  • e_lfanew:DOS头的最后一个成员,位于 DOS Header 偏移 0x3C 处,它的值是 NT Headers 的起始地址,Windows PE Loader 也是通过它获取真正PE部分的起始地址

DOS Stub

本质是一段 MS-DOS 的可执行程序,用来输出一个错误消息并退出,当 PE 文件运行在 DOS 模式下,会输出消息 “This program cannot be run in DOS mode”,提示这个 PE 文件不能运行在 DOS 模式下,这个消息输出什么是可以修改的

NT Headers

包含3部分:

  1. Image File Signature(镜像文件签名):一个4字节的内容,标识这是一个PE文件
  2. Image File Header(镜像文件头):是标准的 COFF 格式,本质是一个结构体,里面包含PE文件相关信息
  3. Image Optional Header(镜像可选头)这部分叫可选头,是因为像 .obj 这样的对象文件没有这部分,但像 exe 这样的可执行文件必须得有这部分,它可以说是 PE 文件结构中最重要的部分

Section Table

紧随 Optional Header 之后就是 Section Table(节表)

一个结构体数组,每个结构体装有特定数据的相关信息,特定数据比如导出表、导入表、重定位表等等

Sections

“节”,是PE文件实际存储数据的地方,包括代码、数据、资源等等

补充

Rich Header

这里直接复用一下其他师傅写的内容:

在DOS Stub和NT Headers之间,其实还有一段数据,叫Rich Header(富有头),通常使用微软Visual Studio构建的exe才会有这个头,里面的数据用于表示VS的名字、类型、版本等等

很多讲述PE文件结构的文章都没有提到这个头,其实Rich Header并不是PE文件的标准内容,就是说,将这部分完全填充为0也不会影响PE文件,说到这里有没有想到什么?我们可以将PE文件内嵌的内容除了放到资源节,还可以放到这里,其实已经有恶意软件这么做了

在2018年冬奥会期间有一款名为Olympic Destroyer的恶意软件,这款恶意软件以伪造其他恶意软件而闻名,比如在Rich Header中伪造Lazarus threat group组织的特征,具体分析可参考:https://securelist.com/the-devils-in-the-rich-header/84348/

Rich Header中首先是一系列异或加密的数据,然后是Rich Header签名,最后是一个校验值,这个校验值也是异或加密的密钥


还没想好下一节写什么,到时候再说,可能是讲一下进程这个概念相关的东西,也可能是 hook 技术 🙂

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇