在.NET里使用System.Reflection名称空间

介绍 

在.NET平台创建可执行文件(他们被称为组件)的最简单的方法是使用System.Reflection名称空间。
但是微软故意限制它的能力:它能建立新组件、分析对象不过不能 
反汇编IL代码。
解决办法:手动反汇编。
幸好它可以:有一些.NET反汇编器。
是的可以在病毒里使用他们。


基础

.NET可执行文件的结构非常错综复杂、低级,它将被摘要地描述。
你能在.NET work文档(Partition II data)以及MSDN里找到的全部的描述。

每个.Net可执行文件都是自描述地。
这表明全部关于组件的信息可能从它获得。
这些信息由元数据写成。 
通常元数据被放在文件的.text 段里。 

微软公司使用自己发明的汇编代码叫CIL(通用中间语言)。
这些代码在被装时在本地计算机编译执行。
那就是为什么.NET程序是跨平台的原因。

在抽象级上,组件由模块组成,模块由类型组成(类)。
类型由分为字段、事件、属性和方法(特殊情形是构造函数)的成员组成。
类型可以嵌套。
每种方法由IL代码和异常句柄组成。 

创建和分析对象用的类层次结构:

                   Assembly                        AssemblyBuilder

     Assembly.GetModules()     ||  AssemblyBuilder.DefineModule()
                                                      //
    
                            Module                           ModuleBuilder

             Module.GetTypes()         ||  ModuleBuilder.DefineType()
                                                         //

                         Type                             TypeBuilder

              Type.GetFields()          ||   TypeBuilder.DefineField()
          Type.GetProperties()      ||   TypeBuilder.DefineProperty()
             Type.GetEvents()          ||   TypeBuilder.DefineEvent()
           Type.GetMethods()         ||   TypeBuilder.DefineMethod()
        Type.GetConstructors()    ||   TypeBuilder.DefineConstructor()
                                                      //

                          FieldInfo                           FieldBuilder
                       PropertyInfo                       PropertyBuilder
                          EventInfo                          EventBuilder
                      MethodBase                         MethodBuilder    -----
                    ConstructorInfo                   ConstructorBuilder---- |.GetILGenerator()
                                                                                                           ||
                                                                                                           //
                                                                                                 ILGenerator
                                                                                                .Emit()
                                                                                                .EmitCall()
                                                                                                .DeclareLocal()
                                                                                                .DefineLabel()
                                                                                                .MarkLabel()
                                                                                                .BeginExceptionBlock()
                                                                                                .BeginExceptFilterBlock()
                                                                                                .BeginCatchBlock()
                                                                                                .BeginFaultBlock()
                                                                                                .BeginFinallyBlock()
                                                                                                .EndExceptionBlock()

所有这些对象有固定的名字并且被他们引用。
每个组件都能进行数字签名。

建立方法体和ILGenerator类定义的构造函数。
这个类的Emit和EmitCall方法产生IL指令。
有意创建这个类的特殊try-catch(try-finally)块框上的方法。
 

.NET病毒的算法

我们需要做的:
1) 分析受害者
2) 分析自己
3) 造成新组件。 
4)把自身的类型和以下所有方法、嵌套类添加到新组件中。
5)把受害者的类型和以下所有方法、嵌套类型添加到新组件中。
当添加方法入口时,使病毒在开始运行,在末尾终止的线程的代码。
6) 用IL代码和异常句柄填充全部方法 


Snail(蜗牛)

为了证明.NET感染的可能性,我写了一样本病毒,叫蜗牛(因为它的速度)。
它尝试感染当前目录和所有上级目录的EXE文件。 
为了反汇编.NET可执行文件,它把ILReader作为单独的DLL使用。
这个DLL作为覆盖数据被添加到每个被感染文件中。
理论上病毒能运行在安装了.Net work的非Windows平台(MacOSX、FreeBSD)

病毒制造被感染文件的副本并且用同样的名字创建新组件。
它把受害者的类和病毒的类加入到组件。
除非所有的副本都确认被删除了,否则原始文件不可恢复。

病毒由C#写成。并不需要用IL编写.NET病毒!
它的大小大约100 kB - 我认为这对有百GB容量的硬盘不非常大。

蜗牛使用一些免杀的技术。
它使原始的代码与垃圾代码混合(指令nop和ldloc/pop)。
此外还它使用模糊化。
这表明它用随机的名字创建对象(种类,成员)。
他们看起来象:vmtdmtQdutszak,idRIaiqBlhgigF。
用这样的对象的名称分析文件是非常困难的。

病毒植入受害者的对象并在hashtables里创建对象。
每个初始对象与已创建对象通讯。
这需要避免当被感染的程序涉及感染者(病毒)而不能没有它运行时的情况。

控制台和GUI程序能被感染。病毒复制未托管(Win32)的资源部分到感染的文件。 

对于有托管资源(.NET)的组件来说分开创建的文件那储存的资源。
(我找不到办法添加托管资源到组件里 - btw,怎样解决?)
无论如何这个特征可能被关闭。

组件可以用RSA散列签名。当病毒感染时移除这些散列。
其他通常有EXE 扩展的组件没有其他组件使用,所以密钥验证时不会有问题出现。
这个特征也可能通过在原代码中用#define注释关掉。

当探索新平台时,我注意到一个它的有趣的特征。
当病毒线程在运行而主程序结束时,线程不被终止(不像Windows应用程序进程终止也暗示所有的线程也要终止)
因此在被感染程序中的主要线程执行结束时中止病毒的线程。
.NET允许在线程终止上设置异常句柄,这样线程可以正常终止。

继续

制造实用的.NET病毒,有几种方式:

1) 试试合并(使用ILDASM 和ILASM 工具)ILReader.DLL和病毒。
但是ILReader.DLL不能分析有象这样的初始化二进制数据的组件:
 byte[] x ={1,2,3 };
解决方法:修改ILReader.DLL(用自己的继承它的类)或者手工取得这些数据。

2) 写自己重建的库。这工作要全速。

.NET将是将来Windows版本的基础,因此今后.NET病毒将占优势。

/whale

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值