首页
社区
课程
招聘
[求助]如何根据PE头计算出文件的尺寸。
发表于: 2007-5-9 18:07 6917

[求助]如何根据PE头计算出文件的尺寸。

zzy 活跃值
2
2007-5-9 18:07
6917
用 SizeOfHeaders + Section.SizeOfRawData + Section.SizeOfRawData + ......

好像并不准确.

资料显示 : “SizeOfRawData”(意味“原始数据大小”),它表示节中数据被大约到下一个“FileAlignment”的整数倍时节的大小。

这个数据要如何转换才能得到该节的实际尺寸呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 615
活跃值: (1222)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
GetFileSize
2007-5-9 18:27
0
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主,通过该API是可以获取,但我想知道如何可以从PE头取得。
2007-5-9 19:21
0
雪    币: 615
活跃值: (1222)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这个还要请高手回答
2007-5-9 19:44
0
雪    币: 200
活跃值: (230)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没有办法由 PE 文件结构准确确定文件的大小,因为 PE 文件后面可能附加有数据(copy /b)。
纯粹 PE 文件本身的大小可以这样计算:

////////////////////////////////////////////////////////////////////////////////
//功能: 获取文件大小
//参数:
////////////////////////////////////////////////////////////////////////////////
function GetExeSize(Instance: LongWord = 0): Cardinal;
var
  p: Pchar;
  nSectCount, I: Integer;
begin
  Result := 0;
  if Instance = 0 then
    p := Pointer(HInstance)
  else p := Pointer(Instance);
  Inc(p, PImageDosHeader(p)._lfanew + SizeOf(DWORD));
  nSectCount := PImageFileHeader(p).NumberOfSections;
  Inc(p, SizeOf(TImageFileHeader)+ SizeOf(TImageOptionalHeader));
  for I := 0 to nSectCount - 1 do
  begin
    with PImageSectionHeader(p)^ do
      if PointerToRawData + SizeOfRawData > Result then
        Result := PointerToRawData + SizeOfRawData ;
    Inc(p, SizeOf(TImageSectionHeader));
  end;
end;
2007-5-9 22:18
0
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上这位兄弟,试计算了几个文件,确实如此,正常情况下编译出的PE文件应该就这样计算了。
2007-5-10 00:07
0
游客
登录 | 注册 方可回帖
返回
//