如何获取PE文件的Size

gisgan2006 2012-12-19 09:45:31
可以通过GetFileSize获取File size;
但对于一个安装包文件来说,想获取实际的PE size 要如何获取。(安装包文件其实就是一个exe后面追了很多压缩文件)

通过对PE文件的各种结构分析了一下,但始终没得到正确的值。如图。希望得到 (50688 )。




请问大家有什么方法呢?
...全文
447 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gfm688 2012-12-19
  • 打赏
  • 举报
回复
引用 5 楼 gisgan2006 的回复:
我的代码是直接将最后一个节的SizeOfRawData 和PointerToRawData 相加 就是GetPEFileRealSize。 不知道我这样是否会问题?
很好,没问题,你的做法更好
gisgan2006 2012-12-19
  • 打赏
  • 举报
回复
hztj2005:感谢回复。 由于我的要的功能很简单,暂时不去细读您提到的书。 抽空研究研究。
gisgan2006 2012-12-19
  • 打赏
  • 举报
回复
我的代码是直接将最后一个节的SizeOfRawData 和PointerToRawData 相加 就是GetPEFileRealSize。 不知道我这样是否会问题?
gisgan2006 2012-12-19
  • 打赏
  • 举报
回复 1
gfm688: 哥们你太给力了。你的代码的确是我想要的结果。 不过我后来使用的是:


int Translate(LPBYTE lpBuffer)
{  
	//
	PIMAGE_DOS_HEADER pidhOrig = (PIMAGE_DOS_HEADER)lpBuffer;
	PIMAGE_NT_HEADERS pinhOrig = (PIMAGE_NT_HEADERS)(lpBuffer + pidhOrig->e_lfanew); 
  
	//SECTION NAME
	LPBYTE lpszSectionHeader = (LPBYTE)(lpBuffer + pidhOrig->e_lfanew + sizeof(IMAGE_NT_HEADERS));
	{
		//计算PE文件大小
		if (pinhOrig->FileHeader.NumberOfSections <= 0)
		{
			return -1;
		}
		int i = pinhOrig->FileHeader.NumberOfSections -1;
		PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(lpszSectionHeader + i * sizeof(IMAGE_SECTION_HEADER));

		DWORD dwResPESize = pish->SizeOfRawData + pish->PointerToRawData;

		return dwResPESize;

	} 

	return -1;
}
gfm688 2012-12-19
  • 打赏
  • 举报
回复
考虑可能不是512字节对齐 应该可以用pImgNtHeaders->OptionalHeader.FileAlignment代替512
gfm688 2012-12-19
  • 打赏
  • 举报
回复
我研究了下,帮楼主写了个:

DWORD GetPEFileRealSize(LPCTSTR lpszFile)
{
  DWORD dwSize = 0;
  HANDLE hFile = CreateFile(lpszFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFile != INVALID_HANDLE_VALUE)
  {
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    LPBYTE lpBuffer = (LPBYTE)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
    PIMAGE_DOS_HEADER pImgDosHeader = (PIMAGE_DOS_HEADER)lpBuffer;
    PIMAGE_NT_HEADERS32 pImgNtHeaders = (PIMAGE_NT_HEADERS32) (lpBuffer + pImgDosHeader->e_lfanew);
    PIMAGE_SECTION_HEADER pImgSecHeader = (PIMAGE_SECTION_HEADER) (pImgNtHeaders + 1);
      
    dwSize = pImgDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS32) + pImgNtHeaders->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
 
    // 512字节对齐
    if (dwSize%512)
      dwSize = (dwSize / 512) * 512 + 512;

    for (int i = 0; i < pImgNtHeaders->FileHeader.NumberOfSections; i++)
      dwSize += pImgSecHeader[i].SizeOfRawData;

    UnmapViewOfFile(lpBuffer);
    CloseHandle(hMap);
    CloseHandle(hFile);
  }

  return dwSize;
}
hztj2005 2012-12-19
  • 打赏
  • 举报
回复
你这个截图是自己的,还是别人的? 戚利有一本《windows PE权威指南》,可以参考。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧