说 明:你希望自己用.net辛辛苦苦做出来的软件被人轻易破解吗?你希望自己花了大量人力物力用.net开发出来的产品被竞争对手轻易获取核心代码吗?这是 一篇比较详尽地介绍如何保护自己的.net源代码的文章,如混淆、加密和强名称等,出于保护原作者的角度,所以本人没有掐头去尾作为自己个人的文章,正因 为是全文转载,所以并不代表本人完全赞同作者的全部观点,也不代表本人本人提作者提到的软件做广告,这一点请大家注意,不要认为我为别人做广告而骂我,其 实我根本不认识作者。
一. 中间语言的缺点
一. 中间语言的缺点
中间语言如此容易被反编译,有许多可怕之处。
1.
自己产品的注册机满天飞
做个共享软件吧,赚点钱改善一下生活吧,产品刚上市,还没几天注册机每个网站都有。影响了销售还影响心情,以后不做产品了,还是做服务靠得住,至少盗版不了啊, 呵呵,不过做服务,还没那么多资金,真是做什么都难啊。
4.
强名称
强名称是MS提供的保护机制。
它需要使用 sn 这个命令。
强名称是什么意思呢?在这里稍作解释。强名称的作用就是防止程序集被非法修改,当对程序集修改后,必须重新用您的私钥再对程序集加一次强名称,这也是如果含有强名称的程序集在混淆或加密后必须要重新加强名称的原因。
Sn / ? 可以看到它的使用方法,如果你安装的 Framework是中文的,那么参数的解释也是中文的,我就不多讲了。
那么强名称有用吗?网上轻松破解强名称的方法很多,Ildasm反编译加过强名称的程序集后,在IL文件中将强名称的相关信息去掉,再利用Ilasm编译,就可以解除强名称的限制了。这个我已经过测试过,您的强名称的PublcKey不管是加在程序集中,还是加在Class中,都可以被去掉,所以强名称不是一个完善的保护方式。不过在这里要说一下,如果有一个好的方案能和强名称一起使用,那么将建立一个非常好的机制,防修改,防滥用。
说到滥用,这是强名称的一个特殊用途,它可以使您的dll不被第三方调用,如果您的dll能保护自己的话。
关于强命称讲到这里,他的使用方式有必要的情况下,我们以后再深入的讲解。
b)
隐藏程序集
刚刚谈到了Reflector,它就是使用这种方式来隐藏自己的核心程序集的。相信我,Reflector并不是您看到的那一个可执行程序,它的可执行程序只是一个壳而以,里面是一个定义和接口,没有实例的方法。如果你想得到他是怎样反编译的核心,恐怕你会在它这个迷宫中迷失方向。
它是怎样做的呢?让我来告诉你,它的核心程序集事实上就是它的一个资源。而这个资源是一个加密的资源。如果我没记错,他应该是在双击第一个需要反编译的Method的时候开始释放这个资源,并对资源解密然后动态的加载。这样做的优点核心程序集是不会在硬盘上留下任何痕迹的,它只解在内存中解密并被加载,你基本上无法得到这个程序集。而且Dotnet是不允许内存 Dump的。
大家是不是觉得这种保护方法不错呢?你可以把你的核心代码加密后做成资源包在程序里,在使用的时候再解密出来,这只需要你自己去实现就可以了。
不过我还得说句负责任的话,如果你有精力,并且很有耐心和技术,相信你还是可以在几天时间内找出它的核心程序集解密算法的位置。并成功的解出它的资源程序集。
如果是高手又非常有经验,这种方式的加密手段应该是秒杀。
3.
产品 :MaxtoCode ,种类 :加密、混淆
2.
Remotesoft
a)
XenoCode
a)
混淆 ?
这是目前最流行的方式吧。今天我们就来做个剖析。让大家去衡量一下混淆的强度如何。
混淆软件一般都有三个功能
1.
流程混淆
目前流行的混淆软件有
XenoCode、Dotfuscator、Remotesoft,MaxtoCode里也集成了少许混淆功能。
利用幻灯片讲解流程混淆原理
利用程序当场演示如何反流程混淆
1.目标程序
2.被混淆的程序使用 Reflector 查看
3.使用Ildasm反编译出 IL 文件
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image002.jpg)
2.被混淆的程序使用 Reflector 查看
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image004.jpg)
3.使用Ildasm反编译出 IL 文件
ildasm XenoCodeTest.exe /out=XenoCodeTest.il
4.将IL 文件中的某个方法抽出
5.使用 Deflow 进行反混淆
6.回填,并使用 Ilasm 进行编译
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image006.jpg)
5.使用 Deflow 进行反混淆
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image008.jpg)
6.回填,并使用 Ilasm 进行编译
Ilasm XenoCodeTest.il /resource=XenoCodeTest.res /output=XenoCodeTestNew.exe
7.再回到 Reflector 中进行查看
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image010.jpg)
2.<span times="" new="" roman';="" font-style:="" normal;="" font-variant:="" font-weight:="" font-size:="" 7pt;="" line-height:="" font-size-adjust:="" none;="" font-stretch:="" normal;"="" style="padding: 0px; margin: 0px;"> 打包 ?
ThInstall 是一个打包工具,他可以打包几乎所有的应用程序,也包括
Dotnet。
他将多个Dotnet程序集包在一个大程序里,达到无法反编译的目地。不过想想也知道,即然是打包,在需要运行时肯定会释放,如果找到了释放出来的文件,就跟没保护一样了,所以,这算是一个最烂的保护手段。当然,本来我没想把它列进来的,是因为看到论坛上经常有人用这个Thinstall回复别人说可以保护Dotnet程序集,所以我才特别忠告大家,别信。
3.<span times="" new="" roman';="" font-style:="" normal;="" font-variant:="" font-weight:="" font-size:="" 7pt;="" line-height:="" font-size-adjust:="" none;="" font-stretch:="" normal;"="" style="padding: 0px; margin: 0px;"> 加密 ?
加密保护并不同于混淆,它是目前最好的保护方式,也是保护能力最强的。
他把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.结果
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image012.jpg)
2.选择高级加密的选项
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image014.jpg)
3.选择混淆的选项
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image016.jpg)
4.加密
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image018.jpg)
5.结果
加密后的程序运行结果:
使用 Reflector 反编译的结果
使用 MS 自带的工具 Ildasm 进行反编译
使用 Ildasm 查看代码区内容
源代码都为空了,完全不可以反编译.杜绝了反编译的问题.
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image020.jpg)
使用 Reflector 反编译的结果
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image022.jpg)
使用 MS 自带的工具 Ildasm 进行反编译
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image024.jpg)
使用 Ildasm 查看代码区内容
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/image026.jpg)
源代码都为空了,完全不可以反编译.杜绝了反编译的问题.