.NET软件打包技术的设计和实现

.NET软件打包器技术摘要的设计和实现介绍了软件打包器技术的基本知识,为.NET环境中的桌面软件提供了一种新的打包器技术,并说明了如何使用该技术,软件发行版和用户注册。流程和实施技术。最后,给出了打包的.NET软件解压缩的关键技术和代码实现部分。关键字包装;开箱; DLL; DES;网; MSIL 1简介为了保护其软件的技术核心不被他人轻易盗用,软件开发人员使用各种加密技术来保护软件的版权不受侵犯。它是我们常用的软件保护方法之一。对于Win32软件打包技术,已经有非常成熟的商业产品。但是net加壳工具,对于.NET环境中的软件,由于.NET程序的编译结果不是机器语言代码,而是一种MSIL中间代码,因此无法使用传统的添加。壳牌技术。目前,专门用于脱壳.NET软件的主要商业软件是MaxtoCode。此外,SafeNet还推出了其软件保护产品“圣天鼓”的最新外壳工具,该软件可以满足软件开发人员的主要愿望。圣藤沟外壳加密工具可以自动完成对可执行文件的加密过程,使开发人员可以快速轻松地完成软件加密和授权管理。

本文介绍了.NET环境中的一种简单软件打包技术。该技术使用数字签名,MSIL代码混淆,加密等技术来实现高强度的软件保护。与MaxtoCode相比,该技术的优势在于:它可以防止软件的非法复制并授权计算机硬件的“指纹”(指纹:在硬件信息中终身不变的标识号,例如CPU和服务器的序列号)。硬盘等,与下同),对于在线版本,您可以阻止此服务器以外的客户端访问该服务。 2了解“外壳”外壳是加密软件的图像隐喻。顾名思义,外壳是软件外部的“外套”,是软件的保护层。有了它,恶意攻击者在拆卸软件后就无法直接找到软件的核心代码。外壳程序是在程序之前运行的程序。 Shell运行后,它将获得软件的控制权并使用其保护功能来保护软件。 shell的工作原理大致如下:首先运行shell程序,shell将加密后的主程序(主程序是要打包的原始程序,下同)解密代码到内存中,在其中运行相应的功能并控制程序返回主程序。本文研究的打包技术是基于此原理的,除了外壳也是用.NET编写的。加密和解密密钥与用户的机器硬件指纹有关,而不是与固定密钥有关,因此可以防止软件的非法复制。获得更高的保护强度。

3这种打包程序技术的原理是:首先将原始主程序编译为DLL,然后编写一个Shell程序,将其编译为EXE,然后将程序的入口点(即main函数)移至Shell,然后开始从外壳执行整个过程。首先,可以使用自编辑的加密工具在软件发布之前分别对所有DLL文件进行加密(输入特定密钥),在外壳程序加载DLL时将它们临时解密到内存中,然后加载并运行。由于解密DLL的结果仅存在于内存中,因此攻击者除非找到DLL的解密密钥,否则无法获得解密的DLL。同时,为了防止攻击者分析Shell程序的逻辑并从中寻找解密密钥,还可以将Shell编译为EXE文件,然后使用第三方软件进行混淆(例如:XenoCode)或加密(例如:MaxtoCode)进行攻击。用户将无法理解DLL加密算法和处理逻辑。因此,主程序DLL得到了更有效的保护。脱壳和脱壳的原理如图1所示。图1 NET软件加密打包程序的原理4软件发布和用户注册过程为了推广软件,开发人员通常将软件的试用版放在Internet上,允许用户下载并免费试用,然后在用户基本满意后注册正式版本。软件发布和用户注册的过程如图2所示。

5软件发布和用户注册的实现5. 1注册应用程序为了实现软件的防复制功能,开发人员必须为不同的用户创建不同的安装文件,并且只能运行一组程序一台机器上。因此,在制作安装文件时,开发人员必须获取将运行软件的目标计算机的指纹以及用户的单位名称。对于带有应用程序服务器的网络版本软件,仅必须获取应用程序服务器的指纹。用户可以使用特定程序获取指纹数据,并可以通过SMS或电子邮件通知开发人员。有两种提取指纹的方法:一种是通过软件的试用版。注册模块为试用版,用户可以通过该模块提取机器的指纹数据。该软件的试用版并非针对目标计算机的指纹而设计,可以在任何计算机上运行。为了防止Cracker找到DLL的解密密钥,它将破解试用版。通常可以在试用版软件上设置功能限制(例如删除一些关键代码),这样,即使破解了试用版,也无法将其投入正式应用。方法2:使用专用于注册申请的过程。对于在线版本的应用程序服务程序亚博体彩 ,如果没有用户界面或不需要尝试的用户,则只能使用开发人员提供的特殊注册程序来提取机器指纹。 5. 2计算注册码的打包技术可以消除输入手动注册码的需要,因为每个发行版只能在指定的机器上运行,但是为了自定义用户单元信息和用户数量限制仍然需要注册过程。

通过对诸如用户单位,机器指纹和用户限制之类的信息进行加密来获得注册码。可以使用自制的注册码计算工具来完成该处理。 5. 3加密DLL文件该打包程序技术的核心之一是对DLL文件进行加密。可以使用自制的加密工具来完成加密过程。加密算法可以选择.NET框架中提供的任何加密算法,也可以自己设计加密算法。该算法不必是公共算法,因为加密和解密是在它们自己的程序中执行的。因此,该解决方案的安全性可以由开发人员本身来保证,而不必依赖第三方。 5. 4制作安装盘制作前,只需用为此用户加密的DLL文件和授权文件替换安装项目中的相应文件,然后生成安装盘。可以将加密的DLL文件和授权文件分别存储在安装磁盘中,以便用户在客户升级正式版本时可以直接将其复制。通常,注册码或授权文件不能直接包含在安装文件中,但是使用此技术,授权文件可以打包到安装盘中,因为即使复制了安装文件,也无法将其安装在未经授权的情况下。机器。跑。 5. 5正式版的安装对于尚未安装试用版的机器,您可以直接使用安装盘来安装正式版。对于已安装试用版的计算机,可以将相应文件替换为安装盘中的正式版本文件,以成为正式版本。

5. 6用户注册在正式版本中调用“帮助”à“关于”à“注册”功能,输入注册代码或选择要注册的授权文件。由于安装文件包含授权文件,因此在首次运行正式版本时也可以通过授权文件自动注册,从而省去了手动注册过程。 6在程序运行时解压缩的实现解压缩实际上是将加密的程序代码解密并将其加载到存储程序区域中。拆包需要特定的解密密钥或特定的解密算法。对于较简单的程序,如果只有一个或两个DLL,则可以由Shell程序一次解压缩它们,并将它们全部放入内存中。这在技术上并不困难,但是会占用更多内存。对于具有多个DLL的程序,不一定需要使用DLL,有时可能只使用其中的一部分,因此无需一次解压缩它们,所有这些都占用了内存,可以将其解压缩为需要。解包涉及诸如DLL解密和DLL调用请求捕获之类的技术。 6. 1 DLL解密常规打包技术使用与用户无关的密钥。该密钥固定在外壳程序代码中,因此可以在任何计算机上实施外壳程序,并且无法实现软件复制保护。在此解决方案中,DLL加密密钥与用户的计算机硬件指纹有关。当然,解密密钥不是固定在外壳代码中的,但是需要暂时从目标计算机中提取指纹生成密钥以对其进行解密。它在授权的计算机上进行,可以很好地防止软件的非法复制。

解密密钥是由硬件指纹生成的。指纹提取与申请注册时的指纹提取算法相同,并且通过相同的秘密算法转换指纹以生成加密和解密密钥。因此,指纹提取算法存在于外壳,专用注册应用程序和软件的试用版中。为了防止这些算法的破解福建快3 ,有必要使用第三方工具(例如XenoCode,MaxtoCode)来混淆或混淆这些程序的MSIL代码。加密。对于在线软件,解密密钥最好由外壳暂时从应用程序服务器获取;但是为简单起见,解密密钥也可以存储在授权文件中,并且授权文件已加密并与客户端软件一起安装。外壳程序从授权文件中提取解密密钥。 DLL的解密只能在内存中进行,并且不能生成临时文件,以防止Cracker截获解密的DLL。这需要使用文件流和加密流技术。部分解压缩代码如下:public static Assembly asmload(string asmName){Assembly asmsvr = null; FileStream fsr = null; byte [] byVec =新字节[16],byKey =新字节[32]; // asmName要加载的程序集的名称电竞下注app ,该参数由参数toLoad = AppDomain带到字符串中。 CurrentDomain。 BaseDirectory + asmName +“ e.dll”; if(!File。Exists(toLoad))返回null; fsr = new FileStream(toLoad,FileMode。Open,FileAccess。Read); byte [] rawAssembly =新的byte [fsr。长度]; //提取机器指纹并生成DES加密密钥和初始向量createDesKeyVec(ref byVec,ref byKey); SymmetricAlgorithm des = SymmetricAlgorithm。创建(); CryptoStream encStream =新的CryptoStream(fsr,(byKey,byVec),CryptoStream模式。读取); //读取并解密到缓冲区encStream。 Read(rawAssembly,0,(Int)fsr.Length); encStream。关闭(); fsr。关闭(); asmsvr = AppDomain。 CurrentDomain。负载(rawAssembly); des。创建解密器6. 2根据需要释放DLL调用请求的捕获Shell表示在调用程序集时,将临时解压缩并加载该程序集。程序集一旦加载,将来就需要调用其中的功能时,可以直接从内存中运行它,这样可以避免浪费内存,并且不影响程序的运行。速度。

关键是程序集调用不一定是从shell调用的,可以从任何正在运行的程序集调用河北快三 ,我们如何截获程序集的调用请求?我们必须首先了解由AppDomain对象表示的应用程序域,该对象为执行托管代码提供隔离net加壳工具,卸载和安全边界。多个应用程序域可以在一个进程中运行;但是,应用程序域和线程之间没有一对一的关联。多个线程可以属于一个应用程序域。尽管给定线程不限于一个应用程序域,但是在任何给定时间,线程都在一个应用程序域中执行。每当程序运行时,它将自动创建一个应用程序域。 AppDomain实例用于加载和执行程序集(Assembly)。 AppDomain类实现了一组事件。这些事件使应用程序能够在加载程序集,卸载应用程序域或引发未处理的异常时做出响应。在这种情况下,通过事件AssemblyResolve捕获程序集调用请求。实现方法是:首先,在外壳程序的main()函数中注册事件AssemblyResolve的响应代码,类似于:AppDomain。 CurrentDomain。 AssemblyResolve + =新的ResolveEventHandler(CurrentDomain_AssemblyResolve);然后,编写一段事件响应代码以实现程序集的外壳化和加载。

这样,在调用任何程序集时,都可以直接调用它,因为程序集的拆包将自动进行。以下是事件响应代码的一部分:///返回找到或临时加载的程序集私有静态程序集CurrentDomain_AssemblyResolve(对象发送者,ResolveEventArgs参数){Assembly ret = null;尝试{AppDomain dm =(AppDomain)发送者;字符串dllName = args。姓名。 Split(',')[0]; //如果使用(dllName。StartsWith(“ xx”)&&!dllName。EndsWith(“ resources”))ret = asmload(dllName);},则使用以xx开头的文件表示加密的DLL,与其他DLL有所不同。 catch(Exception ae){MessageBox。 Show(“正在加载数据集” +参数。名称+“错误”);} return ret;} 7上述软件保护方案的摘要安全性能由DES算法(如果使用)和机器指纹的安全性决定。

DES算法的安全性主要取决于密钥的保护。另外,由于密钥来自机器指纹,而指纹数据来自机器硬件信息,尽管指纹算法必须与软件外壳程序一起发布,但必须使用由以下人员设计的秘密算法将指纹转换为密钥:您自己,并且秘密算法不是公开的,因此算法本身是安全的。因此,密钥的安全性还取决于指纹提取算法的安全性和指纹到密钥算法的安全性,其安全性取决于第三方加密或混淆的强度,这是无法控制的。此解决方案,这可能是该程序安全性中最薄弱的环节。商业包装软件受到的攻击越来越多,因此一旦商业包装技术被破解,用它加密的软件将是不安全的。但是对于自编译打包程序技术,加密技术可以自己设计(安全),并且可以随时进行调整。而且,用户数量少,因此攻击者更少,并且使用此技术加密的软件的安全性也相对更高。伟大的。使用本文中的打包技术可以更有效地抵抗复制,反编译,序列号分发,注册机和各种常用软件破解方法。但是,尽管这种自编辑和打包技术是安全的,但是分发软件却非常复杂。这也是该方案的缺点。参考文献[1] John Robbins。微软。 NET和Windows应用程序调试[M]。北京:清华大学出版社,200 4. 6:50 [2]彭明六。对Visual Basic进行了深入研究。 NET [M]。北京:中国铁道出版社,200 3. 2:13 [3]伊桑•米勒雷塔尔。分散文件系统的强大安全性[C]。在2001年Proc IEEE国际性能,计算和通信大会上,2001:34〜40 [4]刘晓华。精通.NET核心技术的原理和体系结构[M]。北京:电子工业出版社,200 2. 8:183〜231 [5] Richter J. Microsoft Windows的编程应用程序[M]。微软出版社,200 0.

老王
地址:深圳市福田区国际电子商务产业园科技楼603-604
电话:0755-83586660、0755-83583158 传真:0755-81780330
邮箱:info@qbt8.com
地址:深圳市福田区国际电子商务产业园科技楼603-604
电话:0755-83174789 传真:0755-83170936
邮箱:info@qbt8.com
地址:天河区棠安路288号天盈建博汇创意园2楼2082
电话:020-82071951、020-82070761 传真:020-82071976
邮箱:info@qbt8.com
地址:重庆南岸区上海城嘉德中心二号1001
电话:023-62625616、023-62625617 传真:023-62625618
邮箱:info@qbt8.com
地址:贵阳市金阳新区国家高新技术开发区国家数字内容产业园5楼A区508
电话:0851-84114330、0851-84114080 传真:0851-84113779
邮箱:info@qbt8.com