PE文件笔记十四 导出表
前面在学习了关于节的各种操作,但更之前的扩展PE头的DataDirectory中各表项的含义还没具体介绍
这次来学习DataDirectory[0]也就是导出表的具体内容
导出表导出表作用一个可执行程序是由多个PE文件组成的
依旧拿先前的EverEdit.exe为例,查看运行它所需的所有模块
使用OD载入EverEdit.exe,然后点击上方的e来查看所有模块
可以看到,该程序除了包含EverEdit.exe这个模块外还包含不少其它的dll(动态链接库),这些dll为程序提供一些函数
就比如MessageBoxA这个弹窗的函数就是由user32.dll这个模块提供的
以上这些模块都发挥着其作用,使得程序得以正常运行
一个程序引用哪些模块是由其导入表决定的
与导入表相对的便是导出表,导出表则是决定当前的PE文件能够给其它PE文件提供的函数
拿前面提到的user32.dll为例,其导出表一定是包含MessageBoxA这个函数的
归纳一下导入表和导出表
导入表:该PE文件还使用哪些PE文件
导出表:该PE文件提供了哪些函数给其它PE文件
什么是导出表导出表就是记录该PE文件 ...
PE文件笔记十三 合并节
前面在PE文件笔记十一 新增节学习了关于节的操作之新增节,接下来继续学习节的操作之合并节
合并节为什么要合并节在前面新增节中,要判断最后一个节表后面是否有空间用于新增节表,只有当最后一个节表后40个字节全为0时,才能进行新增节的操作;但当条件不满足时又想要新增节,该如何操作?
答案便是:合并节,合并节就是用一个节表描述多个节,这样省下来的节表空间就可以用于新增节了
于是合并节的目的便是:节省节表空间,这样就能实现新增节
合并节涉及的结构体成员
涉及的节表成员
含义
Name
节名称
VirtualAddress
节在内存中的偏移 (RVA)
Misc
节的实际大小
SizeOfRawData
节在文件中对齐后的尺寸
PointerToRawData
节区在文件中的偏移
Characteristics
节的属性
涉及的标准PE头成员
含义
NumberOfSections
节的个数
合并节的流程
修正内存对齐
修改第一个节的大小
修改第一个节的权限
修改节数量为1
清空后面的节(可选)
按流程合并节修正内存对齐关于修正内存对齐的内容 ...
PE文件笔记十二 修正内存对齐
在前面PE文件笔记十 扩大节中,需要修正节表成员;修正节表成员时要把Misc(实际大小)和 SizeOfRawData(文件对齐后的大小)修正为内存对齐后的大小
但在扩大节中,只针对最后一个节进行修正,没有影响到其它的成员,接下来学习将所有节表都修正为内存对齐
此篇笔记为学习节操作之修正内存对齐
修正内存对齐为什么要修正内存对齐修正内存对齐 使得 节文件对齐后的大小和内存对齐后的大小一致,方便后续合并节
修正内存对齐涉及的结构体成员
涉及的节表成员
含义
Misc
节的实际大小
SizeOfRawData
节在文件中对齐后的尺寸
PointerToRawData
节区在文件中的偏移
修正内存对齐的流程
计算节内存对齐后的大小
计算差值 = 节内存对齐后的大小 - 节文件对齐后的大小
计算节在文件中的末尾位置 = 节在文件中的偏移 + 节文件对齐后的大小
在节的文件中的末尾位置后填充新空间,新空间的大小为 前面计算的差值
修正Misc和SizeOfRawData为节内存对齐后的大小
在该节后面的节在文件中的偏移增加差值
按流程修正内存对齐此次依旧以先前的Ev ...
PE文件笔记十一 新增节
前面在PE文件笔记十 扩大节学习了关于节的操作之扩大节,接下来继续学习节的操作之新增节
新增节为什么要新增节新增节和扩大节一样,都是用来解决空白区不足的问题
但既然扩大节已经能够解决问题了,为什么还要新增节呢?或者说新增节比扩大节好在哪里?
在前面的扩大节中,只是扩大了节,并没有关注扩大出来的空白区的权限问题;每个节都有其对应的权限,由节.Characteristics决定
有关节的权限问题已经在PE文件笔记六 节表和节中说过,这里不再赘述
如果扩大出来的空白区希望能够被用于执行代码,那么被扩大的节就必须具备IMAGE_SCN_CNT_CODE权限(该节包含可执行代码)
如果被扩大的节不具备这个权限,还得为此将整个节的权限修改
除此之外,扩大节还会使得原本的数据和我们扩大的空白区混在一起
相比之下新增节则完全拥有自己的权限,不依附于要扩大的节的权限,可以自己指定想要的权限
扩大节和新增节的差异扩大节:权限取决于要被扩大的节的原本权限,如果不满足权限还需要去修改;原本数据和扩大的空白区混在一起
新增节:权限由自己来指定;空间独立没有数据混杂
新增节涉及的结构体成员
涉及的节表成 ...
PE文件笔记十 扩大节
经过前面的实战PE文件笔记八 实战之HOOK程序添加弹窗和PE文件笔记九 实战之HOOK程序添加弹窗续,对PE文件结构有了进一步的了解之后继续来学习对节的操作
此篇笔记为学习节操作之扩大节
扩大节为什么要扩大节在先前的实战中,通过在节表和节之间的空白区写入代码并执行来达到了弹窗的效果,但是如果当想要执行的代码量较大时,即空白区的空间不够时,就可以通过扩大节来解决空白区不足的问题
扩大节涉及的结构体成员
涉及的节表成员
含义
VirtualAddress
节在内存中的偏移 (RVA)
Misc
节的实际大小
SizeOfRawData
节在文件中对齐后的尺寸
PointerToRawData
节区在文件中的偏移
涉及的扩展PE头成员
含义
SizeOfImage
Image(PE文件)大小
扩大哪个节既然要扩大节,那么选择哪个节进行扩大比较好?
实际上每个节都可以扩大,但是一般来说是选取最后一个节进行扩大,为什么?
因为节是顺序存储的,如果扩大了前面的节就意味着后面的节全部都要相应地修改偏移,比较麻烦
选取最后一个节进行扩大就不会影响到后面的节 ...
PE文件笔记九 实战之HOOK程序添加弹窗续
在前面的PE文件笔记八 实战之HOOK程序添加弹窗中能够使用OD达到在运行态时添加弹窗的功能,接下来则要对先前的反汇编的硬编码稍作修改然后插入到PE文件中,最后再修改入口点即可;具体流程在上个笔记已经说明了,这里不再赘述
PE实战之给程序添加弹窗续最终效果图先看一下最终的效果图
反汇编和硬编码的对应关系因为后面要将反汇编代码转换为硬编码,于是这里就要研究一下两者的对应关系
先贴上先前得到的反汇编代码
复制代码 隐藏代码00401130 > 6A 00 push 0x000401132 68 52114000 push MessageB.0040115200401137 68 48114000 push MessageB.004011480040113C 6A 00 push 0x00040113E E8 A7F69477 call user32.MessageBoxA00401143 - E9 8801C4FF jmp 000412D000401148 6c ...
PE文件笔记八 实战之HOOK程序添加弹窗
前面学习了PE的结构后,尝试结合先前所学,修改PE文件来实现给程序添加弹窗的功能
PS:这篇笔记并没有怎么涉及PE的知识点,重点放在了HOOK、反汇编和硬编码上,对PE不是很了解也可以看看,涉及PE知识点的内容放在了后面的笔记:PE文件笔记九 实战之HOOK程序添加弹窗续,可以放心食用( ̄︶ ̄)↗
PE实战之给程序添加弹窗修改流程要给程序添加弹窗,首先就是要了解其修改的流程
首先要修改的便是程序原本的入口地址,将其修改为弹窗代码所在的地址
弹窗代码所在的地址,要在PE文件中找到一片区域,该区域需要 满足 可执行、可读、可写的权限,然后在这片区域写入弹窗代码,弹窗代码的最后要跳转回原本的入口地址
该修改流程是一种十分经典的HOOK思想,即程序按照原本的流程执行着,你把它原本执行的代码修改了,修改去干我们想要做的事情,做完我们想要的事情后再把它放回去继续执行原本的代码
图解HOOK修改流程
被HOOK的地方为B
正常流程 A→B→C
HOOK流程 A→被HOOK的B→自己的代码→复原B中被修改的部分→跳转回B原本要接着执行的地方→C
图解给程序添加弹窗
弹窗代码既然要给程序添加弹 ...
PE文件笔记七 RVA与FOA转换
前面学习了在块表中提到了VA和FOA,这次来学习它们之间的转换
VA转FOA在先前的笔记PE文件笔记六 节表和节中,已经有提到关于VA、RVA和FOA的概念
对应结构体成员
英文全称
含义
VA
_IMAGE_SECTION_HEADER.VirtualAddress
Virtual Address
在内存中的虚拟地址
RVA
_IMAGE_SECTION_HEADER.VirtualAddress
Relative Virtual Address
相对虚拟地址
FOA
_IMAGE_SECTION_HEADER.PointerToRawData
File Offset Address
文件偏移地址
接下来继续学习VA和FOA的转换
在学习转换之前,先探寻一下为什么要学习它们之间的转换?
为什么学习VA与FOA转换在这里要引入一个问题:如何改变一个全局变量的初始值
在逆向基础笔记十二 汇编 全局和局部 变量中已经说过了全局变量和局部变量的区别
如果一个全局变量有初始值,那么它的初始值一定是存储在PE文件中的
如果一个全局变量没有初始值,那么在PE文件中就没 ...
PE文件笔记六 节表和节
前面学习了PE的DOS部首和PE文件头,这次学习的结构为PE节表
PS:关于PE文件头中扩展PE头的数据目录项,其中包含了导入表、导出表、重定位表等等,暂且留作之后
PE节表PE节表作用表示Image的section头格式
PE节表结构
PE节表结构
对应C中的结构体
说明
多个IMAGE_SECTION_HEADER
多个_IMAGE_SECTION_HEADER
每个_IMAGE_SECTION_HEADER描述后面的一个节
结构体截图在winnt.h中找到_IMAGE_SECTION_HEADER,得到以下截图(具体查找对应C结构体方法在PE文件笔记一 PE介绍中已经说明了,这里不再赘述)
结构体代码 复制代码 隐藏代码#define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD Phy ...
PE文件笔记五 PE文件头之扩展PE头
继续具体学习PE的各个结构细节,前面学完了标准PE头,接着学习扩展PE头
由于PE文件头的内容较多,故要拆分为多个笔记,此笔记主要为扩展PE头
PS:扩展PE头的成员较多,可以先看个大概后结合下面的实战分析来学习扩展PE头的成员
扩展PE头扩展PE头所属扩展PE头是PE文件头中的一个成员
32位所属 复制代码 隐藏代码typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //PE文件头标识 IMAGE_FILE_HEADER FileHeader; //标准PE头 IMAGE_OPTIONAL_HEADER32 OptionalHeader; //扩展PE头 32位} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
64位所属 复制代码 隐藏代码t ...