4.13~4.17(PE文件结构预习+hook+进程hellow)

常见PE文件结构

常见的PE文件:exe、dll、sys
Ag:
在这里插入图片描述
exe就不用多说,就是可执行文件
dll动态链接库
对于 Windows 操作系统,操作系统的大部分功能都由 DLL 提供
(https://learn.microsoft.com/zh-cn/troubleshoot/windows-client/deployment/dynamic-link-library#%E6%A6%82%E8%A7%88)
sys是system的缩写,就是系统的意思,sys是Windows的系统文件
如安装文件,日志文件,驱动文件,备份文件,操作如播放等文件,还有些垃圾文件等诸如此类

PE指纹

标志MZ、PE
用010编辑器我们观察一下
4.13~4.17(PE文件结构预习+hook+进程hellow)_第1张图片

4.13~4.17(PE文件结构预习+hook+进程hellow)_第2张图片
有什么用呢?
若果我改了文件扩展名(木马),但是其中的本质没有变
当然也可以用PEiD工具查看

PE文件结构

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

winnt.h

https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/

DOS部分
DOS MZ文件头(实际是一个64字节的IMAGE_DOS_HEADER结构体)
如何确定是64字节?
4.13~4.17(PE文件结构预习+hook+进程hellow)_第5张图片PE文件头的起始地方由DOS MZ文件头中的内容确定

4.13~4.17(PE文件结构预习+hook+进程hellow)_第6张图片
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;

4.13~4.17(PE文件结构预习+hook+进程hellow)_第7张图片
为什么扩展PE文件头这么大?
4.13~4.17(PE文件结构预习+hook+进程hellow)_第8张图片
IMAGE FILE HEADER
4.13~4.17(PE文件结构预习+hook+进程hellow)_第9张图片
4.13~4.17(PE文件结构预习+hook+进程hellow)_第10张图片
4.13~4.17(PE文件结构预习+hook+进程hellow)_第11张图片
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

4.13~4.17(PE文件结构预习+hook+进程hellow)_第12张图片

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

扩展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;

区块表

4.13~4.17(PE文件结构预习+hook+进程hellow)_第13张图片
4.13~4.17(PE文件结构预习+hook+进程hellow)_第14张图片
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://zhuanlan.zhihu.com/p/113957202

上述主要学习于https://www.bilibili.com/video/BV1VT411g7ic/?spm_id_from=333.788&vd_source=c2c3c616b3ad1faf44a9f6f30a4dbb03

你可能感兴趣的:(上课内容,学习)