WEB开发网
开发学院软件开发VC 把exe里面的资源通通取出来 阅读

把exe里面的资源通通取出来

 2007-03-17 21:26:19 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 一、前言不知大家用过exescope没有,那是日本鬼子写的一个很有用的东西,把exe里面的资源通通取出来,它能把exe等pe格式(portable executable)文件的资源(图标、位图、对话框、声音等等)分析出来,并能改写回去,其它资源的操作还在研究中,由于作者水平有限,当然v

本文示例源代码或素材下载

一、前言

不知大家用过exescope没有,那是日本鬼子写的一个很有用的东西,它能把exe等pe格式(portable executable)文件的资源(图标、位图、对话框、声音等等)分析出来,并能改写回去。当然vc的ide也有类似功能。大家是不是觉得很神秘?其实只要弄清了pe文件的结构,你也可以写一个类似的工具出来。下面是我近 来对pe文件的分析经验,给大家作参考。同时希望看到有中国人能写出比日本鬼子更牛的分析工具来。

二、重要的数据结构

PE格式简要说明:

PE文件总结构如下表:

DOS MZ header ;dos头
DOS stub    ;dos附加段
PE header   ;NT头
Section table ;节表
Section 1   ;第一节
Section 2   ;
Section ...
Section n   ;第n节

其中NT头:

 typedef struct _IMAGE_NT_HEADERS {
 DWORD Signature;//PE文件头标志 :"PE"。
 IMAGE_FILE_HEADER FileHeader;     //PE文件物理分布的信息
 IMAGE_OPTIONAL_HEADER32 OptionalHeader;//PE文件逻辑分布的信息
 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

节表数据结构:(可参考winnt.h)

 typedef struct _IMAGE_SECTION_HEADER {
 BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];//节表名称,如“.text”
 union { DWORD  PhysicalAddress;   //物理地址      
  DWORD  VirtualSize;     //真实长度
} Misc;
DWORD  VirtualAddress;     //RVA
DWORD  SizeOfRawData;     //物理长度
DWORD  PointerToRawData;    //节基于文件的偏移量
DWORD  PointerToRelocations;  //重定位的偏移
DWORD  PointerToLinenumbers;  //行号表的偏移
WORD  NumberOfRelocations;  //重定位项数目
WORD  NumberOfLinenumbers;  //行号表的数目
DWORD  Characteristics;    //节属性
 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

2.2位图文件格式。由文件头,位图信息和数据段组成。

 typedef struct tagBITMAPFILEHEADER { // bmfh文件头
   WORD  bfType; //"BM"
   DWORD  bfSize;
   WORD  bfReserved1;
   WORD  bfReserved2;
   DWORD  bfOffBits;
 } BITMAPFILEHEADER;
 typedef struct tagBITMAPINFO { // bmi----位图信息
   BITMAPINFOHEADER bmiHeader; //  ----位图信息头
   RGBQUAD     bmiColors[1];// ----调色板*
 } BITMAPINFO;
 typedef struct tagBITMAPINFOHEADER{ // bmih 位图信息头
   DWORD biSize; //该结构大小
   LONG  biWidth;
   LONG  biHeight;
   WORD  biPlanes;
   WORD  biBitCount;
   DWORD biCompression;
   DWORD biSizeImage; //位图数据大小
   LONG  biXPelsPerMeter;
   LONG  biYPelsPerMeter;
   DWORD biClrUsed;
   DWORD biClrImportant;
 } BITMAPINFOHEADER; //该结构后紧接着就是DATA了。
   

三、取资源主要思路

先要判断是否PE文件。文件头两byte应为0x4d5a即("MZ"),然后到地址0x3c中读出PE文件头(_IMAGE_NT_HEADERS)。判断文件头结构的Signature是否为17744(即"PE")。

读出节表(_IMAGE_SECTION_HEADER),判断有没有资源节。我采用了一个简单的方法:节表名为".rsrc"即是资源节。(注:据说该法不定可靠)

如有资源节,则读取资源目录(_IMAGE_RESOURCE_DIRECTORY)和资源入口(_IMAGE_RESOURCE_DIRECTORY_ENTRY)。资源在pe文件中处一树型结构中,可有三层。在资源目录根部,如果资源入口的资源名是一个id,那么它代表一种资源类型。否则,它指向下一层资源入口。(祥见例程)

读出具体资源的数据来。具体资源的入口(_IMAGE_RESOURCE_DATA_ENTRY)在就是资源树的叶子。它的OffsetToData成员指明了具体资源的物理位置。不过特别要注意的是,OffsetToData并不是具体资源在文件中的实际偏移,具体见我的例程。具体资源的长度则由Size成员指定。

导出bmp资源。pe文件里的bmp资源由BITMAPINFO部分和BITMAPDATA部分组成。我们只要为它构造一个文件头(BITMAPFILEHEADER),就可以写成bmp文件了。这里特别要注意的是BITMAPINFO的bmiColors成员是未定长的。你要为它

指明长度,以申请内存。

好了,我不说了,有什么不明白就看例程吧。

四、例子程序简介

我的例子程序基本实现了读取pe文件的资源信息,并能把位图显示、导出。其它资源的操作还在研究中。由于作者水平有限,在分析有些文件时可能会不成功。

Tags:exe 里面 资源

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接