首页
社区
课程
招聘
[求助]在文件中获得资源信息
发表于: 2012-3-1 14:56 3755

[求助]在文件中获得资源信息

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直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
程序获得是2e180h
文件实际是2c180h
2012-3-1 15:02
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已解决。
2012-3-1 15:37
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看到了图的地址是CSDN BLOG
不过没看到图
2012-3-1 16:03
0
游客
登录 | 注册 方可回帖
返回
//