滴水-day21-PE文件-联合体-文件对齐
PE文件
文件对齐和内存对齐
直接读取文件内存得到的数据是文件在硬盘中的数据一样的。
数据读到内存中后无法直接运行,因为在硬盘中的数据和在内存中的数据是不一样的
数据在内存中需要进行拉伸,
数据拉伸的开始地址是imageBase+AddressOfEntryPoint的地址处开始
就是在硬盘中的数据进行拉伸,按照内存字节对齐。
拉伸完以后才可以运行。
NumberOfSections 节表的数量,有几个节表就有几个节
SizeOfOptionalHeader 可选PE头的大小,32位程序默认是:0xE0,64位程序是:0xF0
Characteristics PE文件特征
MISC 这个表未对齐前有多少个字节,在文件中的大小
SizeOfRawData 这个表在文件中对齐后有多少个字节,对齐后的大小PointerToRawData 在文件中的偏移,距离0x0000
一个节表的大小一般是0x28-40个字节。
Characteristics 节的属性,一般是节表的最后一个字段
VirtualAddress 节表在内存中的偏移,+IMAGEBASE可在内存中定位到节表
PE头解析
标准DOS头是有0x40个字节
标准PE头是有0x14个字节的
可选PE头大小是不确定的,在默认情况下PE32是0xE0
PE64是0xF0
标准DOS头
e_magic 是否是PE文件
e_lfanew PE入口点
标准PE头
TimeDateStamp 程序的修改时间戳 2008-04-18 17:20:27 GMT+0 2008-04-19 01:20:27 GMT+8 (中国标准时间)
Machine 程序运行的CPU型号,0x0 任何型号
NumberOfSections 除了ODS,PE, OPTIONAL PE 之外的节数量
可选PE头
Magic:
0x10b 表示为32位程序
0x20b 表示为64位程序
0x107 表示ROM镜像
Subsystem:表示这是个什么样的程序
0x02表示window图形界面程序
AddressOfEntryPoint (EP RVA)程序入口点
入口点OEP(RAW):0x000033DE
文件对齐_文件镜像
FileBuffer
Misc 不一定大于 SizeOfRaWData
ImageBuffer
联合体
// 联合体
union student
{
int x;
char y;
};
// 匿名变量
union
{
int x;
char y;
}function;
int main()
{
student st;
st.x = 0x12345678;
printf("%x\\\\n", st.y);
function.x = 0x12345678;
printf("%x\\\\n", function.x);
printf("%x\\\\n", function.y);
return 0;
}
共用一个空间,该空间大小是联合体中最大数据类型的大小。
定义方式不同,代表的意义也不同。
union function 此时 function 是一个新的类型
union
{
}function 此时function是一个变量。他是匿名的,只能在当前函数使用,作为临时使用更好