PE资源分析Word格式.docx
- 文档编号:17292073
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:23
- 大小:30.26KB
PE资源分析Word格式.docx
《PE资源分析Word格式.docx》由会员分享,可在线阅读,更多相关《PE资源分析Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
_cursordir
{
WORD
cdreserved;
cdtype;
cdcount;
}
CURSORDIR;
各数据段的定义
保留(Reserved):
该字段保留,必须为0
(Type):
光标资源类型,必须为2
光标个数(count):
指定光标文件中,光标的个数。
微软的程序通常不根据不同的情境,使用其中的一个。
这种情况在ICON中很常见。
光标目录信息:
根据光标个数,每一个光标都有自己的光标目录信息。
光标目录信息存放在光标目录之后。
宽度(Width)
8
高度
(Height)
颜色数(ColorCount)
保留
X坐标热点(xhotspot)
Y坐标热点(yhotspot)
数据大小(bytesize)
DWORD
32
数据偏移量(imageoffset)
_cursordirentry
BYTE
bwidth;
bheight;
bcolorcount;
breserved;
wxhotspot;
wyhotspot;
DWORD
lbytesinres;
dwimageoffset;
CURSORDIRENTRY;
宽度(Width):
指定光标宽度
(Height):
指定光标高度
颜色数(ColorCount):
保留字段,必须为0
保留:
X坐标热点(xhotspot):
指定光标热点区的X左标
Y坐标热点(yhotspot)
:
指定光标热点区的Y左标
数据大小(bytesize):
指定该光标图像的大小
数据偏移量(imageoffset):
指定该光标图像的偏移量,偏移量是从文件头开始计算的。
当光标文件中存在多个光标时,就会有多份的光标目录信息。
根据每个光标目录信息去读取光标图像。
光标图像:
每个光标图像数据,由四部分数据构成,其字段如下:
位图信息头(bitmapheaderinfo)
BITMAPINFOHEADER
40
调色板
(
palette
)
RGBQUAD
XOR颜色数据(ColorXOR)
AND数据(ColorAND)
位图信息头(bitmapheaderinfo):
指定图片信息,其中只有biBitCount和biSizeImage有效,biHeight是XOR和AND数据高度之和。
biPlanes为1,其他为0。
):
调色板信息,调色板的大小是2的biBitCount次方。
XOR颜色数据:
每个像素占用bitBitCout位。
其信息是对应调色板中的索引值,
AND数据:
每个像素占用一个bit。
XOR颜色数据的大小是bwidth*bheight*
biBitCount/8,
画图的时候要根据每个像素信息从调色板中取颜色值。
再根据AND数据,判断是否透明。
具体的图标与光标的成像原理为:
每个图标(包括光标)都是由两个单独的位图组成的。
如果该图标是屏蔽背景色的话,那么,第一个
位图是由黑色背景(相关的颜色位全为0)与彩色图标图案组成的,该位图将与当前屏幕显
示通过异或操作(XOR)结合起来,故称其为XOR位图;
第二个位图是由白色背景(相关的颜
色位全为1)与黑色图标图案(相关的颜色位全为0)组成的,该位图将与当前屏幕显示通过
与操作(AND)结合起来,故称其为AND位图。
因此,图标的显示是通过两个步骤完成的:
1.当前屏幕显示与AND位图通过AND操作结合起来;
2.当前屏幕显示与XOR位图通过XOR操作结合起来。
大家知道,1与任何数值AND操作的结果将维持原数值,而0与任何数值AND操作的结果则
是0,因此在步骤1中,AND位图中的白色
(1)与屏幕显示经过AND操作后被原色彩屏蔽,而黑
色(0)则将原色彩屏蔽。
步骤1结束后,屏幕上将留下一个黑色的图标图案。
在随后的步骤
2中,由于0与任何数值异或的结果都将是原数值,因此,XOR位图与屏幕显示经过异或操作后,
位图和屏幕中的黑色部分都将被各自对应的彩色部分屏蔽。
步骤2结束后,一个形状不规则的
图标图案就出现在屏幕上了,这就是图标显示的原理
在PE中光标资源的结构信息为:
光标资源很像图标资源。
它们以成组的格式存储,前置组头。
组头也使用固定长度的组件索引,允许随机访问每个单独组件。
光标头的结构如下:
1、
[资源头(type=12)]被保存在组光标中
structCursorHeader{
WORD
wReserved;
//当前为0
wType;
//光标=2
cwCount;
//组件数量
};
structResourceDirectory{
wWidth;
//与像素值为单位的图片宽度
wHeight;
//与像素值为单位的图片高度
wPlanes;
//目标设备的位平面数,该值一般为1
wBitCount;
//每一个像素所占的位数
DWORD
lBytesInRes;
//指向组件
wNameOrdinal;
padding;
//填充数据
//对于每一个组件都有一个独立的该结构体,来描述在光标图片的信息
2.[资源头(type=1)]被保存在光标中
在光标图像的开始处有一个比图标多出来的结构体,那就是热点信息:
该信息表示了光标的位置
structCursorComponent
{
short
xHotspot;
yHotspot;
}
接下来的的数据就和图标的一样了,分为四部分:
其字段如下:
调色板信息,调色板的大小是2的biBitCount次方,即1<
<
biBitCount。
每个pixel占用bitBitCout位。
其信息是对应调色板中的索引值
每个pixel占用一个bit,指定是否透明,1透明,0不透明。
2.位图资源
BMP图像一般有四部分组成:
1.位图文件头结构体,2.位图信息结构体,3.调色板结构体,4.位图数据
1.位图文件头结构体:
在PE文件中该部分被省略了,我认为主要是因为位图文件头的作用只是为了表示该图片的格式,而在PE文件中医用在系统预定的资源格式中只存在BMP一种文件格式,不会出现别的类型所以该部分可以省去,同时,当我们从一个PE文件中扣出来一个BMP图片时,我们只须在我们取出的数据前添加一个14个字节的位图文件头就可以了,并且可以该该结构赋值0x424D000000000000000000000000,虽然在BMP格式中表明其中2-5字节是表示文件爱你大小,a-d字节表示位图数据的起始偏移,但是Windows并不以这两个域的值来得到什么信息,因此我们大可将其赋值为0,这样我们在扣取图片是就简单了
而定位到位图数据区用的方法是(DWORD)pow(2,pbitmapinfohead->
biBitCount)*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER);
来找到数据区所以该结构被省略了
(在单色位图,16色位图,还有256色位图中都是存在调色板的,而在位图数据区放置的数据只是在调色板的索引值,因此多少色的位图可定就会有多少个RGBQUAD结构,对应这后面的索引值,这样我们就可以用pbitmapinfohead->
biBitCount域的值来确定位图中的RGBQUAD结构的数目。
然而对于大于256色的位图就没有了调色板,在位图的数据区存放的就是该位图中的颜色值)
(1.)位图文件头结构体;
typedefstructtagBITMAPFILEHEADER
{
WORDbfType;
//位图文件的类型,必须为BM(0-1字节)
DWORDbfSize;
//位图文件的大小,以字节为单位(2-5字节)
WORDbfReserved1;
//位图文件保留字,必须为0(6-7字节)
WORDbfReserved2;
//位图文件保留字,必须为0(8-9字节)
DWORDbfOffBits;
//位图数据的起始位置,以相对于位图(10-13字节)
//文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
在真正的BMP文件中接在位图文件头结构体之后的是位图信息结构体,而该结构体确实PE文件中位图资源的第一个结构体,
(2)位图信息结构体。
typedef
struct
tagBITMAPINFOHEADER{
//
bmih
biSize;
//
结构BITMAPINFOHEADER的字节数
LONG
biWidth;
以像素为单位的图像宽度
biHeight;
以像素为单位的图像长度
biPlanes;
目标设备的位平面数,此值常为1
biBitCount
每个像素的位数
biCompression;
图像的压缩格式(这个值几乎总是为0)
biSizeImage;
//以字节为单位的图像数据的大小
biXPelsPerMeter;
水平方向上的每米的像素个数
biYPelsPerMeter;
垂直方向上的每米的像素个数
biClrUsed;
调色板中实际使用的颜色数
biClrImportant;
现实位图时必须的颜色数
BITMAPINFOHEADER;
1.对于biCompression
域图像的压缩格式
压缩说明:
有0(不压缩),1(RLE8,8位RLE压缩),2(RLE4,4位RLE压缩,3(Bitfields,
位域存放)。
RLE简单地说是采用像素数+像素值的方式进行压缩。
T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。
对于
biWidth,
biHeight
两个域来从内存所占数据大小来说指的是当我们把PE映射到内存后对应的多少个字节表示该位图图片的一行数据和该位图图片的列向有说少行。
对于BMP文件的数据存放一般是从左到右,从下到上的。
2.对于biBitCount域来说,是指为一个像素所占的bit数,
0,用在JPEG格式中
1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片
图像数据中每一个字节表示八个像素
4,16色图
图像数据中每一个字节表示两个像素
8,256色图,通常说的灰度图
图像数据中每一个字节表示一个像素
16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量
24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量
32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式
3.对于biClrUsed域来说其值常为0,表示使用biBitCount确定的全部颜色
4.对于biClrImportant域来说其值常为0,表示所有的颜色都是必需的
(3)颜色表。
颜色表一般是针对16位以下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。
而对于16位以下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。
颜色表的作用就是创建调色板。
颜色表是由颜色表项组成的,颜色表项结构的定义如下:
tagRGBQUAD
{
rgbq
BYTE
rgbBlue;
rgbGreen;
rgbRed;
rgbReserved;
RGBQUAD;
其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。
(3)、位图数据。
最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:
位图数据。
根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个像素,对于16位位图,每两个字节代表了一个像素,对于24位位图,每三个字节代表了一个像素,对于32位位图,每四个字节代表了一个像素。
其在PE文件中的地址为:
(DWORD)pow(2,pbitmapinfohead->
来确定
3.图标资源
从PE文件中读取出的图标与完整的图标结构比较缺少图标文件头,图标的文件头被放在了组图标(type=14)中
图标文件格式:
分为六部分:
1.文件头6B
2.图像信息块16B
3.BMP信息头40B
4.XOR位图调色板16色的为64B256色的为1024B
5.XOR位图
6.AND位图
在导出图标是一定要注意数据的对齐是以8字节对齐的
以下结构被放在组图标中type=14
1.文件头信息结构体:
该结构体在VC中并没有定义,是从别的文档里面找到的
typedefstruct
{
WORDidreserved;
//改值为0是系统保留的域
WORDidtype;
//是1表示该结构是图标资源,是2表示该资源是光标资源
WORDidcount;
//在组中图片的数目
}ICONDIR,*LPICONDIR;
2.图像信息块
ICONDIRENTRY结构,图标资源索引目录结构(一个描述图片信息的结构体的串)
Typedefstruct
BYTEbwidth;
//图片的宽度,以像素为单位
BYTEbheight;
//图片的高度,以像素为单位
BYTEbcolorcount;
//图片的颜色数,如果颜色数大于8时该值为0
BYTEbreserved;
//系统保留
WORDwplanes;
//colorplanes
WORDwbitcount;
//每个像素的位数
DWORDdwbytesinres;
//该图片的字节数
DWORDdwimageoffset;
//表示在图标数据中的起始位置;
(在PE文件中为WORD型表示为该图标的编号)
}ICONDIRENTRY,*LPCONDIRENTRY;
以下图像数据被存放在图标段中type=3
3.BMP信息头
BITMAPINFOHEADERicheader
RGBQUADiccolors;
BYTEicxor;
BYTEicand;
}ICONIMAGE,*LPICONIMAGE;
该结构体在VC中有定义其中包含了BMP的一些信息
typedefstructtagBITMAPINFOHEADER{/*bmih*/
DWORDbiSize;
//结构BITMAPINFOHEADER的字节数
LONGbiWidth;
//该图片的宽度,以像素为单位
LONGbiHeight;
//该图片的高度的2倍,以像素为单位
WORDbiPlanes;
//面数
WORDbiBitCount;
//一个颜色所占的bit数
DWORDbiCompression;
//0
DWORDbiSizeImage;
//图片数据所占的字节数,包括掩码信息
LONGbiXPelsPerMeter;
//0
LONGbiYPelsPerMeter;
//0
DWORDbiClrUsed;
DWORDbiClrImportant;
//0
}BITMAPINFOHEADER;
4.XOR位图调色板(掩码区)16色的为64B256色的为1024B
[摘自:
BMP文件格式分析:
彩色表包含的元素与位图所具有的颜色数相同,象素的颜色用RGBQUAD结构来定义。
对于24-位真彩色图象就不使用彩色表(同样也包括16位、和32位位图),因为位图中的RGB值就代表了每个象素的颜色。
彩色表中的颜色按颜色的重要性排序,这可以辅助显示驱动程序为不能显示足够多颜色数的显示设备显示彩色图象。
RGBQUAD结构描述由R、G、B相对强度组成的颜色,定义如下]
色彩表的大小的计算方法与位图中调色板的大小的计算方法是一样的
色彩表:
typedefstructtagRGBQUAD{/*rgbq*/
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
在VC中也有其定义,
以下为数据区:
描述每一个像素的数据
在biBitCount中记录的位数是指在XOR位图中每个像素对应的多少位的数据表示,因此该部分的大小就可以一次来确定了,size=每行像素所占的字节数*以像素表示的高度(由于在BITMAPINFOHEADER结果中得到的位图高度是原位图高度的2倍这里需注意除以二)就是该位图的XOR位图部分大小了,
6.AND位图
用途:
该位图是每一个bit对应一个像素,用来说明对应的像素是否透明
对于图标资源的数据区地址的计算分为,单独对图片的地址区的计算,另一种就是在PE文件中对地址区的计算
以下为图片数据区的地址计算:
可以由BITMAPINFOHEADER中的bisize,biwidth,biheight,bibitcount变量和索引目录中的dwbytesinres计算得出XOR数据区地址=(文件头信息块的大小+图像信息块的大小+BMP信息头的大小+掩码的尺寸)
以下为在PE中数据区的地址计算:
XOR数据区地址=(BITMAPINFOHEADER结构的地址+biSize+掩码的尺寸)
XAND数据区地址=(BITMAPINFOHEADER结构的地址+biSize+掩码的尺寸+XOR部分的尺寸)
4.菜单资源
从PE文件中读出的菜单数据菜单的数据完全一样,不缺少任何信息
是一个完整的菜单;
菜单是有菜单头以及其后的菜单项做成,在菜单头的后面紧接着就是菜单项的内容,
MENUHEADERStructure
TheMENUHEADERstructurecontainsversioninformationforthemenuresource.Thestructuredefinitionprovidedhereisforexplanationonly;
itisnotpresentinanystandardheaderfile.
Syntax
typedefstruct{
WORDwVersion;
WORDcbHeaderSize;
}MENUHEADER;
Members
wVersion
Specifiestheversionnumberofthemenutemplate.ThismembermustbeequaltozerotoindicatethatthisisanRT_MENUcreatedwithastandardmenutemplate.
cbHeaderSize
Spec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PE 资源 分析