PE SizeOfImage错误

时间:2018-12-09 23:06:34

标签: c++ c

我正在尝试从PE获取当前大小,但似乎有误

我有这个代码:

hModule = GetModuleHandleW(NULL);
pDH = (PIMAGE_DOS_HEADER)hModule;
pNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)hModule+pDH->e_lfanew);
dwSize = pNTHeaders->OptionalHeader.SizeOfImage;

这是区别: 当前执行程序=> 246 kb pNTHeaders-> OptionalHeader.SizeOfImage => 356352 => 348kb

那么,这段代码有什么问题,为什么PE在Kb中有所不同。

1 个答案:

答案 0 :(得分:5)

已加载映像的大小不一定(实际上几乎绝对不会)与磁盘上二进制文件的大小相同。例如,当您编写包含某些静态数据的程序时,编译器必须在映像中为该数据分配空间。但是,如果该数据是例如未初始化的或全为零,则仅将零负载存储在二进制中将是浪费的。没有人会为仅仅因为您写的而不得不下载一个充满零的1+ GiB exe文件感到高兴的

int a[1024*1024*256] = {};

代码中的某处。相反,.exe文件将仅存储应该在加载的图像中存储数据的大小和位置,并且操作系统将在加载图像时在该位置分配并映射适当的内存…