-
-
[求助]在文件中获得资源信息
-
发表于:
2012-3-1 14:56
3755
-
最近在看pe分析,写了一个程序来获取本身资源信息,但是在最后获取的资源offset的地址要减去2000h(8192)才是实际文件中的地址。
代码:
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <assert.h>
#define TEST(n) (n>>31)&0x1
int main(int argc, char* argv[])
{
char szFile[MAX_PATH]="";
GetModuleFileName(NULL,szFile,MAX_PATH);
FILE *fp=fopen(szFile,"rb");
assert(fp!=NULL);
IMAGE_DOS_HEADER dosHeader;
assert(fread(&dosHeader,sizeof dosHeader,1,fp)!=-1);
fseek(fp,dosHeader.e_lfanew,SEEK_SET);
IMAGE_NT_HEADERS ntHeaders;
assert(fread(&ntHeaders,sizeof ntHeaders,1,fp)!=-1);
DWORD RsAddr=ntHeaders.OptionalHeader.DataDirectory[2].VirtualAddress;
DWORD RsRealAddr=0;
//获取资源在文件中实际偏移量
IMAGE_SECTION_HEADER sectionHeader;
for (int i=0;i<ntHeaders.FileHeader.NumberOfSections;++i)
{
assert(fread(§ionHeader,sizeof sectionHeader,1,fp)!=-1);
char szName[9];
memset(szName,0,9);
memcpy(szName,sectionHeader.Name,8);
puts(szName);
if (RsAddr>=sectionHeader.VirtualAddress&&
RsAddr<sectionHeader.VirtualAddress+sectionHeader.SizeOfRawData)
{
RsRealAddr=RsAddr-sectionHeader.VirtualAddress+sectionHeader.PointerToRawData;
printf("res fileaddr:0x%x\n",RsRealAddr);
}
}
//
fseek(fp,RsRealAddr,SEEK_SET);
loop:
IMAGE_RESOURCE_DIRECTORY resDir;
IMAGE_RESOURCE_DIRECTORY_ENTRY resDirEntry;
assert(fread(&resDir,sizeof resDir,1,fp)!=-1);
assert(fread(&resDirEntry,sizeof resDirEntry,1,fp)!=-1);
if (TEST(resDirEntry.OffsetToData))
{
DWORD nextPoint=resDirEntry.OffsetToData&0x7fff;
fseek(fp,RsRealAddr+nextPoint,SEEK_SET);
goto loop;
}
else
{
fseek(fp,RsRealAddr+resDirEntry.OffsetToData,SEEK_SET);
IMAGE_RESOURCE_DATA_ENTRY resDataEntry;
assert(fread(&resDataEntry,sizeof resDataEntry,1,fp)!=-1);
printf("res size:%d\n",resDataEntry.Size);
printf("res offset:0x%x\n",resDataEntry.OffsetToData);
}
fclose(fp);
getchar();
return 0;
}
在我的电脑上运行结果为:
使用ue查看:
中间的正好差了2000h(8192)
弄不明白
,麻烦指教一下。
多谢。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课