P43FileBuffer-ImageBuffer

发布时间 2023-04-26 21:29:17作者: 摸鱼小曹

MISC可能比SizeOfRawData大 可能含有一些数据未初始化
RVA:相对偏移地址 FOA:文件偏移地址
PE加载的过程:
1、根据SizeOfImage的大小,开辟一块缓冲区(ImageBuffer).
2、根据SizeOfHeader的大小,将头信息从FileBuffer拷贝到ImageBuffer
3、根据节表中的信息循环讲FileBuffer中的节拷贝到ImageBuffer中.
4、Misc.VirtualSize 和 SizeOfRawData谁大?
不一定 通常SizeOfRawData 但MISC可能比SizeOfRawData大 可能含有一些数据未初始化
1.ImageBuffer的大小是多少?

我们不能直接把FileBuffer复制过来,因为notepad.exe的FileBuffer没有拉伸,我们回想PE结构,OptionalHeader有一个属性记载着ImageBuffer的大小,那就是SizeOfImage。

2.FileBuffer和ImageBuffer的Headers是没有区别的,头部没有拉伸,直接复制过来即可

3.如何复制节表?

因为FileBuffer和ImageBuffer的区别就是节表在内存中的位置不同,我们要一个一个节表的循环复制,那么我们要复制几次?FilePE头的NumberOfSection参数记录这节表的数量。我们要从哪里开始复制复制多少?节表里给出了答案。我们要从FileBuffer的PointerToRawData开始复制到ImgaeBuffer的VirtualAddress,复制SizeOfRawData的大小。

4.这里用到了二级指针,为什么要用到二级指针?因为当一个函数要返回两个参数的时候,就要用到二级指针。

5.当我们ImageBuffer——>NewBuffer的时候,我们怎么知道NewBuffer开辟malloc的大小?

因为Headers是一样的,我们只需要看节表就行,我们首先要循环到最后一个节表,找到PointerToRawData也就是在文件中的偏移,然后再找到SizeOfRawData也就是文件对齐后的大小,这两个相加就是NewBuffer的大小(记得把SectionHeader的指针还原,因为后面还需要遍历)