简介DOTNET 编译原理 简介DOTNET 编译原理 简介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 ,种类 :加密
  产品 :Remotesoft Dotfuscator ,种类 :混淆
4.       XenoCode
a)         产品 :XenoCode ,种类:混淆
5.       其它的一些公司,最近上海有一款公司出了国内第一款混淆工具,如果大家要选择混淆产品的话,支持一下国产也不错。
 
第三方工具的保护方式分类
1.       混淆 ?
这是目前最流行的方式吧。今天我们就来做个剖析。让大家去衡量一下混淆的强度如何。
混淆软件一般都有三个功能
1.         字符串加密
2.         名称混淆
3.         流程混淆
目前流行的混淆软件有
       XenoCode、Dotfuscator、Remotesoft,MaxtoCode里也集成了少许混淆功能。
利用幻灯片讲解流程混淆原理
利用程序当场演示如何反流程混淆
1.目标程序
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 查看代码区内容

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

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RecyclerView详细了解

关于RecyclerView大家都不陌生了&#xff0c;它的使用也越来越受欢迎&#xff0c;现在总体了解一下RecyclerView的作用&#xff0c;为什么会有RecyclerView呢&#xff0c;我用ListView也能干所有的事情啊&#xff0c;尺有所短&#xff0c;寸有所长&#xff0c;先来看看Recycler…

案例与案例之间的非常规排版

In 1929 the Cond Nast publishing group brought Russian-born Mehemed Fehmy Agha—who had been working for the German edition of Vogue magazine—to America as art director for House & Garden, Vanity Fair, and the senior edition of Vogue.1929年&#xff0c…

熊猫分发_熊猫新手:第二部分

熊猫分发This article is a continuation of a previous article which kick-started the journey to learning Python for data analysis. You can check out the previous article here: Pandas for Newbies: An Introduction Part I.本文是上一篇文章的延续&#xff0c;该文…

浅析微信支付:申请退款、退款回调接口、查询退款

本文是【浅析微信支付】系列文章的第八篇&#xff0c;主要讲解商户如何处理微信申请退款、退款回调、查询退款接口&#xff0c;其中有一些坑的地方&#xff0c;会着重强调。 浅析微信支付系列已经更新七篇了哟&#xff5e;&#xff0c;没有看过的朋友们可以看一下哦。 浅析微信…

view工作原理-计算视图大小的过程(onMeasure)

view的视图有两种情况&#xff1a; 内容型视图&#xff1a;由视图的内容决定其大小。图形型视图&#xff1a;父视图为view动态调整大小。 ### measure的本质 把视图布局使用的“相对值”转化成具体值的过程&#xff0c;即把WRAP_CONTENT,MATCH_PARENT转化为具体的值。 measur…

基于Redis实现分布式锁实战

背景在很多互联网产品应用中&#xff0c;有些场景需要加锁处理&#xff0c;比如&#xff1a;秒杀&#xff0c;全局递增ID&#xff0c;楼层生成等等。大部分的解决方案是基于DB实现的&#xff0c;Redis为单进程单线程模式&#xff0c;采用队列模式将并发访问变成串行访问&#x…

数据分析 绩效_如何在绩效改善中使用数据分析

数据分析 绩效Imagine you need to do a bank transaction, but the website is so slow. The page takes so much time to load, all you can see is a blue circle.想象您需要进行银行交易&#xff0c;但是网站是如此缓慢。 该页面需要花费很多时间来加载&#xff0c;您只能看…

隐私策略_隐私图标

隐私策略During its 2020 Worldwide Developers Conference, Apple spent time on one of today’s hottest topics — privacy. During the past couple of years, Apple has been rolling out various public campaigns aiming to position itself as a company that respect…

您一直在寻找5+个简单的一线工具来提升Python可视化效果

Insightful and aesthetic visualizations don’t have to be a pain to create. This article will prevent 5 simple one-liners you can add to your code to increase its style and informational value.富有洞察力和美学的可视化不必费心创建。 本文将防止您添加到代码中…

figma 安装插件_彩色滤光片Figma插件,用于色盲

figma 安装插件So as a UX Designer, it is important to design with disabilities in mind. One of these is color blindness. It is important to make sure important information on your product is legible to everyone. This is why I like using this tool:因此&…

产品观念:更好的捕鼠器_故事很重要:为什么您需要成为更好的讲故事的人

产品观念&#xff1a;更好的捕鼠器重点 (Top highlight)Telling a compelling story helps you get your point across effectively else you get lost in translation.讲一个引人入胜的故事可以帮助您有效地传达观点&#xff0c;否则您会迷失在翻译中。 Great stories happen…

7月15号day7总结

今天复习了springMVC的框架搭建。 思维导图&#xff1a; 转载于:https://www.cnblogs.com/kangy123/p/9315919.html

设计师的10种范式转变

For $250, a business can pay a graphic designer to create a logo for their business. Or, for $10,000 a business can hire a graphic designer to form a design strategy that contextually places the business’s branding in a stronghold against the market it’s…

面向Tableau开发人员的Python简要介绍(第2部分)

用PYTHON探索数据 (EXPLORING DATA WITH PYTHON) And we’re back! Let’s pick up where we left off in the first article of this series and use the visual we built there as a starting point.我们回来了&#xff01; 让我们从在本系列的第一篇文章中停下来的地方开始&…

设计组合中的10个严重错误可能会导致您丧命

As an agency co-founder and design lead, I’ve been participating in many recruitment processes. I’ve seen hundreds of portfolios and CVs of aspiring designers. If you’re applying for a UI designer position, it is good to have some things in mind and to …

MySQL命令学习

上面两篇博客讲了MySQL的安装、登录&#xff0c;密码重置&#xff0c;为接下来的MySQL命令学习做好了准备&#xff0c;现在开启MySQL命令学习之旅吧。 首先打开CMD&#xff0c;输入命令&#xff1a;mysql -u root -p 登录MySQL。 注意&#xff1a;MySQL命令终止符为分号 (;) …

实验心得_大肠杆菌原核表达实验心得(上篇)

大肠杆菌原核表达实验心得&#xff08;上篇&#xff09;对于大肠杆菌蛋白表达&#xff0c;大部分小伙伴都觉得 so easy! 做大肠杆菌蛋白表达十几年经历的老司机还经常阴沟翻船&#xff0c;被大肠杆菌表达蛋白虐千百遍的惨痛经历&#xff0c;很多小伙伴都有切肤之痛。福因德接下…

自定义版本更新弹窗

目录介绍 1.Animation和Animator区别 2.Animation运行原理和源码分析 2.1 基本属性介绍2.2 如何计算动画数据2.3 什么是动画更新函数2.4 动画数据如何存储2.5 Animation的调用 3.Animator运行原理和源码分析 3.1 属性动画的基本属性3.2 属性动画新的概念3.3 PropertyValuesHold…

《SQL Server 2008从入门到精通》--20180716

1.锁 当多个用户同时对同一个数据进行修改时会产生并发问题&#xff0c;使用事务就可以解决这个问题。但是为了防止其他用户修改另一个还没完成的事务中的数据&#xff0c;就需要在事务中用到锁。 SQL Server 2008提供了多种锁模式&#xff1a;排他锁&#xff0c;共享锁&#x…

googleearthpro打开没有地球_嫦娥五号成功着陆地球!为何嫦娥五号返回时会燃烧,升空却不会?...

目前&#xff0c;嫦娥五号已经带着月壤成功降落到地球上&#xff0c;创造了中国航天的又一里程碑。嫦娥五号这一路走来&#xff0c;困难重重&#xff0c;但都被我国航天科技人员逐一克服&#xff0c;最终圆满地完成了嫦娥五号的月球采样返回地球任务。嫦娥五号最后这一步走得可…