VirtualAddress与VirtualSize与SizeOfRawData与PointerToRawData的关系
前言:VirtualAddress与VirtualSize与SizeOfRawData与PointerToRawData的关系笔记
其实老师讲的还是有点抽象,可能我不太聪明,所以我自己再做个笔记配合调试器来进行观察
基础概念
VirtualSize:内存中大小(内存对齐前的长度)
VirtualAddress:内存中偏移
SizeOfRawData:文件中大小(文件对齐后的长度)
PointerToRawData:文件中偏移
VirtualAddress
其实VirtualAddress和PointerToRawData 都很好理解,VirtualAddress就是在加载进内存状态下的偏移地址, PointerToRawData就是在文件状态下的偏移地址
我们首先去看下这个程序notepad的第一个节的相关属性
VirtualAddress代表的是内存中的偏移,我们接着用winhex来打开内存状态下的notepad进行观察,很明显确实是从偏移地址0x1000开始的第一个节数据,那么这里就确定了VirtualAddress的概念
PointerToRawData
PointerToRawData代表的是文件中的偏移,我们接着用winhex来打开文件状态下的notepad进行观察,所以这里就是从偏移地址0x400开始的第一个节数据,那么这里就确定了PointerToRawData的概念
VirtualSize
VirtualSize,这个其实很特别,被标注为内存对齐前的长度,我们知道内存对齐大小是跟SectionAlignment有关系的
我们这里拿notepad.exe来举个例子,此时这个文件的文件对齐大小和内存对齐大小就是不一样的,如下图所示
我们再去看下这个程序的第一个节的相关属性
继续观察,VirtualSize这个到底是什么呢?这图中第一个节显示的VirtualSize大小为0x00007748,我们接着用winhex来打开内存状态下的notepad进行观察
这里看到VirtualSize为0x00007748,那么意思就是该程序内存状态下的第一个节数据的大小为0x1000到0x1000+0x7748(0x8748),那么就去到0x8748来进行观察,确实第一个节数据就到了0x8748就结束了
那么大家会不会有一个疑问?后面的数据为什么都是00,也就是都是空白的呢?
我们之前说了VirtualSize是内存状态下未对齐的实际大小,所以这时候回过头来看下内存状态的对齐大小为0x1000,所以这个0x7748对齐大小就是0x8000,那么再加上文件头的大小0x1000,那么偏移值也就是0x9000了,如下图所示,确实到了0x9000就结束了(0x9000之前的数据全部为00)
然后我这里在用调试器来进行观察,当文件载入到调试器中,此时就已经处于内存中拉伸的状态下了,这时候可以观察下程序的区段
也可以看到偏移为0x1000开始,这个段的大小就是0x8000(对齐后的)
PointerToRawData
到了这里其实应该已经了解了VirtualSize和VirtualAddress了,那么继续看SizeOfRawData,这个其实就是文件状态下的情况,如下图所示,PointerToRawData从0x400开始
SizeOfRawData则是0x7800+0x400(0x7c00),如下图所示