安全中国首页 > 文章中心 > 编释语言
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:www.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

《加密解密 技术内幕》1.28 DocNet 学习笔记之Anti ILDASM 研究(4千字)(图)

更新时间:2008-3-10 0:21:36
责任编辑:池天
热 点:
亿万年没有写文章了,英文没学好,中文也快不会了,趁着还没全忘,赶快温习一下。
最近在研究.Net的扩展PE结构,刚好Remotesoft公司的混淆器obfuscator能够使ILDASM以及其他使用.Net框架Reflect API制作的反编译程序(例如reflector)出错,所以好奇想知道它的工作原理,正好与扩展PE结构相关,于是小作研究,奉献下面这篇小文章让大家对新的技术有一点了解。

首先推荐一本绝好的书-- Inside Microsoft .NET IL Assembler
你想要了解.net平台的核心就一定要通读此书。
另外所有的标准都在TC39/TG3 Common Language Infrastructure (CLI)
这个包含了你所要了解的更为细致的文档。

言归正传,我们就事论事,只介绍有关于Anti的相关知识,首先是扩展PE结构借用书中的图:




原来的PE头部依然存在只是数据目录表(Data Directory Table)的内容有所变更,具体与本教程无关所以自己查资料。多出的CLR头部在数据目录表里有他的偏移和大小。事实上为了尽量不破坏原有PE结构的框架,.Net将最重要的扩展都集中在了.text section:



这其中与Anti最关键的就是Metadata了,所谓Metadata就是描述数据的数据,里面包括了两种类型堆(heap)和表(table)。堆中存放一般数据分为三类:字符串,GUID(全局唯一标识符)和团(存放任意长度二进制数据)。表以两种形式存放:#~优化形式,#-未优化形式:




我主要说明的就是优化形式的表结构,这与anti有着直接关系。

#~ Metadata Table Header
[table]
Offset|Size|Field|Description[br]
0|4|保留|通常为0[br]
4|1|主版本号|通常为1[br]
5|1|副版本号|通常为0[br]
6|1|堆大小|*[br]
7|1|保留|通常为1[br]
8|8|掩码值|比特向量,每一位对应一个表,存在即用1表示[br]
16|8|排序值|比特向量,每一位对应一个表,如果有排序即用1表示[br]
24|4*n|行值|连续的4个字节代表每一个存在表的行数[br]
24+4*n| |    表格信息|顺序表示表元素
[/table]
* 这个值表示所用到的特定的堆索引用多少字节表示,特定位设置为1:
    Bit0,指向#String的堆用4个字节表示
    Bit1,指向#GUID的堆用4个字节表示
    Bit3,指向#Blob的堆用4个字节表示
如果没有设置即特定位为0表示这些堆用两个字节表示
当前共有固定表格44个,已经足够描述所有的类型,但还留有一定的空间扩展。具体的表格请参考书或文档。表格用来描述数据类型以及各类成员,类和类之间的关系。

1 2 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画