USTB oppyan 2010-10-27
Ema il:oppya n@s ina .com OR oppyanGM@gma i l.com
一种 NET 软件加壳技术的设计与实现
1 引言
为了保护自己的软件的技术内核不被他人轻易盗用,软件开发人员使用了各种加密技术来保障软件的版权不被
侵犯,壳便是我们常用的一种软件保护手段。对于 Win32 中软件加壳技术已经有非常成熟的商业产品,然而,对
于.NET 环境下软件,由于.NET 程序的编译结果不是机器语言代码,而是一种 MSIL 中间代码,因此不能使用传统
的加壳技术。 目前 ,专门对.NET 软件实施加壳的商业软件主要有 MaxtoCode,另外,SafeNet 公司也推出了
其软件保护产品圣天狗最新的外壳工具,满足了软件开发商的一大愿望。圣天狗外壳加密工具可以自动完成对可执
行文件的加密过程,从而让开发商快速方便地完成软件加密和授权管理的工作。
本文介绍了.NET 环境下一种简单的软件加壳技术,该技术使用了数字签名、MSIL 代码混淆、加密等技术,可
达到高强度的软件保护。与 MaxtoCode 相比,这种技术的优点是:可以防止软件非法拷贝,针对 计算 机硬件“指
纹”授权(指纹:即硬件信息中终身不变的识别号,如 CPU 和硬盘的序列号等,下同),对于 网络 版,可以防止非
本服务器的客户端访问服务。
2 认识“壳”
壳是对加密软件的一个形象的比喻,顾名思义,壳是软件外部的一件“外衣”,是软件的保护屏障。有了它,恶意
攻击者就无法在对软件反汇编后,直接找到软件的核心代码。
壳是一段程序,它先于程序运行,壳在运行后就获得了该软件控制权,利用其保护功能对软件进行安全保护。
壳的工作原理大致是:先运行壳程序,壳将加密的主程序(主程序即原来的待加壳的程序,下同)代码解密到内存
中,运行其中相应功能,并将程序的控制权交还给主程序。
本文中 研究 的加壳技术正是基于这种原理,只是壳也是用.NET 编写的,加密与解密密钥与用户的机器硬件指
纹有关,而不是固定的密钥,所以可以防止软件非法拷贝,达到更高的保护强度。
3 本加壳技术的原理
先将原来的主程序编译成 DLL,再编写一个壳程序,编译成 EXE,并将程序的运行入口(即 main 函数)移到壳
中来,由壳开始执行整个程序。首先,可以用自编的加密工具,在软件发布前将所有 DLL 文件分别进行加密(输入
特定的密钥),在壳加载 DLL 时临时将其解密到内存中,并加载运行。由于解密 DLL 的结果只存在于内存,所以攻
击者无法获得解密后的 DLL,除非他能找到 DLL 的解密密钥。同时,为了避免攻击者 分析 外壳程序的逻辑,从
中寻找解密密钥,还可以将壳编译成 EXE 文件后,再用第三方软件进行混淆(如:XenoCode)或加密(如:
MaxtoCode),这样攻击者将无法了解 DLL 加密的算法及处理逻辑。从而,更有效地保护主程序 DLL。加壳与脱
壳的原理如图 1 所示。