4.13~4.17(PE文件结构预习+hook+进程hellow)
发布日期:2023-06-07 22:27:30 浏览次数:31 分类:技术文章

本文共 4366 字,大约阅读时间需要 14 分钟。

常见PE文件结构

常见的PE文件:exe、dll、sys

Ag:
在这里插入图片描述
exe就不用多说,就是可执行文件
dll动态链接库
对于 Windows 操作系统,操作系统的大部分功能都由 DLL 提供
()
sys是system的缩写,就是系统的意思,sys是Windows的系统文件
如安装文件,日志文件,驱动文件,备份文件,操作如播放等文件,还有些垃圾文件等诸如此类

PE指纹

标志MZ、PE

用010编辑器我们观察一下
在这里插入图片描述

在这里插入图片描述

有什么用呢?
若果我改了文件扩展名(木马),但是其中的本质没有变
当然也可以用PEiD工具查看

PE文件结构

在这里插入图片描述

在这里插入图片描述从上面着两张图,我们对比上面010编辑区的图
从PE往下,就会看到块的部分
常见的区段
,text段。一般是代码段
.data段。一般是数据段
.bss段。未初始化数据段。比如static变量,有时在函数内才初始化。
.idata和.edata段。导入表、导出表信息
.rsrc段。资源段
.reloc段。重定位信息段。
理解成容器,从汇编语言角度可以理解,我们知道用编写的程序是可以直接在CPU上工作的,而一个程序是需要代码段,数据段,栈段,同样可以放在这里理解

winnt.h

DOS部分

DOS MZ文件头(实际是一个64字节的IMAGE_DOS_HEADER结构体)
如何确定是64字节?
在这里插入图片描述PE文件头的起始地方由DOS MZ文件头中的内容确定

在这里插入图片描述

e_lfanew指向PE文件头的地址
看到010编辑器的图片,我们可以看到最后四个字节,就是地址
注意在汇编指令中,存储的方式是从高字节到低字节读取
DOS块链接器的信息(可以用来隐藏信息)

PE文件头

在这里插入图片描述

从代码层面看,方便我们就看32的

typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;标识 IMAGE_FILE_HEADER FileHeader;标准PE头20个字节 IMAGE_OPTIONAL_HEADER32 OptionalHeader;扩展PE头224个字节} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

在这里插入图片描述

为什么扩展PE文件头这么大?
在这里插入图片描述
IMAGE FILE HEADER
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TimeDateStamp:表示文件的创建时间。这个值是自 1970 年1月日以来用格林威治时间GMT厂计算的秒数]是一个比文件系统的日期/时间更精确的文件创建时间指示器。
PointerToSymbolTable:COFF 符号表的文件偏位置(参见 Microsof 规范的5.4节)。因为采用了较新的debug格式,所以COFF 符号表在 PE 文件中较为少见
Number0fSymhols:如果有 COFF 符号表,它代表其中的符号数目
Size0f0ptionalHeader:
紧跟IMAGE_FILE_HEADER,表示数据的大小。在 PE 文件中,这个数据结构叫作IMAGE OPTIONAL HEADER,其大小依赖于当前文件是32 位还是64位文件
Characterislics:文件属性,有选择地通过几个值的运算得到。这些标志的有效值是定义于winnth 内的IMAGE_FILE_xx 值,。警通 EXE 文的这个字的值一般是010fh.DLL 文件的这个字段的值一般是 2102h

在这里插入图片描述

把值转换位二进制对应到上面的表中

扩展PE文件头

typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;/说明文件的类型 PE32 : 10BH PE32+(64位): 20BH Rom映像文件:107H BYTE MajorLinkerVersion;/链接器主版本号 BYTE MinorLinkerVersion;/链接器次版本号 DWORD SizeOfCode;/所有代码节的总和( 基于文件对齐 ) 译填的 没用 DWORD SizeOfInitializedData;/包含所有已经初始化数据的节的总大小 编译器填的 没用 DWORD SizeOfUninitializedData;/包含未初始化数据的节的总大小 编译器填的 没用 DWORD AddressOfEntryPoint;/程序入口RVA、在大多数可执行文件中,这个地址不直接指向Main、WinMain或DIMain函数,而指向运行时的库代码并由它来调用上述函数 DWORD BaseOfCode;/代码起始RVA,编译器填的 没用 DWORD BaseOfData;/数据段起始RVA,译器填的 没用 NT additional fields. DWORD ImageBase;/内存镜像基址,可链接时自己设置 DWORD SectionAlignment;/内存对齐,一般一页大小4k DWORD FileAlignment;/文件对齐,一般一区大小512字节,现在也多4k WORD MajorOperatingSystemVersion;/标识操作系统版本号 主版本号 WORD MinorOperatingSystemVersion;/标识操作系统版本号 次版本号 WORD MajorImageVersion;/PE文件自身的主版本号 WORD MinorImageVersion;/PE文件自身的次版本号 WORD MajorSubsystemVersion;/运行所需子系统主版本号 WORD MinorSubsystemVersion;/运行所需子系统次版本号 DWORD Win32VersionValue;/子系统版本的值,必须为0 DWORD SizeOfImage;/内存中整个PE文件的映射的尺寸,可以比实际的值大,必须是SectionAlignment的整数倍 DWORD SizeOfHeaders;/所有头+节表按照文件对齐后的大小,否则加载会出指 DWORD CheckSum;/校验和,一些系统文件有要求用来判断文件是否被修改 WORD Subsystem;/子系统 驱动程序(1) 图形界面(2) 控制台、DUL(3) WORD DllCharacteristics;/文件特性 不是针对DLL文件的 DWORD SizeOfStackReserve;/初始化时保留的栈大小 DWORD SizeOfStackCommit;/初始化时实际提交的大小 DWORD SizeOfHeapReserve;/初始化时保留的堆大小 DWORD SizeOfHeapCommit;/切始化时保留的堆大小 DWORD LoaderFlags; DWORD NumberOfRvaAndSizes;/数据目录项数目 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];/数据目录表} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

区块表

在这里插入图片描述

在这里插入图片描述
raw:未经加工的;生的;原始的;未制的;未的;自然状态的;未经处理的; 未经分析的; 未经训的;红肿疼的: 工作生的;冷的;真实的
raw offset : 物理地址 ( study pe工中为raw address )
file offset : 文件偏移地址 ( study pe工中为raw address )
当PE文件存储在磁盘中时,某个数据的位置,相对于文件头部的偏移量
文件偏移地址
文件存储在磁盘中时,某个数据的位置,相对于文件头部的偏移量称作文件偏移地址( File Offset )
物理地址( RAW Offset )

头部:模块基地址后面:相对虚拟地址010103虚拟地址 = 头部 + 后面= 模块基地址 + 相对虚拟地址

文件偏移地址
虚拟地址 = 模块基地址 + 对拟地址模块基地址exe常见为0x00400000模块基地址dll常见为0x10000000
模块 : PE文件运行后,内存中的版本称为模块,此时模块基地址也叫模块句柄

overlay的计算方法

overlay是一个pe文件末尾却不属于任何一个pe结构,相当于直接在pe尾部追加的内容,计算方法是用pe文件总大小减去pe文件内部记录的结构大小(另外pe结构总大小也就是overlay的起始点)

使用时,overlay因为不属于标准pe结构的任一部分,所以不会被系统加载,需要自行使用io操作或者文件映射进行读写

rva to raw的计算方法

rva是类似于偏移的存在,只需要用基址+rva就可以

IMAGE_DATA_DIRECTORY IMAGE_SECTION_HEADER

IMAGE_SECTION_HEADER是程序中不同段(如.text)的保存表,保存了段的va、磁盘位置、大小、重定向信息等

pe结构总大小,用pe结构的哪些字段可以算出来?

用IMAGE_SECTION_HEADER里面取pe结构里最后一个段的位置,再加上这个段的大小就可以获得pe结构的总大小

HOOK

钩子

就是拦截技术,在传递指令的信息前,做一个处理
进程hellow就用到了hook的技术
简单理解,就是通过hook,去拿到我们想要执行的函数而不被发现

进程hellow

上述主要学习于

转载地址:https://blog.csdn.net/m0_72827793/article/details/130231662 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:qml,设置Calendar左右按钮小一点 使用 QtQuick.Controls 2.5版本
下一篇:qml,设置Calendar如何失去焦点就隐藏

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月25日 19时08分17秒