《加密解密 技术内幕》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 下一页 |
|