Net 下的保护和逆向工程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Net 下的保护和逆向工程

Net 下的保护和逆向工程 这份刊物主要讨论一些微软.Net框架下流程行的保护方法,包括强名称(StrongName),名称混淆(name obfuscation),流程混淆(flow obfuscation),元数据加密(metadata encryption),加壳以及一些反分析手段。对于每一种保护,我也将会提供一些建议怎样去逆向它们。这份刊物并不是新手教程,它的目标是哪些已经有.Net编程和逆向经验的人。 说明 信不信由你,时至今日微软的.Net框架变得越来越受欢迎。自从2002年发布了第一个版本,现在我们能得到.net运行于windows上的4个主要版本,就是1.0版本,1.1版本,2.0版本以及3.0版本。随着.net框架自身的改进,保护技术也取得了很大的进步。 稍后,我将讨论一些.Net应用程序的保护方式,但是在我们深入主题之前,确保你理解哪些基本概念,例如汇编,模块,类型,成员,CLR(常见语言运行时,原文common language runtime),CTS(常见类型系统,原文common type system),JIT(及时编译,原文Just in-time compile)等等。对于哪些不知道没有保护的.Net程序是多么容易被逆向的人,请到查看逆向教程. 现在,让我们开始吧。 强名称 什么是强名称?你可以在MSDN(微软开发者网络)找到许许多多的文档。事实上,强名称并不是一种保护方法,而是一种验证。它是对PE文件做哈希计算,所以系统和应用程序能够检查哈希值从而得知文件是否是原始的哪个。如果文件被改动过,验证失败,则系统将会拒绝运行。 当.net刚诞生之时,强名称被广泛用来保护文件免于被打补丁。但是强名称很轻容易就被移除,替换,或者绕过。经典的方法就是用ildasm把PE文件反编译为il源代码,然后移除.assembly范围内的.publickey节,再用ilasm重编译为PE。搜索google你就明白为什么我说这种方法是经典。现在,我们有更方便的方式,直接使用工具。检查你将会找到强名称移除。或者,最暴力的一个,补丁系统动态链接库文件来使强名称检查总是成功。有时验证是由应用程序本身而不是系统。哪么你需要多做一些工作,补丁应用程序。 对于强名称我就不多说了,就此打住。更有趣的东西还在等着我们呢。但是对于菜鸟来说,再深入挖掘强名称会更有用些。只要搜索因特网资料库。 名称混淆 混淆可能是伴随.net而来的第一个正式保护方法,因为发行的Visual Studio附带了免费版DotFuscator。名称混淆是怎样保护你的应用程序的呢?众所周知,.net保存所有的名称(包括汇编,模块,方法,字段,OK,几乎一切名称)到元数据中,所有这些元数据被保存到PE文件里。使用反编译器(我更喜欢说反编译这个词语,而不是反汇编,因为和汇编相比而言msil本身是一种高级语言),你可以得到比传统的win32 exe/dll文件更多的信息。结果就是,它是如此的可读,就像读原始的源码一样。 名称混淆器把名称混淆为不可读字符(或者不可打印)字符。怎样混淆名称有好几个方向:转化为无意义字符串,转化为不可打印字符串,转化为相似字符串,转化为超长字符串,或者只是删除字符串。图1演示使用Reflector(.net下最流行的反编译器)反编译一个用商业混淆器保护的应用程序,当阅读这些代码的时候你有什么感觉?(图1也展示了流程混淆,这是下一节的主题) 图1使用reflector反编译被商业混淆器保护的应用程序 怎样对付名称混淆?你可以反混淆名称为有意义字符串,例如Class1,Method1,TextBox1。这儿有意义意味着更具有可读性,因为名称混淆是单向变形,我们不能变为原始的名称。Dis#有反混淆功能,让这个工作更轻松。但是大多时候,没有必要哪样做。代码都在哪了,仅仅是有点难读,我们需要的只是耐心,时间,以及一些技能(使用reflector的分析功能,等等)。 流程混淆 非常明显,名称混淆并不足够。为了让msil更难于阅读,人们发明了流程混淆。流程混淆意味着改变代码流程,但是不改变代码结果。流程混淆最少有两个功能:让msil更难阅读,让反编译到高级语言失败。第一个功能显而易见,至少逆向者不得不花时间在阅读垃圾代码上。第二个功能基于大多数反编译器能翻译msil为高级语言,例如C#,C++/CLI这个事实。逆向者发现高级语言比低级的msil更具可读性。 流程混淆器通过几种方式来实现。首先,插入虚假代码,例如计算一个说明,添加总是真或者假的布尔判断。其次,分隔源码为许多段,使用分支或者布尔分支来连接它们。再次,包装系统调用到新的类,改变所有的系统方法引用到新的类方法。最后,使用反编译器BUG。 一个简单的例子将会演示反编译器是多么的脆弱当它们试着变形

文档评论(0)

2017meng + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档