SSCLI下的可执行文件格式分析(完结篇)

CustomAttribute表描述了该Assembly中的自定义属性,包含要实例化一个自定义属性所需要的所有信息。这个表有以下域构成,Parent是个HasCustomAttribute类型的Coded Token,Type是个CustomAttributeType类型的Coded Token;Value是个指向#Blob流的索引。一个CustomAttribute有6个Byte。
本例中有一个CustomAttribute,2E 00/0B 00/39 00。

StandAloneSig表只有一个指向#Blob流的Signature。2个Byte。对大多数使用signature的情况,如Field.Signature, Method.Signature等等Signature是指向保存在Blob流的一个signature数据块。而对于一些特殊情况,Blob中保存的Signature数据可能不被任意一个结构元素所引用,例如IL指令集中calli指令(间接函数调用指令,使用函数指针而非指向方法的Token调用,往往用于调用Native方法)需要一个Signature描述其调用的函数指针的类型。此时就需要一个StandAloneSig表项,指向这个孤儿signature。
本例中有两个StandAloneSig,值为:2A 00 34 00。

PropertyMap表是一个映射表,负责把PropertyDef中定义的属性映射到其归属的TypeDef表定义的类型中,这样就可以将属性的归属信息从类型和属性的定义中完全抽象出来。它有如下字段:2个Byte的指向TypeDef索引的Parent;2个Byte的指向Property表的 PropertyList;因此一个PropertyMap有4个Byte。
本例中有一个PropertyMap,值为 …

more ...

SSCLI下的可执行文件格式分析(续集)

闲来无事了,接着写吧。
上回书说到,一个Assembly的MetaData里面大概会有40多种表,然后我们根据一个例子分析了SSCLI下的PE文件的结构和MetaData其中的两种表Module和TypeRef。这次我们依然结合上次的例子,把剩余的几张元数据表分析完。
剩余还有12种元数据表,分别是TypeDef,Field,Method,Param,MemberRef,CustomAttribute,StandAloneSig,PropertyMap,Property,MethodSemantic,Assembly和AssemblyRef。像上面一样,我们首先看表类型的定义,在clr\src\md\runtime\metamodelcolumndefs.h中。

//——————————————————————&#8212 …
more ...

Wallop和Gmail邀请

经常在别人的blog上看到发放Gmail和Wallop的邀请。我也玩玩,顺便提升一下Blog的人气。
Gmail邀请50个,Wallop邀请3个,留言就给了阿。

more ...

SSCLI下的可执行文件格式分析(2)

下面,我们就开始分析激动人心的MetaData了。
首先,是在IMAGE_COR20_HEADER中根据名为MetaData的IMAGE_DATA_DIRECTORY项查找MetaData表的位置,计算方法跟上文提到的找COM Headerä½ç½®ç …

more ...

SSCLI下的可执行文件格式分析(1)

SSCLI下的可执行文件格式分析(Draft)

记得MSDN上某篇介绍Windows PE文件格式的超级经典权威文章开篇说道“一个操作系统的可执行文件格式在很多方面是这个系统的一面镜子。虽然学习一个可执行文件格式通常不是一个程序员的首要任务,但是你可以从这其中学到大量的知识。”最近在研究SSCLI的源代码,有些无从下手,抱着“柿子先拣软的捏”的想法,想先从.NET平台下的可执行文件入手,然后可以更进一步到Class Loader,到内存中的Object Layout,到美国人开玩笑说的JIT Happens,到Garbage Collection……
参考的东西有Google,Shared Sourced CLI Essential,Inside Microsoft.NET IL Assembler,SSCLI Source Code……
使用的工具是用来调试代码的Windbg,用来查看代码交叉链接的Source Insight,用来看二进制的UltraEdit,用来进制转换和算加减法的Windows自带计算器,用来临时记录东西的Notepad,用来字数统计和打字的Word,用来编写测试代码的Visual Studio.net 2003,用来喝水的杯子……

首先写个简单的C#程序,Hello …

more ...

研究生活总结

é›¶ä¸‰åæœˆä»½æˆ‘è¢«ä¿é€åˆ°äº†åŒæµŽå¤§å­¦ç”µå­ä¿¡æ¯ä¸Žå·¥ç¨‹å­¦é™¢è®¡ç®—æœºç§‘å­¦ä¸ŽæŠ€æœ¯ä¸“ä¸šè¯»ç ”ç©¶ç”Ÿï¼Œä»ŽåŽ»å¹´ä¹æœˆä»½ï¼Œæˆ‘å¼€å§‹äº …

more ...

六度之离,Wallop及其他

去年软院的某个MM给了我Wallop的邀请,后来我又邀请了几个朋友,加上后来勾搭上的几个wallop友,人际网络可以说已经铺开了,但是使用度却一直上不去。不光是我,我所见之处几乎遍地荒芜,除了一些横七竖八的测试贴。

据说类似Wallop这类软件统称为“社会性网络服务(SNS)”,特别喜欢猜英文简称的我估计SNS应该是Social Network Service的缩写。“人与人之间存在信任传递关系,这个所谓的信任传递层次是有限的。个体与社会的成功互动必须建立在这个信任链条上。” 这是一个曾经获得诺贝尔奖的一个Social Network模型,也是Wallop此类社群软件的理论根基。

说来挺好玩,最早接触这个社会网络模型是上个学期不久帮助某个老师在US留学的女儿做vb.net的作业,那个作业大概的意思是如果要在好莱坞的一大群演员中找到与某一个演员的关系,只需要少于或等于六步,让我们写程序测试。这东西听起来可能挺难理解(这也是为啥当时我向那位教授妈妈解释了三五遍她仍然一头雾水的原因),也是到了后来我才知道,这个小程序的背后原来还隐藏着一个社会学的理论――六度之离(Six Degree of Separation)。再插一句,从这个小题目就可以看出美国的大学在教育理科学生Coding的时候,都不忘穿插一些人文理论知识。相比之下,国内的学生在大学上C语言等课程的时候,更多的是在谭爷爷的教导下写Student->Name = “LiMing”;

六度之离又叫小世界。35年以前,美国的一位心理学家米尔格伦(Stanley Milgram)在《今日心理学 …

more ...

建立SSCLI运行和调试环境

从微软网站上(http://msdn.microsoft.com/net/sscli)下载回来的SSCLI是一个15M的压缩包。本文介绍如编译,运行,调试SSCLI和如何察看它的代码。下文所述都是笔者使用的运行环境和方法。有可能有更好的方法,欢迎交流,我的电子邮件:xxx@msn.com。

SSCLI是一个可以跨平台的实现,可以运行在Winodws,FreeBSD和Mac OS上,据说有些高手已经成功的把SSCLI跑在了Linux上。但是后面几个环境笔者不熟悉,所以Windows就成了不二之选。

安装必备的软件:

操作系统: Microsoft Windows XP

其它软件: Visual Studio.NET 2003专业版 (用来编译SSCLI,至少安装VC++.NET)

               Active Perl(Perl的引擎,用来编译SSCLI)

               Source Insight       (不错的源代码查看工具,可以方便的在代码之间进行符号跳转。用来查看SSCIL源代码)

               Windbg(微软的调试工具,用来调试SSCLI的运行情况 …
more ...

Shared Source CLI——窥探.NET底层机制的钥匙

编者按:Microsoft于2002年2月发布了Visual Studio.NET,揭开了.NET时代的序幕。几乎是与此同时,2002年3月27日,微软发布了Shared Sourced Common Language Infrastructure(共享源代码的通用语言基础设施,以下简称SSCLI)。两年过去了,国外已经有不少的大学和机构在研究SSCLI,也做出了一些比较不错的项目。但是反观国内,关于SSCLI的讨论和研究却乏善可陈。本文简单的介绍一下SSCLI的内容,希望能引起广大.NET爱好者的兴趣。

什么是SSCLI

2000年8月,微软,HP和Intel共同向国际标准化组织ECMA(欧洲计算机制造商协会)提交了通用语言基础设施(CLI)和C#编程语言的规范,希望能借此使CLI和C#成为国际标准。2001年12月13日,ECMA会员大会批准C#和通用语言基础设施(CLI)规范成为国际标准。在ECMA标准中,它们的名字是ECMA-334(C#)和ECMA-335(CLI)。SSCLI就是ECMA-334和ECMA-335的实现。SSCLI是非商业化且共享源代码的软件,它可以在FreeBSD, Mac OS X和Windows上编译运行 …

more ...

Shared Source CLI

不知什么时候起,发现自己迷上了读源代码。MFC, CRT, STL, java VM, 编译器, Linux,Linux下的WINE, Windows CE, Boost, ACE, 泄露的Windows源代码都小有研究,虽然不能完全看懂,但是偶尔从代码里面发现一丝丝的小秘密,都会让我开心兴奋不已。或许应了侯捷在《STL源码剖析》中的一句话:“源码之前,了无秘密”。

微软2002年突然发了善心,把.net的源代码开了,叫SSCLI。虽然只是一部分,虽然声称与商业版本的.net有很大的区别。但是对于有强烈的底层偷窥欲望的我,还是可以满足一下好奇心的。无奈SSCLI代码庞杂。自带的文档又雾里看花。自己一个人钻研收效甚微,去年看了一个寒假,只能算是稍微有了一些眉目,一方面是自己水平太次,一些东西看不懂,另一方面是由于缺少系统的资料,通过新闻组,网上下载ppt都是窥豹一斑,难以对SSCLI有一个全面的了解。后来打算把SSCLI作为自己毕业设计的课题。无奈已经把自己卖身给了研究生院,有些事情身不由己,结果毕业设计就成了自己都不想再提的那幅样子……

去年就从别人那里看到了有这本书,据说是研究SSCLI的不二选择。但是等了一年 …

more ...