网站做宣传域名什么好,安徽湖滨建设集团网站,芜湖市建设厅网站,鞍山人才招聘网官网简介DOTNET 编译原理 相信大家都使用过 Dotnet #xff0c;可能还有不少高手。不过我还要讲讲Dotnet的基础知识#xff0c;Dotnet的编译原理。 Dotnet是一种建立在虚拟机上执行的语言#xff0c;它直接生成 MSIL 的中间语言#xff0c;再由DotNet编译器 JIT 解释映象为本机… 简介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 种类 加密 产品 Remotesoft Dotfuscator 种类 混淆 4. XenoCode a) 产品 XenoCode 种类混淆 5. 其它的一些公司最近上海有一款公司出了国内第一款混淆工具如果大家要选择混淆产品的话支持一下国产也不错。 第三方工具的保护方式分类 1. 混淆 ? 这是目前最流行的方式吧。今天我们就来做个剖析。让大家去衡量一下混淆的强度如何。 混淆软件一般都有三个功能 1. 字符串加密 2. 名称混淆 3. 流程混淆 目前流行的混淆软件有 XenoCode、Dotfuscator、RemotesoftMaxtoCode里也集成了少许混淆功能。 利用幻灯片讲解流程混淆原理 利用程序当场演示如何反流程混淆 1.目标程序1.目标程序
2.被混淆的程序使用 Reflector 查看 3.使用Ildasm反编译出 IL 文件 ildasm XenoCodeTest.exe /outXenoCodeTest.il 4.将IL 文件中的某个方法抽出
5.使用 Deflow 进行反混淆
6.回填,并使用 Ilasm 进行编译 Ilasm XenoCodeTest.il /resourceXenoCodeTest.res /outputXenoCodeTestNew.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 查看代码区内容源代码都为空了,完全不可以反编译.杜绝了反编译的问题.