目录
简介
上文提到CLR Runtime Header
中包含metadata directory
,我们可以通过这个字段访问对应的元数据信息。
本篇文章会大致介绍一下元数据metadata
以及它的存储结构。后续的文章都将基于本篇文章,因此如果有不理解的地方,推荐重新再看一遍,一遍,又一遍。
什么是元数据
元数据(metadata)是存储于PE文件中的二进制信息(binary information),用于补充描述程序的信息。由于公共语言运行时CLR的编程模型天生就是面向对象的,因此元数据包括每个类和类中的成员,成员对应的注解,以及它们彼此之间的关系。metadata是托管程序(managed module)必不可少的一部分,每个托管程序(managed module)总是会携带完整的逻辑结构用于描述所在的托管程序。
具体实现上,元数据(metadata)是规范化的关系型数据库。这意味着元数据是一组相互引用的长方形表(table),而不是树状结构。元数据表的每一列包含数据或者一个引用,指向另一个表的某一行。整个元数据表没有冗余的数据,如果另一个表需要用到相同的数据,它会引用(references)持有数据的表。
Metadata Header
由于PE-bear无法展示Metadata相关的header,所以本篇文章会使用CFF Explorer来辅助学习。