VirtualAddress与VirtualSize与SizeOfRawData与PointerToRawData的关系

VirtualSize:内存中大小(内存对齐前的长度)
VirtualAddress:内存中偏移
SizeOfRawData:文件中大小(文件对齐后的长度)
PointerToRawData:文件中偏移

其实VirtualAddress 和 PointerToRawData 都很好理解,VirtualAddress就是在加载进内存状态下的偏移地址, PointerToRawData就是在文件状态下的偏移地址

VirtualSize,这个其实很特别,被标注为内存对齐前的长度,我们知道内存对齐大小是跟SectionAlignment有关系的,我们这里拿notepad.exe来举个例子,此时这个文件的文件对齐大小和内存对齐大小就是不一样的,如下图所示

我们再去看下这个程序的第一个节的相关属性

继续观察,VirtualSize这个到底是什么呢?这图中第一个节显示的VirtualSize大小为00007748,而VirtualAddress则是内存中的偏移,我们接着用winhex来打开内存状态下的notepad进行观察,很明显确实是从偏移地址0x1000开始的第一个节数据

继续看VirtualSize为00007748,那么意思就是该程序内存状态下的第一个节数据的大小为0x1000 - 0x1000+0x7748(0x8748),那么就去到0x8748来进行观察,确实第一个节数据就到了0x8748就结束了

那么大家会不会有一个疑问?后面的数据为什么都是00,也就是都是空白的呢?

我们之前说了VirtualSize是内存状态下未对齐的实际大小,所以这时候回过头来看下内存状态的对齐大小为0x1000,所以这个0x7748对齐大小就是0x8000,那么再加上偏移0x1000,也就是0x9000了,如下图所示,确实到了0x9000就结束了(0x9000之前的数据全部为00)

到了这里其实应该已经了解了VirtualSize和VirtualAddress了,那么继续看SizeOfRawData和PointerToRawData,这个其实就是文件状态下的情况,如下图所示,PointerToRawData从0x400开始

SizeOfRawData则是0x7800+0x400(0x7c00),如下图所示

posted @ 2021-04-18 19:18  zpchcbd  阅读(97)  评论(0编辑  收藏  举报