一、概述
想要获取一个可执行文件(PE文件)里包含的资源文件,首先要解析可执行文件,得到资源存储的地址及大小,可参考 https://blog.csdn.net/zhyulo/article/details/85717711 。然后,根据资源存储方式,得到各资源的数据内容及其大小,可参考 https://blog.csdn.net/zhyulo/article/details/85930045 。
PE文件的资源中,位图、图标与光标的存储格式与bmp位图、ico图标与cur光标的文件的存储格式不太一样。具体表现在文件头PE资源中的缺失、·分离。但是具体的图片颜色数据,则没有变化。bmp位图、ico图标与cur光标文件格式,可参考 https://blog.csdn.net/zhyulo/article/details/85934728 。PE资源与独立文件的差别,具体见下面内容:
二、位图资源与bmp文件在数据结构上的差别
位图资源类型ID=2。位图资源与bmp文件在数据结构上的唯一差别,表现在bmp文件的BITMAPFILEHEADER文件头结构,在位图资源中的缺失。而信息头、调色板、位图点阵数据,则没有差别。所以,在位图资源的数据前,补加BITMAPFILEHEADER文件头,另存为bmp文件,就可以做到PE文件位图资源的文件提取了。
首先回顾一下BITMAPFILEHEADER文件头的定义:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //文件标识,规定为0x4D42,字符显示就是'BM'
DWORD bfSize; //文件大小
WORD bfReserved1; //保留,必须设置为0
WORD bfReserved2; //保留,必须设置为0
DWORD bfOffBits; //从头到点阵数据的偏移
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
可以看到,BITMAPFILEHEADER文件头并没有什么重要的信