前些日子做了一些PE文件分析,查阅了包括《Windows PE 权威指南》在内的不少文章及源码。可能出于实用的需要,大家分析的目标通常集中在区段、输入输出表方面的缘故,很少有文章对资源部分做很详细的介绍,即便是《Windows PE 权威指南》,在菜单资源部分说的也很简练,只分析了第一个简单菜单项,其他的一带而过。为了正确读取菜单资源的内容,不得已查了些资料,做了些分析推测,记录一下。当然,这些分析没有什么实际价值,内容非常初级,并且不带来任何效益,菜鸟以上级别请自行闪退。
菜单资源的存放实质上是一种顺序储存的多叉树式数据结构,用标志位来记录树节点间的关系。
图1 深度优先存储的多叉树结构
菜单项有两种:弹出菜单(POPUP)和普通菜单项(MENUITEM)。
弹出菜单项
typedef struct
{
WORD fItemFlag; //菜单项标志
WCHAR[] szItemText;//菜单名
}PopupMenuItem;
typedef struct
{
WORD fItemFlag; //菜单项标志
WORD wMenuID; //菜单ID
WCHAR[] szItemText;//菜单名
}NormalMenuItem;