.NET程序加壳原理

上传人:飞*** 文档编号:2059614 上传时间:2017-07-19 格式:TXT 页数:5 大小:9.40KB
返回 下载 相关 举报
.NET程序加壳原理_第1页
第1页 / 共5页
.NET程序加壳原理_第2页
第2页 / 共5页
.NET程序加壳原理_第3页
第3页 / 共5页
.NET程序加壳原理_第4页
第4页 / 共5页
.NET程序加壳原理_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《.NET程序加壳原理》由会员分享,可在线阅读,更多相关《.NET程序加壳原理(5页珍藏版)》请在金锄头文库上搜索。

1、.NET程序加壳原理摘要介绍了软件加壳技术的基本知识,给出了.NET环境下桌面软件的一种新的加壳技术,阐述了在这种技术下,软件发布与用户注册流程与实现的有关技术,最后,给出了加壳了的.NET软件运行时,脱壳的关键技术与实现的部分代码。关键词加壳;脱壳;DLL;DES;NET;MSIL1引言为了保护自己的软件的技术内核不被他人轻易盗用,软件开发人员使用了各种加密技术来保障软件的版权不被侵犯,壳便是我们常用的一种软件保护手段。对于Win32 中软件加壳技术已经有非常成熟的商业产品,然而,对于.NET环境下软件,由于.NET程序的编译结果不是机器语言代码,而是一种MSIL中间代码,因此不能使用传统的

2、加壳技术。目前, 对.NET软件实 加壳的商业软件 要有MaxtoCode, ,SafeNet 出了 软件保护产品 最新的 壳 , 了软件开发商的一 。 壳加密 自 成对 行 件的加密 程, 而 开发商 便 成软件加密权理的 。本 介绍了.NET环境下一种的软件加壳技术,currency1技术使用了“MSIL代码fifl加密 技术, 的软件保护。与MaxtoCode,这种技术的是” 软件非 , 对机件权(”件 中 不的识,CPU 的序 ,下 ),对于 版, 非本 器的 户 。2 识壳壳是对加密软件的一 的 , ,壳是软件 部的一件 ,是软件的保护 障。有了, 在对软件 编后, 软件的核 代码。

3、壳是一段程序, 于程序运行,壳在运行后 了currency1软件 权,用 保护能对软件行 保护。壳的 原理 是” 运行壳程序,壳 加密的 程序( 程序原来的待加壳的程序,下 )代码解密内存中,运行 中应能,并 程序的 权交还给 程序。本 中研究的加壳技术正是基于这种原理,只是壳 是用.NET编写的,加密与解密密钥与用户的机器件有关,而不是固定的密钥,所 软件非 ,更的保护 。3本加壳技术的原理原来的 程序编译成DLL,再编写一 壳程序,编译成EXE,并 程序的运行入口(main函)移壳中来,由壳开始 行整 程序。首 , 用自编的加密 ,在软件发布前 所有DLL 件分行加密(输入特定的密钥),在

4、壳加载DLL时临时 解密内存中,并加载运行。由于解密DLL的结果只存在于内存,所 解密后的DLL,除非他能 DLL的解密密钥。 时,为了避免分析 壳程序的逻辑, 中寻 解密密钥,还 壳编译成EXE 件后,再用第三 软件行fifl(”XenoCode)或加密(”MaxtoCode),这样 了解DLL加密的及处理逻辑。 而,更有效保护 程序DLL。加壳与脱壳的原理图1所示。图 1 NET软件加密型加壳的原理4软件发布与用户注册流程为了 广软件,开发商一般会 软件的试用版放在 上, 用户自由下载试用,用户基本 后再注册正式版。软件发布与用户注册的流程图2所示。5软件发布与用户注册的实现5.1 注册申

5、请为了软件 的能,开发商必须为不 的用户不 的 装 件,一套程序只能在一台机器上运行。为此,开发商在 装 件时,必须取 软件 要运行的目标机器的用户的位称,对于有应用程序 器的 版软件,只需要取 应用 器的。据 由用户使用特定的程序取 ,并通 短 或邮件的 式告知开发商。的提取有两种 ” 一,通 软件的试用版。试用版中设申请注册的模块,用户通 此模块提取本机的据。软件的试用版 件的不是 对目标机器的的, 在任何机器上运行。为了Cracker DLL的解密密钥后, 试用版破解。通常 对试用版软件设置能限(”去掉部分关键代码),这样使试用版被破解, 投入正式的应用。 二”使用 用于注册申请的程序。

6、对于 版的应用 程序,果没有用户界面,或 须试用的用户,只能使用由开发商提供的 用注册程序来提取机器。5.2 注册码这种加壳技术本来 省去输入注册码手 注册这 程,因为每一 发布的版本只能在定的机器上运行,但为了定用户位 及对用户行限,还是要有注册 程的。注册码是由用户位机器及用户限 经 加密处理后 的,处理 用自的注册码 来实现。5.3 加密DLL 件本加壳技术的核 之一是加密DLL 件,加密 程 用自的加密 成。加密 选择.NET框架中提供任何加密或自行设加密。 不用 开的,因为加密解密都是在自己的程序中行。因此,此 案的 性 由开发商自己保证,而不依赖于第三 。5.4 装 之前,只需用

7、为此用户加密的DLL 件及权 件 替换 装 程中应的 件,再生成 装 。装 中 独存放一份加密DLL 件权 件, 备 户升级正式版时用户 。一般而言, 装 件中不能 包含注册码或权 件的,但在这种技术下, 权 件打包 装中,因为,使 装 件被复, 在非权的机器上运行。5.5 正式版 装对于没有 装 试用版的机器, 使用 装 装正式版。对 装 试用版的机器, 用 装 中的正式版 件替换应 件 成正式版。5.6 用户注册调用正式版中帮助“关于“注册能,输入注册码或选择权 件行注册。由于 装 件中包含权 件, 在正式版首次运行时,通 权 件自 注册,免去了手 注册的 程。6 程序运行时脱壳的实现脱壳

8、实际上是 加密的程序代码解密并加载内存程序区,脱壳需要特定的解密密钥或特定的解密。对于较的程序,果只有一两 DLL, 由壳程序行一次性脱壳, 部放在内存中,这没有什么技术上的难 ,只是内存消耗较多。对于有多 DLL的程序,DLL不一定都要使用,有时 能只用 中部分,所没有必要一次脱壳, 部占据在内存中, 据需要来脱壳。脱壳 及DLL解密DLL调用请 的 技术。6.1 DLL的解密一般的加壳技术使用与用户 关的密钥,密钥是固定中壳代码中的,所 脱壳 在任何一台机器上实现,实现软件 。而在本 案中,DLL加密密钥与用户机件关, 然解密密钥 不是壳代码中固定的,而需要临时 目标机上提取生成密钥, 能

9、解密,所 脱壳只能在权的机上行,而 软件的非 。解密密钥的是由件生成的,的提取与申请注册时提取的 ,并 ,通 的保密 换后生成加密解密密钥。因此,的提取存在于壳 用的注册申请程序 软件的试用版中,为了这 的破解,需要使用第三 (”XenoCode,MaxtoCode)对这 程序的MSIL代码行fifl或加密。对于 版软件,解密密钥最 是由壳临时 应用程序 器取;但为了 , 解密密钥存入权 件中,权 件经加密后 户 软件一 装,脱壳时 权 件中提取解密密钥。DLL的解密只能在内存中行,不能生成临时 件,避免Cracker 解密后的DLL。这 要用 件流与加密流的技术,脱壳的部分代码下”publi

10、c static Assembly asmload(string asmName) Assembly asmsvr = null;FileStream fsr = null;byte byVec=new byte16, byKey=new byte32;/asmName待加载的程序 ,由 入string toLoad=AppDomain.CurrentDomain.BaseDirectory+asmName +e.dll;if ( ! File.Exists( toLoad ) ) return null;fsr = new FileStream( toLoad, FileMode.Open,

11、 FileAccess.Read );byte rawAssembly = new byte fsr.Length ;/提取机器并生成DES加密密钥与 createDesKeyVec( ref byVec,ref byKey );SymmetricAlgorithm des=SymmetricAlgorithm.Create();CryptoStream encStream=new CryptoStream(fsr, des.Create Decryptor ( byKey, byVec), CryptoStream Mode.Read );/ 取并解密 区encStream.Read( ra

12、wAssembly, 0, (int)fsr.Length );encStream.Close();fsr.Close();asmsvr = AppDomain.CurrentDomain.Load(rawAssembly );6.2 DLL调用请 的 据需要来脱壳 是 程序 被调用时,临时脱壳并加载,程序 一 加载, 后需要调用 中的能时 内存中运行,这 避免了内存的 不会 程序运行 。关键是程序 的调用不一定壳中调用, 任何一 已经运行的程序 中调用, 么 能 程序 的调用请 首 要了解应用程序, 由AppDomain对 来示,为 行代码提供载 currency1界。多应用程序 在一 程中

13、运行;但是,在应用程序程之间没有一对一的关“。多 程 于一 应用程序,给定的程并不限于一 应用程序,但在任何给定时间,程都在一 应用程序中 行。每 程序运行时,便会自 fifl应用程序。AppDomain实 用于加载 行程序 (Assembly),AppDomain 实现一件,这 件使应用程序 在加载程序 载应用程序或引发处理的 常时行 应。本 案中 是通 件AssemblyResolve来 程序 调用请 的。实现 是”首 ,在壳的main()函中注册件AssemblyResolve的 应代码, ”AppDomain.CurrentDomain.AssemblyResolve += newRe

14、solveEventHandler( CurrentDomain_AssemblyResolve );然后,再编写一段件 应代码,来实现程序 脱壳与加载。这样,在调用任何程序 时, 调用了,因为程序 的脱壳会自 行。下面是件 应的部分代码”/ 的或临时加载的程序 private static Assembly CurrentDomain_AssemblyResolve (object sender, ResolveEventArgs args)Assembly ret = null;tryAppDomain dm=(AppDomain)sender;string dllName= args.Name.Split(,)0;/用xx开的 件示加密 DLL,区于 的DLLif (dllName.StartsWith(xx)&!dllName.EndsWith (resources) )ret = asmload( dllName );catch (Exception ae ) MessageBox.Show(加载据 + args.Name + 时出 ); return ret;7 ”结上软件保护 案的 性能由DES(用)机器的 性定

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号