手机版

深入分析的原理和源代码 NET许可证编译器

时间:2021-11-18 来源:互联网 编辑:宝哥软件园 浏览:

当使用第三方类库时,经常可以看到它自己的demo程序包含这样一个Demo许可文件。复制代码如下: Infragistics . win . misc . ultra button,Infragistics 2.win.misc.v11.1,Version=11.1.20111.2009。区域性=中性,public key token=f8b 58 b 62 b 52 fdf 31 infra structures。Win.Misc.UltraLabel,Infragistics2。Win.Misc.v11.1,Version=11.1.20111.2009,Culture=中性,public key token=f8b 58 b 62b 52 fdf 31 infra structures。win . printing . ultiprintpreviewdialog,Infragistics2。win . ultrawinprintpreviewdialog . v 11.1,Version=11.1.20111.2009,Culture=中性,public key token=f8b 58 b 62 b 52 fdf 31 info structures。win . ultrawindata source . ultradata source,Infragistics2。Win.UltraWinDataSource.v11.1,Version=11.1.20111.2009,culture=neutral,公钥标记=f8b58b62b52fdf31此文件的格式为文本文件,但应根据其格式要求编写:控件的名称和程序集的全名。例如,如果HostApp.exe的一个应用程序想要引用授权控制MyCompany。示例. LicControl1在Samples.DLL,它可以创建包含以下内容的HostAppLic.txt。我的公司。样本。LicControl1,样本。DLL .然后调用以下命令创建一个名为host app . exe . licenses Lc/target : host app . exe/comprist : host app IC . txt/I : samples . dll/outdir : c 3360 \ bindir生成嵌入了。许可证作为HostApp.exe资源中的一项资源存档。如果您正在构建C#应用程序,您应该使用以下命令来构建该应用程序。CSC/RES/: hostapp.exe.licenses/out:hostapp.exe *中的LC.EXE档案。cs.NET框架SDK目录是用。net语言,其功能是根据许可证文件的内容生成资源文件。在编译的最后时刻,CSC编译器将生成的资源文件嵌入到执行文件中。使用。NET反射器来加载LC.EXE并开始源代码分析之旅。image

在程序入口,首先分析命令行参数,根据不同的参数执行指定的函数。先看看完整的参数列表。就是下面这三行复制代码代码如下:if(!process args(args)){ return num;}image

《MSDN》有完整的解释,可以抄在下面供大家参考,减少搜索MSDN造成的思维中断。/comprist : filename指定包含要包含在中的授权组件列表的文件名。许可证文件。每个组件都以其全名引用,每行只有一个组件。命令行用户可以为项目中的每个表单指定一个单独的文件。Lc.exe接受多个输入文件并生成一个. licenses文件。/h[elp]显示此工具的命令语法和选项。/i:module指定包含文件/拼接中列出的组件的模块。要指定多个模块,请使用多个I/o标志。/nologo取消Microsoft启动标题。/outdir:path指定放置输出的目录。许可证文件。/target :目标指定可执行文件。许可证文件已生成。/v指定详细模式;显示编译进度信息。/?显示工具的命令语法和选项。ProcessArgs方法的关键功能是分析组件和程序集的列表,并复制如下代码所示的代码: if((!flag3 (str2。长度7)) str2。子串(0,7)。ToUpper(CultureInfo。不变量文化)。equals(' target : '){ target PE=str 2。子串(7);flag3=真;}if((!flag3 (str2。长度8)) str2。子串(0,9)。ToUpper(CultureInfo。不变量文化)。equals(' comprist : '){ string str 3=str 2。子串(9);if(((str 3!=null(str 3)。长度1)){ if(compLists==null){ compLists=new ArrayList();} compLists。add(str 3);flag3=真;}}if((!flag3 (str2。长度2)) str2。子串(0,2)。ToUpper(CultureInfo。不变量文化)。equals(' I: '){ string str 4=str 2。子串(2);if (str4。长度0){ if(assembly==null){ assembly=new ArrayList();}个程序集。add(ST R4);} flag3=true}分析组件和程序集后,解析EventHandler委托的含义。如果运行时类加载器无法解析对程序集、类型或资源的引用,将引发相应的事件,从而使回调有机会通知运行时被引用的程序集、类型或资源位于哪个程序集。lveeventhandler负责返回解析类型、程序集或资源的程序集。复制代码如下:解析事件处理程序处理程序=新的解析事件处理程序(LicenseCompiler。onaAssemblyResolve);AppDomain。CurrentDomain.AssemblyResolve=处理程序;依次循环第一个参数分析的组件列表,为其生成授权许可副本的代码如下: design time license context creation context=new design time license context();foreach(compLists中的字符串字符串){ key=reader。ReadLine();哈希表[键]=类型。GetType(键);LicenseManager。CreateWithContext((Type)hashtable[key],creationContext);}最后生成许可证文件保存到磁盘,等待CSC编译器编译成资源文件嵌入到汇编中。复制代码如下:string path=nullif (outputDir!=null){ path=OutPutdir @ ' \ ' Targetpe。ToLower(CultureInfo。不变量文化)。“许可证”;}else{ path=targetPE。ToLower(CultureInfo。不变量文化)。“许可证”;}流o=空;尝试{ o=文件。创建(路径);DesigntimeLicenseContextSerializer。序列化(o,targetPE。ToUpper(CultureInfo。不变量文化),creation context);}最后{ if (o!=null){ o . Flush();o .关闭();}}推荐使用此方法。NET框架来保护组件,这不同于我们通常讨论的输入序列号和RSA签名。让我们来看看商业组件如何应用这项技术来保护组件。

复制代码代码如下:使用系统;使用系统网络.使用系统网络。用户界面使用系统。网络控件;使用系统组件模型.命名空间组件艺术。授权。提供商{ #地区可再发行许可证提供商公共类可再发行许可证提供商:系统组件模型。许可证提供程序{ const string strAppKey='此版本的组件艺术网站。'用户界面仅许可XYZ应用;公共覆盖系统。组件模型。许可证获取许可证(许可证上下文上下文,类型类型,对象实例,bool allowExceptions) { if(上下文UsageMode==LicenseUsageMode .Designtime) { //我们不会担心设计时问题颁发许可证返回新组件艺术。授权。提供者。可再分发的许可证(本"应用");} else { string STrfoundapKey//在运行时,我们只希望该控件在打包它的应用程序//中运行HttpContext ctx=HttpContext .当前;strFoundAppKey=(字符串)ctx .应用[' ComponentArteBui _ AppKey '];if(strAppKey==strFoundAppKey)返回新的组件艺术.授权。提供者。可再分发的许可证(此"应用程序");否则返回null} } } #endregion #region可再发行许可证类公共类可再发行许可证:系统.组件模型。许可证{私有组件艺术。授权。提供程序。可再发行的许可证提供程序所有者;私有字符串密钥;公共可再发行许可证(组件艺术。授权提供商。可再发行许可证提供商所有者,字符串键){ this.owner=所有者;this.key=key}公共重写字符串LicenseKey { get { return key} }公共覆盖void Dispose() { } } #endregion }首先要创建一个类型,继承于许可证类型,再创建一个继承于LicenseProvider的类型,用于颁发许可证,包含在设计时许可和运行时许可,从上面的例子中可以看到,设计时没有限制,可以运行,但是到运行时,你必须有序列号,它才会生成许可对象,而不是返回空给. NET框架类型。整个验证过程由。网完成。你只需要像下面这样,应用这个许可保护机制:复制代码代码如下:[LicenseProvider(类型为(可再发行的LiceProvider))]公共类MyControl : Control { //在此插入代码。受保护的覆盖无效处置(布尔处理){ /*所有组件都必须处置它们授予的许可证。*在此处插入代码以处置许可证。*/}}控件许可的验证代码(可再发行许可证提供商)与控件本身的逻辑完全分离,分工协作保护组件的知识产权。

版权声明:深入分析的原理和源代码 NET许可证编译器是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。