9.2 MSIL和元498)this.style.width=498;" border=0>
(点击查看大图)图9.3 hello.exeCLR头数据
根据表中最重要MetaData项来查看元数据在PE文件中存储格式在举例中元数据RVA和大小分别是206Ch和290h转换为文件偏移就是26Ch处开始注意到这个地址和刚才CLR头结束地址24Fh的前还有点空隙IL代码正是存储在这段空间里
MetaData结构以个元数据头开始代表元数据定义由此开始看下官方对MetaData Root定义:
struct STORAGESIGNATURE
{
ULONG lSignature; // "Magic" signature
USHORT iMajorVer; // Major file version
USHORT iMinorVer; // Minor file version
ULONG iExtraData; // Off to next structure of information
ULONG iVersionString; // Length of version
};
typedef STORAGESIGNATURE UNALIGNED * PSTORAGESIGNATURE;
struct STORAGEHEADER
{
BYTE fFlags; // STGHDR_xxx flags
BYTE pad;
USHORT iStreams; // How many streams are there
};
表9-2给出了元数据头中各项意义
表9-2 MetaData Root结构和介绍说明
偏 移
大 小
名 称
说 明
0
4
lSignature
424A5342h就是4个固定ASCII码“BSJB”(BSJB是4名.Net创始人字母缩写)
4
2
iMajorVersion
元数据主版本般为1
6
2
iMinorVersion
元数据副版本般为1
8
4
iExtraData
保留为0
12
4
iVersionString
接下来版本串长度包含尾部0且按4字节对齐(例子中为0Ch)
16
12
pVersion
UTF8格式编译环境版本号(例子中为“v2.0.50727”长度10+2)
28
1
fFlags
保留为0
29
1
[Padding]
此字节无意义对齐用
30
2
iStreams
Streams个数
最新评论