• .NET安全优化方案


    .NET具有较多的优点,如:标准集成,简化应用,对移动设备的支持等。但使用.NET编写的程序有个致命的缺点:易被反编译,且运行时占用较大的资源。因此,为了更好的体现.NET的优势,我们必须对在.NET下编写的程序进行优化;与此同时,为了所编程序不被反编译,必然要实施有效可行的安全策略。

    .NET下可采取的安全优化方法有:源码混淆,加壳以及授权管理。

    1.1 源码混淆

    源码混淆指在不影响功能的前提下,将代码变得模糊难以理解。有效的混淆一般即增加了代码的复杂度,又使变换后的代码不可逆转。当然,混淆的目的不是一定要达到不可被反编译,而是要使反编译的花费比从中得到的利益多。

    1.1.1 混淆方法

    常见的源码混淆方法有:

    1. 名称混淆

    即对程序中的变量名,常量名,类名,方法名称等标识符做词法上的变换改名。如:

    2. 控制流混淆

    即打乱某段代码本身的逻辑关系,把相关的语句分散到程序不同位置并实现某项功能的次序混淆和隐藏真实执行路径的混淆。简单的说就是打乱程序的原有顺序,然后使用跳转语句连接原来的流程逻辑,并达到正确执行的目的。如:

    3. 数据混淆

    即对程序中的数据结构进行混淆。它又可细分为:

    ① 存储混淆——改变数据在内存中存储方式。如,将局部变量变为全局变量。

    ② 混淆编码方式——改变数据的解析方式。比如,可以将变量a解析为m*2+n。

    ③ 聚集方式混淆——改变原有数据分组的方式。最简单的例子是:将一个长数组拆分为多个短数组。

    ④ 次序混淆——改变数据的位序。还拿数组举例,比如可以通过使用函数F(i)来确定数组中第i个元素的新位置。

    4. 预防混淆

    主要针对一些专用反编译器的设计缺陷,以主动的方式防止反编译器反向还原混淆后的代码。

    1.1.2 产品举例

    Dotfuscator支持名称混淆和控制流混淆,相比其他混淆器,使用Dotfuscator混淆的代码是不可逆转的。因为它在名称混淆时,会将方法名,类名缩成1~2个字符,这大大的缩小了整个文件的大小。同时,Dotfuscator采用重载归纳,更好的增强了混淆效果。

    Xenocode Postbuild较Dotfuscator相比,在名称混淆时可以选择要混淆的方法或标识符;控制流混淆时可以选择混淆的等级。Xenocode Postbuild最大的优点是,它可以使.NET程序脱离.NET框架运行。但混淆后会使程序启动变慢,文件变大。

    1.1.3 判定标准

    Dotfuscator和Xenocode都可以实现代码混淆,那么该如何判定哪个产品更好或者说更适合我们呢?首先,我们需要知道的是:混淆效果一般通过强度、耐受性、开销、隐蔽性四个方面进行判断。

    ①  强度:指混淆变换后的程序相对原始程序对恶意用户理解程序造成的困 难程度或复杂度。

    ② 耐受性:指混淆变换后的程序对使用自动去混淆工具进行攻击的反抗度。

    ③ 开销:指经过混淆变换后的程序在执行时由变换所带来的额外的执行时间和所需存储空间的开销。

    对比Dotfuscator,Xenocode Postbuild:
    可见,经过Xenocode Postbuild混淆后字符变长,需要更多的存储空间;且经过Xenocode Postbuild混淆的程序可以脱离.NET框架运行,这在一定的程度上也增加了额外的执行时间。

    ⑤  隐蔽性:尽量使用与源代码类似的语法结构进行混淆,以增强隐蔽性。

    通过以上介绍,不难看出,强度和耐受性是必须保证的。因为混淆的目的就是增加程序的复杂度,防止恶意用户的使用。在保证前两个标准的前提下,再考虑开销和隐蔽性。

    2.1 加壳

    加壳即对可执行程序资源压缩与加密,是保护文件的常用手法。经过加壳的程序可以直接执行,但不可查看源码。只有成功脱壳后,才能查看源码。

    加壳实际上是利用特殊的算法,实现对EXE,DLL文件中的资源进行压缩,加密。类似于使用WINZIP压缩文件,只不过它是个可独立执行的文件,且解压过程隐秘,全部在内存中完成。它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时才在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。

    2.2 壳的分类

    目前加壳的产品较多,又都有各自的特点。但总的来说主要分为以下几类:

    1. 压缩壳——减小软件的体积,加密保护不是重点

    但目前支持.NET较少,当前较流行且稳定的,如:ASPack,它支持Microsoft Visual C++,Visual Basic,Delphi 和其它win32编译器,压缩率可达50%以上。

    2. 加密壳——使用了反跟踪调试及脱壳技术,而对文件的体积不做过多的关注。

    目前加密壳较多,而且能实现较好的压缩功能,如:Winlicense , AsProtect。

    3. 伪装壳——将程序的OEP换成其他代码,使查壳软件查不出是什么壳以及用什么语言编写的。如,Winlicense。

    4. 多层壳 ——在壳相互不冲突的前提下,对程序加多层壳。如:AsPack。

    2.3 产品举例

    Winlicense 由Oreans公司开发,它集加壳与授权管理等功能为一体。从攻击者的角度看,Winlicense使用了完全不同于常规的保护机制。它采用虚拟机保护机制,将关键代码用虚拟机保护,因此国内还未出现相应的脱壳工具。但目前Winlicense版本只可对.net的exe进行加壳,暂不支持对.dll加壳(近期推出支持对.NET中DLL加壳的版本)。

    AsProtect是由Star-force开发的,注重兼容性及稳定性,并且集成了ASpack的强压缩功能。它拥有压缩,加密,反跟踪,反汇编代码,CRC校验和花指令等保护措施,除此还使用RSA1024作为注册密钥生成器。正因为它功能强大,使用广泛,所以研究者也很多,目前针对其较早版本已有相应的脱壳软件。

    支 持 的

    功     能

    产        品

    Dotfuscator

    Xenocode Postbuild

    X86和X64支持

    开发平台

    Visual Studio (2003, 2005, and 2008) and 早期 VS2010

    Visual Studio(2005,2008)

    .NET框架

    支持.NET1.0到3.5版本和早期的4.0

    支持.NET2.0,.NET3.5及新.NET3.5

    命令行支持

    名称混淆

    控制流程混淆

      √

    数据混淆

    预防混淆

    ×

    ×

    脱离.NET框架

    ×

    源码混淆与加壳都可提高程序的安全性,但二者又有区别:

    源码混淆是对代码本身进行修改,增加程序的复杂度,使恶意用户无法理解原始代码;而加壳是对整个程序而言,相当于给程序加了层外壳,让恶意用户根本无法看到程序的原本面貌。两者的侧重点不同,效果也不同。源码混淆使恶意用户无法理解但仍可看到原始代码;加壳则只允许执行应用程序,不可查看原代码。

    3.1授权管理

    授权管理体现了对软件版权的保护,常用的方法有:生成有时间限制、使用次数限制或功能限制的试用版。一旦试用版达到限制条件,将无法使用。另一方面,授权管理采取绑定硬件,IP绑定等方式管理授权KEY的使用。

    目前部分授权管理软件,可以自定义到期提示信息。如:ASProtect。

    一般情况下,授权到期可以通过两种方式解除锁定:

    ⑴  输入授权ID或使用授权文件

    ⑵  在线注册

    在线注册管理相比授权文件的方式更有效。每当使用软件,都会在服务器端有相应的记录信息,这样软件的开发商可以更有效的控制软件使用。为了使授权文件更有效,可以与硬件绑定生成,这样每个授权文件只能在一台机器上使用,防止一个ID多台机器使用的现象。

    3.2 产品举例

    Winlicense 集加壳与授权管理为一身,功能强大。可以绑定硬件,生成限制的试用版等。而且Winlicense在硬件绑定的同时,还可对硬件的可更改次数做限制。即我们利用CPU,HDD,BIOS等生成唯一的硬件ID供用户使用,但用户可能会更换其硬件设施,这样的话我们需要限定其更改次数。

    SerialShield专门做授权管理的,它可利用其特殊的算法生成serial ID来限制使用。同时它可以通过在线管理,控制软件的授权问题,自定义提示信息。

    产  品

    混淆前

    混淆后

    Dotfuscator

    Name1TextBox

    eval_a

    Xenocode Postbuild

    Name1TextBox

    X4b56eb59db89b78

    且两者都有相应的API,用户可以方便的在程序中使用,如使用Winlicense中的GetHardwareID获取硬件ID。如图:

    文中所提到的 DotfuscatorXenocode Postbuild 介绍:

    Dotfuscator 专业版是一个.NET混淆器和压缩器,它可以帮助您防止您的应用程序被反编译。同时,它还以可以使得您的应用程序更加小巧以及高效。

    Dotfuscator专业版是您混淆以及提高.NET应用程序效率的最佳选择。
    其关键特征如下所示:
    先进的.NET代码安全技术:  
    命名空间(Namespace)/类型(Type)/方法(Method)/字段(Field)重命名使用我们拥有专利的Overload-Induction TM重命名系统。具有强大的“超载感应”功能。

    • 控制流混淆-使用本产品,即使是当前最好的反编译器也无法得到有用的输出。
    • 字符串加密。
    • 几个预定义的包含不可打印字符的重命名方案。
    • 水印软件

    .NET代码效率:

    • 您的应用程序将变得更加小。
    • 修整(Pruning)/压缩(Compacting):移除实际并不使用的类型、方法、以及字段。
    • 增强的修整以及重命名报表。
    • 汇编链接。

    全面高效的.NET代码开发以及部署:

    • 完全支持.NET框架。
    • 您可以轻松地使用基于XML的配置文件。
    • 所生成的Map文件允许您进行堆栈跟踪。
    • 增加混淆功能。
    • 包含了适合集成到编译环境的图形用户接口以及命令行接口。
    • 提供更加全面以及精确的PDF格式的用户使用指南。
    • 支持托管的C++模块。
    • 强大易用的命名行接口。
    • 全面支持精简版.NET框架。
    • 附属动态链接库的无缝混淆。
    • 与Visual Studio“项目生成”功能的高度集成。
    • 调试支持,包括堆栈跟踪信息解码。
    • 能够通过定制属性匹配来实现include/exclude。
    • 不仅完全支持且与Visual Studio 2005实现集成。
    • 支持通过标准的定制属性来实现声明式混淆。
    • 支持普通类型(Generic Types)以及普通类方法(Generic Methods)。
    • 许多图形用户接口都进行了改进,包括对XP主题的支持。
    • 支持生成前(Pre-build)以及生成后(Post-build)事件。
    • 每一个装配要素都可以选择库模式。
    • 自动强命名程序集,并且在生成之后解除。
    • 改进依靠“用户指定的程序集装载路径”来寻找外部程序集依赖关系的算法。
    • 可与MSBuild集成使用。

    Postbuild for .NET 强大、灵活和易于使用的代码部署解决方案适用于.NET开发人员。混淆、优化并编译.NET程序成为运行在任何Windows桌面的原生x86二进制文件。

    主要优势
    Xenocode Postbuild是功能强大、灵活以及易于使用的并且适用于.NET开发人员的代码安全和部署解决方案。

    保护您的知识产权

    • 行业领先的.NET混淆和反解析技术保护了基于.NET的代码免遭反编译和逆向工程的侵害。
    • 代码的水印技术防止了未授权拷贝。

    在任何Windows桌面上运行.NET应用程序

    • 本地X86可执行文件的生成使您的.NET应用程序能在任何地点并在有框架或无框架,或者具有一个不匹配的框架版本的情况下都能运行。
    • 嵌入应用程序特定的.NET和DirectX关联以消除版本间的冲突和单独的安装步骤。

    优化应用程序性能

    • 通过可执行的/ DLL连接、元数据削减、无用代码与元数据的消除,运行中解压以及关联合并来降低应用程序的大小和复杂度。
    • 透明压缩在不需要任何单独解压步骤的情况下大大降低了可执行文件的大小。

    虚拟文件系统数据、注册表项以及Windows服务

    • 文件系统和注册表虚拟化允许在没有主机更改、消除安装步骤、管理权限要求以及Vista UAC提示的情况下执行复杂的应用程序。
    • 新的服务虚拟化允许数据库和Web服务器进程将被直接嵌入到应用程序可执行文件中。

    直接保存到现有的MSI程序包中或生成独立的可执行文件

    • 直接将输出二进制文件保存到现有的MSI程序包中。
    • 在应用程序启动时为独立的可执行文件部署自动生成自定义纯图象显示。

    支持最新的.NET平台和技术

    • 已经更新Xenocode引擎以支持最新的. NET平台和技术,其中包括. NET Framework 3.0/3.5、WPF和LINQ、Windows Vista和Windows 2008。
    • Xenocode虚拟化完全支持最新的Windows并行(SxS)部署机制。

    适用平台:.NET
    适用客户群:所有.NET开发平台用户
    典型客户:汉王科技、江苏电化教育馆

  • 相关阅读:
    知识积累的核心:解构、重构
    常用的测试用例设计方法
    安装双系统注意事项
    对象转换工具类
    一个超级简单的HTML模板框架源代码以及使用示例
    java常量池
    维数灾难
    机器学习算法思想简单梳理
    对线性代数的一些理解
    正则表达式 java版
  • 原文地址:https://www.cnblogs.com/me115/p/1851999.html
Copyright © 2020-2023  润新知