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),如下图所示

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