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

原创 2005年05月23日 23:16:00
把exe里面的资源通通取出来

下载例子源代码

一、前言
  不知大家用过exescope没有,那是日本鬼子写的一个很有用的东西,它能把exe等pe格式(portable executable)文件的资源(图标、位图、对话框、声音等等)分析出来,并能改写回去。当然vc的ide也有类似功能。大家是不是觉得很神秘?其实只要弄清了pe文件的结构,你也可以写一个类似的工具出来。下面是我近 来对pe文件的分析经验,给大家作参考。同时希望看到有中国人能写出比日本鬼子更牛的分析工具来。
二、重要的数据结构
  PE格式简要说明:(更详细的资料见http://vcangle.8u8.com文件格式专页)
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/0/0"。
  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/0/0")。
  读出节表(_IMAGE_SECTION_HEADER),判断有没有资源节。我采用了一个简单的方法:节表名为".rsrc/0/0"即是资源节。(注:据说该法不定可靠)
  如有资源节,则读取资源目录(_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文件的资源信息,并能把位图显示、导出。其它资源的操作还在研究中。由于作者水平有限,在分析有些文件时可能会不成功。欢迎指正!主页: http://vcangle.8u8.com,邮箱:king_koo@163.net.
五、参考资料
http://www.csdn.net/dev/Format/
http://mantousoft.51.net

在DLL组件中附加图片等资源,并在程序中引用_1

首先是要生成一个资源文件,资源文件大致可以存放三种数据资源:字节数组、各种对象和字符串,首先创建一个类的实例:ResourceWriter rw = new ResourceWriter("MyRes...
  • youbl
  • youbl
  • 2006年09月19日 11:12
  • 1345

从EXE文件中提取音乐、图片等资源

用过Adobe系列软件的同学可能会被
  • u012720047
  • u012720047
  • 2014年10月27日 15:00
  • 2704

使用List的时候会将对象全部取出

对于对象查询   1、使用List的时候会将对象全部取出,而使用Iterate则只先将对象主键取出,然后在使用的时候再一个个取出。   2、List第二使用的时候会继续重新数据库中取出,而Iter...
  • u012402926
  • u012402926
  • 2016年09月21日 22:22
  • 523

获取exe和dll里面的资源

有时候需要仿照另一个程序实现一些对话框,比较笨的办法是打开那个程序,照着样子自己在VC里面画啊画。这样的效率实在有点低。现在有很多工具可以从exe和dll里面取出图片、图片、字符串、对话框等资源。比如...
  • wwwsq
  • wwwsq
  • 2014年02月12日 15:41
  • 4286

exe, dll 中资源提取工具

MultiExtractor_3.2.0_PortableSoft
  • chinabinlang
  • chinabinlang
  • 2014年05月10日 23:54
  • 1355

VC实现将资源打包并释放到指定文件夹

VC实现将资源打包并释放到指定文件夹 分类: VC/MFC2011-04-03 22:55 1104人阅读 评论(1) 收藏 举报 filenulldeleteexemfcsyst...
  • zdy0_2004
  • zdy0_2004
  • 2014年10月20日 23:35
  • 861

用好CSDN里面的资源

注册CSDN好久了,但是一直没有好好用。
  • lindejun
  • lindejun
  • 2011年07月26日 07:44
  • 270

如何将 .exe 程序添加到系统的服务中

想让一个程序在启动系统的时候自动运行,你有什么好办法?添加到启动组?那如果别人删除掉就不管用了。如果你使用了Windows   NT/2000/XP,就可以试试把这个程序添加为一个服务,这样只有拥有权...
  • qiao000_000
  • qiao000_000
  • 2010年08月16日 11:49
  • 4443

DLL和EXE加载包在自身内部的资源文件

1、插入资源的方法       insert-->resource-->import,在出现的对话框中选择一个要作为资源的文件,接着在出现的对话框中Resource type:下面的框中随便自己输入...
  • mengyafei43
  • mengyafei43
  • 2013年08月26日 14:33
  • 3561

MFC加载exe资源,程序调用exe功能

1、工程B为基于MFC对话框程序,先插入已经存EXE(或DLL)文件到VC资源文件中,如下图:       A、切换到资源视图,在上面单机右键:         B、单击"Import...",找到...
  • zdhlwt2008
  • zdhlwt2008
  • 2015年10月07日 20:50
  • 408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把exe里面的资源通通取出来
举报原因:
原因补充:

(最多只允许输入30个字)