深入理解PE结构中的资源表

以1个实际的例子来理解数据目录项的各个字段的意义:

资源目录项位于数据目录下的第2项(下标为2)

 通过数据目录项2项找到资源的位置:

 0x4000<---------转成FOA为---->0x1800

0x0D8430

typedef struct _IMAGE_RESOURCE_DIRECTORY{						
	dword	Characteristcs;			//资源属性,保留将来使用,必须为0		
	dword   TimeDataStamp;			//资源创建的时间			
	dword   MajorVersion;			//资源大版本号			
	dword   MinorVersion;			//资源小版本号			
	dword   NumberOfNameEntries;			//以名称命名的资源个数			
	dword   NumberOfIdEntries;			//以id命名的资源个数			
}Image_Resource_Dir,*lpImage_Resource_Dir;	

 我们只关心最后2个字段

 

共计5个资源,每个资源的结构如下

typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY{						
union {						
  	struct {					
		dword	NameOffset:31;		//位段或位域	
		dword	NameIsString:1	;	//最高位为1,那么低31位为指向unicode的结构体指针	
	};				//最高位为0,那么低31位是一个数字,这个数字是1个编号	
	dword	Name;				
	word	Id;				
};						
	union {						
		dword	OffsetToData;				
  	struct {					
		dword	OffsetToDirectory:31	;		
		dword	DataIsDirectory:1	;	//最高位为1,那么低31位+第一层的资源目录地址 = 下一次目录结点的起始位置(这个计算,类似于重定位表计算地址那样:文件加载内存地址+资源地址转成FOA+低31位)	
		};				//最高位为0,那么低31位是一个数字,这个数字是1个编号	
	};						
}IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;		

  windows在前期定义了16种数据资源,以为这16种资源够用了,现在发现远远不够.

 

 可以通过递归的方式查找资源:

如果最高位是1,那么就是目录,先通过资源目录内偏移找到对应资源目录的位置

如果最高位是0,那么就是数据,先通过资源目录内偏移找到对应的数据位置

通过数据位置找到对应的RVA和size

posted @ 2023-10-26 17:29  一日学一日功  阅读(111)  评论(0)    收藏  举报