.NET 产品版权保护方案 (.NET源码加密保护)

简介:
说 明:你希望自己用.net辛辛苦苦做出来的软件被人轻易破解吗?你希望自己花了大量人力物力用.net开发出来的产品被竞争对手轻易获取核心代码吗?这是 一篇比较详尽地介绍如何保护自己的.net源代码的文章,如混淆、加密和强名称等,出于保护原作者的角度,所以本人没有掐头去尾作为自己个人的文章,正因 为是全文转载,所以并不代表本人完全赞同作者的全部观点,也不代表本人本人提作者提到的软件做广告,这一点请大家注意,不要认为我为别人做广告而骂我,其 实我根本不认识作者。
一.   
前言
大家好,我是康杰,大家可以叫我 Jason
我和大家一样,都是搞技术出身,也未当过讲师,所以口材有限,如果讲得不好之处,还希望大家多多海含,谢谢。
今天是我们第一次见面,能认识你们,真的很高兴。
下面我们不要耽误大家的宝贵时间,让我们马上开始上课吧。  
DotNet    ms 开发并推广的企业解决方案,也是 Ms 以后几年的核心发展战略之一,所以我觉得  DotNet  是有前途的,他有一个优秀的概念,还有一个强大的财团,想失败都很难啊。 DotNet   缺乏的是大型企业高层管理人员对它的信心,这还需要时间和事例去证明,世界上待开发的大案件还很多, Java   DotNet  最终谁的市场比例多,现在还说不清楚。
二.    简介 DOTNET  编译原理
相信大家都使用过  Dotnet  ,可能还有不少高手。不过我还要讲讲 Dotnet 的基础知识, Dotnet 的编译原理。
Dotnet 是一种建立在虚拟机上执行的语言,它直接生成  MSIL  的中间语言,再由 DotNet 编译器  JIT  解释映象为本机代码并交付 CPU 执行。它和 Java 是一种机制的语言。这种语言的优点就是您不需要去考虑您的程序在那里运行,您只需要把功能做出来,虚拟机会在任何地方实现您的功能。这是一个很好的趋势和想法,但虚拟机的中间语言由于带了大量的“元数据”信息,所以也极容易被反编译。
MSIL  的代码事实上和  C#   VB  没有多大的区别,只要您记住 20 来个指令,您应该可以很容易的读懂它。
保护代码和开源并不冲突,需要保护的一定有自己的理由,所以今天我也不是来反对开源的。。呵呵
三.    中间语言的缺点
中间语言如此容易被反编译,有许多可怕之处。
1.        我们最关心的知识产权
辛苦研究出来的算法,多少个不眠夜研究出来的成果。这本来是你赚钱的法宝,可是被公开了,知识产权没有了,那个时候恨谁啊。
2.        源代码泄漏,被竞争对手拿去和你竞争(这种事很多)
就我知道的都有几起,不过不方便说出来。
他们从客户那里想办法 copy 回一份别的公司的产品,然后反编译后,改改图片,图片以及版权信息和注册信息,就拿出去卖了。
正规的公司一套卖二万,它们一套才 8 千。功能基本上一样,你说你是客户,你买谁的?
3.        自己产品的注册机满天飞
做个共享软件吧,赚点钱改善一下生活吧,产品刚上市,还没几天注册机每个网站都有。影响了销售还影响心情,以后不做产品了,还是做服务靠得住,至少盗版不了啊,  呵呵,不过做服务,还没那么多资金,真是做什么都难啊。
4.        被别人植入恶意程序,后果得由作者或开发商承担
以上说的都只是被别人占便宜的事情,还好,只是让能占占便宜,算了,亏也亏不了多少。可是,我再讲一个,那可就不是被人占便宜那么简单了。
比方说:贵公司出了套产品,放在网上给人下载试用,定好版本为 1.0 ,某个恶意的公司不怀好意,把产品下载下来,用万恶的 Ildasm   反编译一下,然后在里面加入一段按条件触发的命令,命令的内容是 format c: or format d:.  然后再用万恶的 ilasm   编译一下,用贵公司的名义打个一模一样的包,升级为 1.2 试用版,然后放到 ftp   shareware site  上供人试用下载。试想一下,不久您就会接到用户的投诉,甚至是起诉。
再比方说:要离开公司的员工,对公司的种种形为不满,在离职交接以后,把公司 Release 好的项目的某个 dll 改一改,必定造成这个项目的重大损失。当然,我可不是在教各位用这种方法对待自己不满的公司。我只是告诉各位, Dotnet 的程序集,不保护是不行的。
 
四.    保护方案分类
下面,我开始介绍一下 .NET 的各种保护方案。
我把 Dotnet 的保护分为三大类
  1. m$ 提供的非第三方保护方案
a)          强名称
强名称是 MS 提供的保护机制。
它需要使用  sn  这个命令。
强名称是什么意思呢?在这里稍作解释。强名称的作用就是防止程序集被非法修改,当对程序集修改后,必须重新用您的私再对程序集加一次强名称,这也是如果含有强名称的程序集在混淆或加密后必须要重新加强名称的原因。
Sn  / ?  可以看到它的使用方法,如果你安装的  Framework 是中文的,那么参数的解释也是中文的,我就不多讲了。
那么强名称有用吗?网上轻松破解强名称的方法很多, Ildasm 反编译加过强名称的程序集后,在 IL 文件中将强名称的相关信息去掉,再利用 Ilasm 编译,就可以解除强名称的限制了。这个我已经过测试过,您的强名称的 PublcKey 不管是加在程序集中,还是加在 Class 中,都可以被去掉,所以强名称不是一个完善的保护方式。不过在这里要说一下,如果有一个好的方案能和强名称一起使用,那么将建立一个非常好的机制,防修改,防滥用。
说到滥用,这是强名称的一个特殊用途,它可以使您的 dll 不被第三方调用,如果您的 dll 能保护自己的话。
关于强命称讲到这里,他的使用方式有必要的情况下,我们以后再深入的讲解。
 
b)         编译 MSIL 为本机代码  (误区?)
关于这一点,我经常能在 MS 上的社区看到有 MVP 这样面对问题:
问: C# 写的程序能编译成本机代码吗?
答:可以,使用  Ngen.exe  即可以  MSIL  代码编译为  本机代码。
MVP 这样回答错了吗?其实,严格的说, MVP 的回答是没错的, Ngen.exe 的确是可以将  MSIL  编译为本机代码,并可以使 JIT 不需要进行再次编译 MSIL 。这样能加快程序的执行效率。
但用户这样的问题其实,并不是对执行效率不满意,而是对中间语言不满意,可惜  Ngen  并不能解决用户的问题。
让我们来浅浅的分析一下  Ngen 的工作吧。
Ngen MS 提供的  本机映象生成器,它可以将中间语言程序集编译为本机代码存放在缓存中。这里请大家注意,是存放在缓存中, Dotnet 在内存中建立了一个缓存,这个缓存中存放了许多常用的程序集编译后的本机代码,它们是常驻的,由此来加快 Dotnet 的执行速度。
所谓一个本机代码,因为本机映射时,会映射出一些  Framework  里需要的 Method ,编译为汇编就是  Call 0x0200000 这样的样子,而这些东西必须是事件编译好的。那么理论上说  Ngen   必须要在当前执行的机器上运行,而直接编译成本机代码的程序 copy 到另一个地方不一定可以用,而且我一直没有找到能将缓存中的本机代码  copy  出来的方法。
讲到这里,不知道大家明白我的意思没有,不管如何  Ngen.exe  只是一个提速的工具,因为要执行编译为本机代码必须还是要原程序集,而原程序集中存在 MSIL ,所以让程序无法脱离被反编译的目地。
大家回家,如果有空,可以做做试验。
Ngen  /show  就可以看到缓存中所有的已编译好的程序集,所以 Dotnet 并不慢。  
Ngen <assembly path or display name> 
可以把指定程序集映象为本机代码。
Ngen  /?  可以看到其它参数
 
以上是 ms 提供的工具,下在讲讲,自己在编程的过程中,如何使用技巧来防止破解或反编译。
  1. 编程技巧保护方案
在这里,我会给大家介绍两种三种方式
1.        人为混淆
在这里,我就要先简单的讲讲什么叫做混淆
混淆顾名思意,就是混乱,不明确的意思。 MetaData 中都有一个 Rid ,程序集运行时就已经和名称没什么关系了,都使用 Rid 来调用的,所以可以将名称省去。
什么叫人为混淆呢,就是人为的制造混淆。
曾经看过一个程序集,手工的将一个 Method 折成几十个或上百个,从而达到让你看不懂的目的。不过可惜的说一句:现在的 Dotnet 程序集的分析工具都很强大,正引用,反调用都可以用程序来实现,所以即实这么做,了没多大用处。著名的 Reflector 就有这些功能。
2.        隐藏程序集
刚刚谈到了 Reflector ,它就是使用这种方式来隐藏自己的核心程序集的。相信我, Reflector 并不是您看到的那一个可执行程序,它的可执行程序只是一个壳而以,里面是一个定义和接口,没有实例的方法。如果你想得到他是怎样反编译的核心,恐怕你会在它这个迷宫中迷失方向。
它是怎样做的呢?让我来告诉你,它的核心程序集事实上就是它的一个资源。而这个资源是一个加密的资源。如果我没记错,他应该是在双击第一个需要反编译的 Method 的时候开始释放这个资源,并对资源解密然后动态的加载。这样做的优点核心程序集是不会在硬盘上留下任何痕迹的,它只解在内存中解密并被加载,你基本上无法得到这个程序集。而且 Dotnet 是不允许内存  Dump 的。
大家是不是觉得这种保护方法不错呢?你可以把你的核心代码加密后做成资源包在程序里,在使用的时候再解密出来,这只需要你自己去实现就可以了。
不过我还得说句负责任的话,如果你有精力,并且很有耐心和技术,相信你还是可以在几天时间内找出它的核心程序集解密算法的位置。并成功的解出它的资源程序集。
如果是高手又非常有经验,这种方式的加密手段应该是秒杀。
 
3.        将程序集中的相关 Method( 方法 ) 编译成 Unmanaged (非托管代码)
下面介绍的内容是不管你是菜鸟,或是高手,都无法得到核心代码的方
它可称之为终极的保护手段,因为它就是“非托管代码”。
什么是托管代码,什么是非托管代码。
简单的说,托管代码就是需要 Jit 去解释的中间语言代码,而非托管代码
就是本机代码。下面要介绍的方式就是教您如何在自己的程序集中即拥有托管代码,又拥有非托管代码。注意,非托管代码是无法被现在的反编译工具反编译的。
        特别注意一点,我没有自己试过,但我看人做过,并得到了证实。
        Dotnet 程序集中,允许托管代码和非托管代码共存,怎样实现呢?这并不是无偿的,这是需要条件的。它的条件就是必须使用 VC++.NET 非托管方式来写 dll ,再用 VC++ 托管方式建立工程引入这个本机代码的 dll 。最终生成一个 Dotnet 程序集的 dll 。那么这个程序集里面即有托管代码,又有非托管代码。托管代码是可以反编译的,而非托管代码不可能被反编译。
有人可能要问了,这和自己用 VC++ 写个 dll 有什么区别?区别就是这样的结合更紧密一些,而且也不能用常规的分析 Asm 的工具去分析这个 dll
这里还要解释一个误解,有人说,利用 Win32 的本机代码写注册算法,并生成 dll 供给 Dotnet 程序集调用,防止破解。其实这句话只说对了一半,这只能增加破解注册机的难度,并防止不了破解。为什么呢?因为注册对不对还是要在 Dotnet 程序集中进行判断,所以,只要改掉这个判断,一样达到了破解效果。但是如果要分析注册算法,那可就是困难了一些了。
  1. 第三方保护工具
下面,我们讲一讲第三方的保护工具和概念
第三方保护工具较好的厂商有:
1.        Aiasted.SOFT        
a)          产品  MaxtoCode   ,种类  :加密、混淆
2.        PerEmptive  Solutions     
a)          产品  Dotfuscator  Community  ,种类  :混淆
3.        Remotesoft
a)          产品  Remotesoft  Protect  ,种类  :加密
b)         产品  Remotesoft  Dotfuscator  ,种类  :混淆
4.        XenoCode
a)          产品  XenoCode   ,种类:混淆
5.        其它的一些公司,最近上海有一款公司出了国内第一款混淆工具,如果大家要选择混淆产品的话,支持一下国产也不错。
 
第三方工具的保护方式分类
1.        混淆  ?
这是目前最流行的方式吧。今天我们就来做个剖析。让大家去衡量一下混淆的强度如何。
混淆软件一般都有三个功能
1.          字符串加密
2.          名称混淆
3.          流程混淆
目前流行的混淆软件有
       XenoCode Dotfuscator Remotesoft MaxtoCode 里也集成了少许混淆功能。
利用幻灯片讲解流程混淆原理
利用程序当场演示如何反流程混淆
 
1. 目标程序

2.被混淆的程序使用 Reflector 查看
 
3. 使用 Ildasm 反编译出  IL  文件
       ildasm XenoCodeTest.exe /out=XenoCodeTest.il
4. IL  文件中的某个方法抽出

5.使用 Deflow 进行反混淆

6.回填,并使用 Ilasm 进行编译
Ilasm  XenoCodeTest.il /resource=XenoCodeTest.res /output=XenoCodeTestNew.exe
7. 再回到  Reflector  中进行查看

2.        打包  ?
ThInstall   是一个打包工具,他可以打包几乎所有的应用程序,也包括
Dotnet
他将多个 Dotnet 程序集包在一个大程序里,达到无法反编译的目地。不过想想也知道,即然是打包,在需要运行时肯定会释放,如果找到了释放出来的文件,就跟没保护一样了,所以,这算是一个最烂的保护手段。当然,本来我没想把它列进来的,是因为看到论坛上经常有人用这个 Thinstall 回复别人说可以保护 Dotnet 程序集,所以我才特别忠告大家,别信。
 
3.        加密  ?
加密保护并不同于混淆,它是目前最好的保护方式,也是保护能力最强的。
他把 Dotnet 的先天不足在一定程度上大幅提高,为 Dotnet 引来更多的开发者。加密保护的软件都有一个共同点,即把 Dotnet 的反编译引深 Win32 的反汇编中了,可惜的是,也限制了 Dotnet 跨平台的优势。
此类的代表软件有
MaxtoCode    Remotesoft  protect  ,其它的一些国外的,我就不说了,实 在让人用不下去。
由于 Remotesoft 公司过于小气, Protect 连试用版都不提供,所以我只能找到他的一个加密过的产品  WebGrid3.5 ,但 WebGrid4.0 就未用 Protect 了,不知道为什么,几千美金就这么废了?分析 WebGrid3.5 以后,发现他和 MaxtoCode 一样,产生的结果就是看不到 IL 代码了,而且也会生成一个本机代码的 DLL 作为运行环境。
由于对 Remotesoft  Protect 无法深入研究,只知道效果和 MaxtoCode 一样,那么我们就来讲 MaxtoCode 的实现原理吧。
MaxtoCode 为了迷补 Dotnet 的先天性不足而出世的。它是中国第一款高强度的 Dotnet 保护软件,在世界的 Dotnet 保护水平线上也处于优势性的领先。
其实 MaxtoCode 的原理很简单,它是将程序集中所有的 IL 进行加密,所以使用反编译器无法看到 IL ,从而不能进行反编译。基于 Framework 提取 Method IL 作为基础原理,当 JIT 需要 IL 时,我就将加过密的 IL 解密给 JIT 去编译,这样就形成了 MaxtoCode 的基本原理。
 
        下面是 MaxtoCode   加密的过程及结果 :
1. 选择程序集 

2. 选择高级加密的选项

3.选择混淆的选项

4.加密

5.结果
加密后的程序运行结果 :

使用 Reflector 反编译的结果

使用 MS 自带的工具 Ildasm 进行反编译

使用 Ildasm 查看代码区内容

源代码都为空了,完全不可以反编译.杜绝了反编译的问题.













本文转自周金桥51CTO博客,原文链接: http://blog.51cto.com/zhoufoxcn/163944  ,如需转载请自行联系原作者
相关文章
|
1月前
|
开发框架 .NET BI
ASP.NET公立医院健康体检信息管理系统源码
健康体检信息管理系统是专门针对医院体检中心的日常业务运作的特点和流程,结合数字化医院建设要求进行设计研发的一套应用系统。该系统覆盖体检中心的所有业务,完成从预约、登记、收费、检查、检验、出报告、分析、报表等所有工作,规范了体检流程,提高了工作效率。体检系统为每个体检者建立一套完整的体检档案,与病人的门诊、住院诊疗信息有机集成, 真正体现数字化医院以病人为中心的建设原则。
27 1
|
1月前
|
开发框架 安全 .NET
ASP.NET三甲医院手术麻醉信息管理系统源码 对接麻醉机、监护仪、血气分析仪
辅助医院建设 •支持三级医院评级需求 •支持智慧医院评级需求 •支持互联互通评级需求 •支持电子病历评级需求
23 0
|
Java 数据安全/隐私保护
Java实现最电话号码的简单加密源码
Java实现最电话号码的简单加密源码
20 0
|
3月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
41 4
|
4月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
75 0
|
4月前
|
开发框架 前端开发 JavaScript
分享129个ASP.NET源码总有一个是你想要的
分享129个ASP.NET源码总有一个是你想要的
36 0
|
4月前
|
开发框架 前端开发 .NET
分享119个ASP.NET源码总有一个是你想要的
分享119个ASP.NET源码总有一个是你想要的
50 1
|
4月前
|
开发框架 前端开发 .NET
分享68个ASP.NET源码总有一个是你想要的
分享68个ASP.NET源码总有一个是你想要的
87 0
|
20天前
|
存储 开发框架 前端开发
前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构
发展历史:实验室信息管理系统(LIMS),就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现代的管理思想有机结合,利用数据处理技术、海量数据存储技术、宽带传输网络技术、自动化仪器分析技术,来对实验室的信息管理和质量控制等进行全方位管理的计算机软、硬件系统,以满足实验室管理上的各种目标(计划、控制、执行)。
17 1
|
17天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0