MS.Net CLR 扩展PE结构分析(转,很不错的文章)

Flier Lu <flier_lu@sina.com.cn>
  
注意:本系列文章在水木清华BBS(smth.org)之.Net版首发,
     转载请保留以上信息,发表请与作者联系
  
概述
  
    本系列文章,将从系统层角度,通过对MS.Net CLR架构对PE映像结构的扩展的分析

解析MS.Net CLR架构的底层部分运行机制,帮助读者从更深层次理解CLR中某些重要概念
本文读者应具备基本的Win32编程经验,了解.Net中常见概念意义,并对Win32之PE映像
结构有一定了解,具体结构请参看Matt Pietrek于1994.3发表在MSJ的经典文章
《Peering Inside the PE: A Tour of the Win32 Portable Executable
File Format》,与之重复的部分我一概跳过。
    本系列文章,将分为几个大部分,首先是最重要的MetaData,其次是IL代码结构,
然后……我还没想好,呵呵。此外会根据需要穿插一下CLR核心概念、思想、技术的介绍

    至于CLR几个核心部件之间的关系与交互等问题,我热切期待TBSoft的大作,
我这里就不去抢他的话题了,呵呵。
  
前言
  
    对一个优秀Win32程序员来说,对PE结构的了解是对Win32架构了解的必经之路,
而从Chicago(Win95的开发代号,Win95正式发布以前的文档对Win95的称呼)以来,
PE结构就相对稳定,直到MS.Net的出现,才发生了一些不大不小的变化。
    之所以说是不大不小,是因为CLR基本上没有对PE结构进行改变,只是利用现有PE
结构的优良可扩展性,将其所需的信息扩展到PE映像中。具体一点说,就是利用了PE结

中的IMAGE_OPTIONAL_HEADER.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR]
来保存服务于CLR的IMAGE_COR20_HEADER结构。此外的PE结构一律不变。
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR此节,原本是设计用于COM,但不知为何
一直没有被使用,现在用于保存.Net信息的最高级信息结构。
   我们的分析也将集中在此结构以及相关信息的分析上。
   IMAGE_COR20_HEADER结构的定义,可以在FrameworkSDK\include\CorHdr.h
文件中找到,如下:
  
// CLR 2.0 header structure.
typedef struct IMAGE_COR20_HEADER
{
    // Header versioning
    ULONG                   cb;
    USHORT                  MajorRuntimeVersion;
    USHORT                  MinorRuntimeVersion;
  
    // Symbol table and startup information
    IMAGE_DATA_DIRECTORY    MetaData;
    ULONG                   Flags;
    ULONG                   EntryPointToken;
  
    // Binding information
    IMAGE_DATA_DIRECTORY    Resources;
    IMAGE_DATA_DIRECTORY    StrongNameSignature;
  
    // Regular fixup and binding information
    IMAGE_DATA_DIRECTORY    CodeManagerTable;
    IMAGE_DATA_DIRECTORY    VTableFixups;
    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
  
    // Precompiled image info (internal use only - set to zero)
    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
  
} IMAGE_COR20_HEADER;
  
   而详细的说明,则可以在FrameworkSDK\Tool Developers Guide\docs
目录中找到。因为要将CLR变为标准,MS这次一反常态,公开大量有价值的文档,
避免我等浪费时间去逆向过程,呵呵
   此结构虽然字段较多,但实际上其核心在于MetaData,其他信息都是围绕着
MetaData服务。之间的关系,等会再慢慢道来。
   cb是结构大小,MajorRuntimeVersion.MinorRuntimeVersion是版本号
指执行此程序所需的最低CLR版本号,目前一般设置为1.1。而现在发布的.Net
Framework的CLR版本一般为2.0。
   Flags是Runtime Image描述标志,描述此映像的执行属性。如设置位
COMIMAGE_FLAGS_32BITREQUIRED=0x02,则此映像只能在32位系统上执行
对以后的64位CLR无效(MS.Net很大的一个功能就是为以后平滑过渡到64位
平台做准备,想想以前16位平台到32位平台过渡时的混乱,以及现在比以前翻了
n倍的代码量就恐怖,MS真是未雨绸缪啊,呵呵)。如果设置
COMIMAGE_FLAGS_STRONGNAMESIGNED=0x04,则此映像有strong name
signature(这个东东不知道怎么翻译好)。这个strong name signature
在CLR架构里起到了非常重要的作用。为什么这么说呢?因为这个strong name
signature起到Assembly的身份证的作用,它关系到CLR中一大堆概念的实现,
以后我会专门用一章篇幅来介绍他,这里暂且放下。
   EntryPointToken则是指向IL程序的入口,类似于以前的
IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint的作用,只是以前的
AddressOfEntryPoint是一个RVA直接指向程序入口代码所在地址,
(不要告诉我你不知道RVA是什么啊,呵呵,赶快去看Peering Inside the PE)
而现在EntryPointToken指向一个Token。注意,是Token,因为IL代码是
JIT编译的,存在于映像中的都是IL形式的P-code(pseudo code),在需要时
才由CLR动态读取,在内存中编译展开为本机代码(Native Code),进而执行。
因此这里的程序入口执行的只是一个MethodDef或File表的入口,一个Token而已。
   这里的MethodDef是一个MetaData表,每行定义一个方法;而File表则是
每行有一个File定义的表,每行包含一个外部文件的信息。也就是说,在执行程序时
可以直接编译执行此映像中的一个方法的IL代码,也可能是重定向到另一个文件,
这就是Assembly作为一个逻辑代码单元,与传统DLL之类相比一个很大的不同。
Assembly的概念也非常重要,我不想这里一下说完,以后专门拿一章出来讲好了。
  剩下几个字段都是IMAGE_DATA_DIRECTORY类型,这个类型是一个数据块
定义结构,在Winnt.h中有定义
typedef struct _IMAGE_DATA_DIRECTORY {
  DWORD   VirtualAddress;
  DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  呵呵,知道RVA的意思了吧 RVA = Relative Virtual Address
  Resources定义CLI资源;StrongNameSignature定义刚刚提到的
strong name signature;此外CodeManagerTable,
ExportAddressTableJumps,MangedNativeHeader都没用到。
VTableFixups暂且略过,以后用上时再详细解释。
  这样一来,就剩下一个MetaData字段没有介绍了,不过这个重中之重的东东,
这次只言片语是无法介绍了,因为下面会有专门的一整篇——MetaData篇,
用n章的篇幅来详细剖析,呵呵
  
btw:因为自己以前不是搞Win32底层开发的,实在不知这种文章怎么写,
    希望读者多多提意见,有没有解释清楚或者错误的地方尽管提出来。
  
    分析.Net的CLR PE映像其实并不是什么困难的事情,有现成的
    代码(mono)现成的文档(Tool Developers Guide)可以看,
    只是代码比较难看(不习惯unix代码风格),文档比较长
    (一共20几M,poor)而已。我是实在耐不住好奇心才动手分析的,
    希望能够把自己分析的一些收获和体会写出来,节省其他朋友的时间。
  
    希望能够有充足的时间、精力和耐心完成这个系列文章…… 

时间: 2024-12-24 21:01:03

MS.Net CLR 扩展PE结构分析(转,很不错的文章)的相关文章

MS.Net CLR 扩展PE结构分析2

Flier Lu <flier_lu@sina.com.cn>   注意:本系列文章在水木清华BBS(smth.org)之.Net版首发,      转载请保留以上信息,发表请与作者联系   Metadata 篇   第一章 Metadata 概述   1.1 什么是 Metadata       Metadata翻译成中文是"元数据",可以理解为Type of Type, 说白了就是描述类型的类型数据.从最初级的语言层面支持的RTTI ("近代"的编程

很不错的文章---【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群

原文:很不错的文章---[问底]徐汉彬:亿级Web系统搭建--单机到分布式集群 [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设.  大规模流量的网站架构,从来都是慢慢"成长"而来.而这个过程中,会遇到很多问题,在不断解决问题的过程中,Web系统变得越来越大.并且,新的挑战又往往出现在旧的解决方案之上.希望这篇文章能够为技术人员提供一定的参考和帮助.  以下为原文 当一个Web系统从日访问量

CLR 扩展存储过程 如何返回值

问题描述 网上关于CLR扩展存储过程的源码都是C#的,C#可以用refstringxxxx来返回一个值,如果用VC++,不知道如何设置返回参数C#:......staticvoidstorepe(sqlstringa,sqlstingb,refsqlstringc)...sql新建查询...execsp'aaa','bbb',@outstringOUTPUTselectoutstringasOUTPUT_PARAM...这样可以再SQL中看到返回的C的值C++:但是如果用C++来写的话,这个返回

很不错的两款Bootstrap Icon图标选择组件_javascript技巧

一.Bootstrap icon picker组件 这个组件是在github上面搜索的时候找到的,初初看上去,确实是很不错的,并且是基于bootstrap风格的,所以更加适合使用bootstrap风格布局的项目.既然是github上面的,毋庸置疑,这是一个开源组件,源码地址.好了,说了这么多,一起来看看它到底长啥样子吧. 1.组件效果预览 第一次初始化 支持"上一页"和"下一页" 支持自定义图标的选择 支持模糊搜索图标,比如我们搜索camera 选择图标后对应的样式

几个很不错的.NET 相关的FAQ和例子代码的连接

几个很不错的.NET 相关的FAQ和例子代码的资源,推荐一下,如果大家已经知道了可不要笑话我 Mike Woodring's .NET Sample Page George Shepherd's Windows Forms FAQ? Ingo Rammer's (thinktecture) .NET Remoting FAQ Jeff Key's .NET Stuff ?

百度自身就是很不错的外链资源

百度的产品有很多,在http://www.aliyun.com/zixun/aggregation/8969.html">外链建设方面百度空间.百度知道.百度贴吧.百度百科都是很不错的,本身百度的权重就高,在百度产品里合理部署外链对于SEOer来说应该好好研究.这里提供一些建议: 1.利用百度知道自问自答,这是小儿科,一定要谨慎,小心伤了自己. 2.利用百度贴吧群发,这是玩火. 3.百度空间是个不错的东西,在百度空间写点文章加点链接还是不错的,空间里的友情链接好像作用不大,因为链接都是调用

大家写个自动采集VeryCD标题的程序吧,好多励志,很不错

问题描述 大家写个自动采集VeryCD标题的程序吧,好多励志,很不错 解决方案 解决方案二:其实只要问那边站长要就可以了再说采集这个也麻烦,几天换一个,采集这种变化率很低的东西,还不如人力去采集解决方案三:up解决方案四:呵呵解决方案五:up解决方案六:几分钟就换好几个的解决方案七:恩,想想看啊,使用HttpWebRequest和HttpWebResponse在做页面的请求和下载,使用正则将<title></title>之间的数据取出来,分析这个要是一个最新的励志的话,存入数据库中

很不错的农历代码

这个是在安全焦点上找到的,一个牛人写的,很不错的! 嘿嘿!今天在baidu上也发现了这个东西,只不过功能更强劲一点罢了,都是一样的! 百渡的万年历的查询居然连结的也是一样的,嘿嘿!演示地址为: http://www.xichang.tv/calendar.htm 源代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>万

一款很不错的html转xml工具-Html Agility Pack

原文:一款很不错的html转xml工具-Html Agility Pack 之前发个一篇关于实现html转成xml的劣作<实现html转Xml>,受到不少网友的关心.该实现方法是借助htmlparser去分解html内容,然后按照dom的结构逐个生成xml字符串.在没有充分实践后,还以为该方案能解决问题.然而经过实际使用,效率确实很低,而且对一些特殊html属性的转换也不支持,得到的结果差强人意. 偶然一次机会在浏览codeplex网站时,发现一款很不错的html解析以及转换工具,就是本篇标题