|
.NET体系中的源程序安全问题
.NET体系中的源程序安全问题(2)
使用JIT编译器保证了检验和核查是对所有相关程序集的当前版本进行。这些操作确保执行程序总是类型安全,程序总是以合适的安全许可运行。你可以用.NET SDK的PEVerify工具自己对代码进行检验和核查。
三、反向工程 当程序集以MSIL而不是机器代码的形式发布时,最令人关心的/BBS">问题应该就是安全。正如前面所介绍的,程序集包含了关于包里面所有模块的manifest以及详细描述各个模块的元数据。.NET SDK 提供了一个名为ILDASM的工具,它是一个IL反/edu/program/hb">汇编程序,能够从模块反/edu/program/hb">汇编出IL代码以及应用程序中各个模块的元数据说明。从Listing 1可以看出,利用ILDASM对代码实施反向工程是极为方便的。 【Listing 1】下面是IL反/edu/program/hb">汇编程序ILDASM输出的部分结果。 它显示的是应用中一个名为LeavingMessage的私有方法,后 面部分是调用LeavingMessage方法的代码。CLR把参数压入 栈,执行调用,然后恢复栈为下一个操作做好准备。 .method private instance void LeavingMessage(class System.String& strText) il managed { // Code size 10 (0xa) .maxstack 8 //000059: Private Sub LeavingMessage(ByRef strText As String) IL_0000: nop .line 60 //000060: debug.Write(strText) IL_0001: ldarg.1 IL_0002: ldind.ref IL_0003: call void [System]System.Diagnostics.Debug:: Write(class System.String) .line 61 //000061: End Sub IL_0008: nop IL_0009: ret } // end of method Form1::LeavingMessage Code to call LeavingMessage Sub finally { IL_002d: nop .line 73 //000073: LeavingMessage("Goodbye Dear Friend") IL_002e: ldarg.0 IL_002f: ldstr "Goodbye Dear Friend" IL_0034: stloc.3 IL_0035: ldloca.s _Vb_t_string_0 IL_0037: callvirt instance void GoodbyeVB6.Form1::LeavingMessage(class System.String&) IL_003c: endfinally .line 74 //000074: End Try } // end handler 人们已经认识到了这个/BBS">问题,一个常见的反驳意见是:在现实中,应用的规模很大,IL反/edu/program/hb">汇编输出结果的规模将超过可以忍受的限度。但是,它可能使一个业余爱好者望而却步,却不能阻止一个真正对代码感兴趣的人。实际情况是:与机器代码的反/edu/program/hb">汇编结果相比,ILDASM的反/edu/program/hb">汇编结果要容易阅读得多,任何对此感兴趣的组织都能够从IL反/edu/program/hb">汇编结果了解到大量有关应用的信息。 按照Microsoft的意见,要保证企业机密安全,我们应该把所有包含企业机密的模块放到受保护的/edu/server/">服务器上。对于ASP.NET客户机//edu/server/">服务器应用来说这没/BBS">问题,但对于标准的桌面应用来说它行不通。那么,如何才能对知识产权进行保护呢?MSIL/edu/program/hb">汇编程序文档提到了一个命令行参数/owner: ilasm ... /owner ilasm ... /owner=fergus 这个选项用密码加密代码,防止代码被反/edu/program/hb">汇编。/BBS">问题在于Microsoft准备取消这个选项,因为它看起来不是一种好方法。这样,对于用受管理的C++、C#或VB为.NET Beta 1编写的桌面应用来说,要保护知识产权将非常困难。 但希望仍旧存在。在.NET最终发布之前,Microsoft可能提供一个模糊器(Obfuscator)程序,它能够修改MSIL的私有方法,使得除CLR JIT编译器之外没有人能够阅读这些私有方法。但是,它不会隐藏应用的公用(全局)方法以及对外部库的调用,这是因为:如果修改全局调用的名字或者隐藏这些调用,CLR将不能再链接到外部函数。因此,/edu/hkgf">黑客们仍旧能够通过查看IL代码,找出应用调用系统DLL的各种信息。这样,现在我们只能用一种方法对桌面应用的知识产权进行保护,即用非受管理的C++编写关键性代码,然后从VB.NET通过为访问非受管理代码提供的交互机制访问它。当然,对于VB开发者来说,这可能比较困难。 由于所有受管理代码必须以MSIL形式发布,所以在发布之前代码不能进行JIT编译。但是,在目标机器上安装应用的时候,我们可以把代码编译成/edu/program/hb">汇编形式。从表面上看来这很不错,但代码在安装盘上仍旧是IL形式,我们可以手工从安装盘提取出代码,然而分别对它们进行反/edu/program/hb">汇编。由于应用安装完成后以编译代码而不是IL的形式存在,除了安全之外,它还能够少量地提高应用运行的速度,因为此时我们不再需要JIT编译器编译IL代码。
四、结束语 如果你是一个桌面应用的供应商,你清楚自己应该怎么做。你可以用非受管理的C++编写代码,然后从受管理的VB调用它。用这种方法设计应用,你能够确信代码的安全。然而,如果你是一个第三方供应商,而且准备在组件中用非受管理的代码替代受管理的代码,那么,你是在强迫用户放弃.NET的优势,重新让他们面对他们今天所面临的/BBS">问题。受管理代码能够防止对应用本身或者其他应用所使用的内存空间进行破坏性操作,对受管理代码的支持正是.NET吸引人的原因之一。某些用户可能会查看受管理代码的IL程序,甚至还有可能分析应用的算法实现,如果不能正确地认识.NET的优势所在,第三方供应商可能会为了防止用户分析代码而拒绝用受管理代码编写各种/edu/soft">软件部件。 VB.NET/VS.NET有着许多优点,仅仅是对IDE(集成开发环境)的改进就足以成为我们升级到VB.NET的理由;语言方面的增强为我们带来许多新的编程支持,对底层OS访问的简化使得我们声明变量、对象以及调用低层功能更加方便。VB.NET是一个创建安全ASP.NET应用的优秀工具;但是,如果你的主要目标集中在客户端或者是桌面应用,你应该慎重考虑可能出现的/BBS">问题。Microsoft准备为桌面应用开发者提供哪些帮助?我们将拭目以待。
来源:十度教育 作者: 关键字:.NET体系中,源程序安全问题 发表日期:2006-9-6 12:11:02 网页显示有限 阅读全文请下载本文完整版WORD文档
上一篇:Visual Basic.NET实现双检锁(DCL)模式 下一篇:VB.NET窗体操作技巧两则
共2页 9 7 [1] [2] 8 :>
2008-12-4 7:26:19
|