文章

滴水-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

day21.xlsx

联合体

// 联合体
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是一个变量。他是匿名的,只能在当前函数使用,作为临时使用更好

License:  CC BY 4.0