`
pcajax
  • 浏览: 2162508 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

.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的保护分为三大类

由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.       人为混淆

在这里,我就要先简单的讲讲什么叫做混淆

混淆顾名思意,就是混乱,不明确的意思。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.       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 查看代码区内容

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

 

分享到:
评论

相关推荐

    [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护).doc

    .NET 产品版权保护方案 (.NET 源码加密保护) 本文主要讨论如何保护 .NET 产品的版权,防止反编译和盗版。作者首先引入了 .NET 的编译原理,解释了中间语言(MSIL)的概念,并指出其容易被反编译的缺点。然后,作者...

    .Net源码加密混淆器

    ".Net源码加密混淆器"正是为了解决这一问题而设计的工具。本文将详细讲解.NET源码加密以及混淆的基本原理、方法,并介绍DotNETReactor混淆器的使用。 首先,我们来理解一下什么是.NET源码加密。源码加密是指将编写...

    Web虎-asp.net软件加密保护-Windows专用软加密版-永久免费版本

    软件介绍:《Web虎-asp.net软件加密保护-Windows专用软加密版》推出...不需版权保护,提供强悍源码/文件加密保护 新版功能:1.支持非常方便的右键升级功能 2.提升 厂商加密工具的用户体验 3.自动联网升级授权访问文件

    .NET软件授权源码-十分完整

    .NET软件授权源码是开发.NET应用程序时至关重要的组成部分,它涉及到软件的安全性、版权保护以及商业模式的实现。本文将深入探讨.NET平台下C#语言在软件授权管理中的应用,包括授权机制、源码分析和常见授权策略。 ...

    .net技术资料大全(语言规范 源码教程 学习笔记 技术资料 .net代码生成器)

    asp.net亲密接触_带源码 C#学习 01_类.htm.txt 02_构造函数的执行序列.htm.txt 03_抽象类和接口.htm.txt 04_结构类型.htm.txt 05_类成员的定义.htm.txt 06_类成员的其他议题.htm.txt 07_接口的执行.htm.txt ...

    C# 注册码注册机制 实例源码(加密解密)

    在IT行业中,软件的注册码注册机制是保护知识产权和防止非法复制的重要手段。C#作为.NET框架下的主要编程语言,提供了丰富的工具和技术...通过学习和实践这些技术,开发者可以有效地保护软件版权,防止非法复制和盗版。

    ASP.NET+sql2005漂亮网站源码

    描述中提到的"需要破解一下DLL",可能是指某些DLL文件进行了混淆或加密,以保护源代码不被轻易查看。要查看源代码,可能需要反编译这些DLL文件,常见的工具有IL Dasm或第三方的反编译器如Reflector或dotPeek。不过,...

    文件加密程序源码(WinFrom)

    10. **许可证和版权**:源码可能附带有特定的开源许可证,例如MIT、Apache 2.0或GPL,规定了源码的使用、分发和修改条件。 通过深入学习这个文件加密程序的源码,开发者不仅可以了解加密技术的实践应用,还能提升对...

    ASP.NET精华(各种精华技术)

    5. **加密方法**:在ASP.NET中,安全性和数据保护至关重要。开发者可以使用内置的System.Security.Cryptography类库实现数据加密和解密,比如使用AES、RSA等算法。此外,还可以使用ASP.NET的身份验证和授权机制,...

    MD5加密源码

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,主要应用于...总结来说,这个.NET项目是一个简单的MD5加密工具,通过源码我们可以学习到如何在.NET环境中实现MD5加密,并了解其在实际应用中的局限性。

    东方宽频电影网站系统(asp.net源码)

    5. **安全性**:支持身份验证、授权、加密等安全特性,保护应用免受攻击。 6. **部署和更新**:易于部署和更新,通过ClickOnce等技术可以实现无缝升级。 【电影网站系统功能推测】 基于ASP.NET的电影网站系统可能...

    ASP.NET源码——[影音娱乐]缤纷影视系统 v2.0 源码.zip

    【ASP.NET源码详解——缤纷影视系统 v2.0】 ASP.NET是微软公司推出的一种用于构建Web应用程序的框架,它基于.NET Framework,提供了一种高效、安全且易于维护的编程模型。在这个“缤纷影视系统 v2.0”的源码中,...

    C++ yolov8的onnx模型加密方法保护自己模型源码

    【测试环境】 vs2019,onnxruntime==1.12.0,opencv==4.7.0 【博客地址】 blog.csdn.net/FL1623863129/article/details/135859396 【视频演示】 https://www.bilibili.com/video/BV1jw41177mQ/

    E269.Net会员管理系统 v3.2-ASP源码.zip

    【E269.Net会员管理系统 v3.2-ASP源码.zip】是一个基于ASP(Active Server Pages)技术的会员管理系统的源代码包。这个系统主要用于帮助网站管理员有效地管理和跟踪其在线平台上的用户注册和活动。ASP是微软开发的一...

    第八日.NET 同学录 -ASP源码.zip

    描述中提到的解压密码“www.cqlsoft.com”可能是发布者为保护源码不被随意传播而设置的,这是一种常见的压缩包加密方式。值得注意的是,下载并使用带有密码的源码时,应尊重原作者的版权,如果该源码是非开源或未经...

    这是一个基于.NET平台,使用C#语言开发的Asp.net视频点播系统源码.zip

    6. 安全性:确保视频内容的安全,防止非法访问和盗版,可能采用加密传输(HTTPS)、版权保护技术(如DRM)等。 7. 移动兼容:随着移动设备的普及,系统需要具备良好的跨平台兼容性,适应不同分辨率和操作系统,如...

    ASP.NET源码——[影音娱乐]塞普森视频点播系统.zip

    7. 安全性:系统需要确保视频内容的安全,防止非法下载或盗链,可能采用了数字版权管理(DRM)技术,以及SSL加密来保护数据传输安全。 8. 性能优化:对于高流量的视频点播系统,性能优化至关重要,包括缓存策略、...

    ASP.NET源码——[影音娱乐]视频小偷程序(C525).zip

    【ASP.NET源码——[影音娱乐]视频小偷程序(C525)】 这个压缩包文件包含的是一个基于ASP.NET技术开发的视频抓取程序,主要用于从互联网上抓取和下载影音娱乐类的视频资源。ASP.NET是微软推出的一个强大的Web应用程序...

    c#硬件读写之读写加密狗源码.rar

    加密狗是一种硬件设备,通常用于软件保护,防止未经授权的复制或使用。它可以通过USB接口连接到计算机,存储和处理加密的数据,为软件提供安全的身份验证。 1. **C#硬件交互基础**: 在C#中进行硬件交互通常需要...

    高级加密标准DLL

    **高级加密标准DLL**,通常被称为AES(Advanced Encryption Standard),是一种广泛应用的对称加密算法,用于保护敏感数据的安全。在IT行业中,AES以其强大的安全性、高效性和灵活性而被广泛采用。这个DLL文件(动态...

Global site tag (gtag.js) - Google Analytics