2019独角兽企业重金招聘Python工程师标准>>>

关于反编译器      从概念上讲,反编译器使用起来非常简单。他就是把编译器逆过来用:你给它 .class 文件,它还给你一个源代码文件。
      一些比较新的反编译器有精致的图形界面。但在一开始所举的例子中,我们将使用的是 Mocha,它是第一个公开的可利用的反编译器。在本文的最后,我会讨论一下在 GPL 下一个较新的反编译器。(请参阅参考资料,下载 Mocha 并获取 Java 反编译器的清单。)
       让我们假设在目录中有一个名为 Foo.class 的类文件。用 Mocha 对它进行反编译非常简单,只要键入以下命令:
$ java mocha.Decompiler Foo.class
      这会生成一个新的名为 Foo.mocha 的文件(Mocha 使用 Foo.mocha 这个名字以避免覆盖原文件的源代码)。这个新文件就是 Java 的源文件,并且假设一切顺利的话,您现在就能正常地编译它。只需把它重命名为 Foo.java 就可以开始了。

      但是这儿有个问题:如果在一些您已经有所改动的代码上运行 Mocha,您会注意到它生成的代码和源代码不是完全一样的。我举个例子,这样您能明白我的意思。清单 3 所示的原始源代码是来自一个名为 Foo.java 的测试程序。
清单 3. Foo.java 的一小部分原始源代码     private int member = 10;     public Foo() {       int local = returnInteger();       System.out.println( "foo constructor" );       priv( local );     }
以下是 Mocha 生成的代码
清单 4. Mocha 生成的 Foo.java 的源代码       private int member;       public Foo()       {           member = 10;           int local = returnInteger();           System.out.println("foo constructor");           priv(local);       }
      这两个代码片段的成员变量 member 被初始化为 10 的位置不同。在原始源代码中,它在与声明的同一行中被表示为一个初始值,而在被反编译后的源代码中,它在一个构造符中被表示为一条赋值语句。反编译后的代码告诉我们一些有关源代码被编译的方法;即它的初始值是作为在构造符中的赋值来被编译的。通过观察其反编译后的输出结果,您能了解到不少 Java 编译器的工作方法。
反编译是困难的:不断重复       虽然 Mocha 的确可以反汇编您的目标代码,但它不会总是成功的。由于困难重重,没有一个反编译器能够准确无误地翻译出源代码,而且每个反编译器处理它们在翻译过程中的漏洞的方式也不同。举例来说,Mocha 有时在输出准确的循环构造的结构方面有一些问题。如果真的这样,它会在最终输出中使用伪 goto 语句,如清单 5 所示。
清单 5. Mocha 不能准确地反编译           if (i1 == i3) goto 214 else 138;           j3 = getSegment(i3).getZOrder();           if (j1 != 1) goto 177 else 154;           if (j3 > k2 && (!k1 || j3 < j2)) goto 203 else 173;           expression 0           if (j3 < k2 && (!k1 || j3 > j2)) goto 203 else 196;           expression 0           if == goto 201           continue;           i2 = i3;
      撇开 Mocha 的问题不谈,反编译器在通常情况下还是能比较准确地翻译出源代码。一旦知道了某一反编译器的弱点,您可以手工分析和转换反编译后的代码,以使它们能较准确地符合原始源代码。随着反编译器正变得越来越出色,
      我们又碰到了另外一个问题:如果您不想让任何人能反编译您的代码,那该怎么办呢?小编在此友情推荐:爱加密安卓破解技术有哪些?如何防反编译,讲解的还不错:http://www.ijiami.cn/newsInfo?id=289&v=3

转载于:https://my.oschina.net/1590538xiaokai/blog/483646

关于如何使用反编译器,获取源码清单相关推荐

  1. 基于springboot+bootstrap+thymeleaf的物联网一站式宠物管理平台(领养、救助、商城)设计 毕业论文+用户手册+源码清单+项目源码及数据库文件

    下载:https://download.csdn.net/download/m0_66682818/77957797 项目介绍: 基于springboot+bootstrap+thymeleaf的物联 ...

  2. ***“出更”---获取源码的***

    ***"出更"---获取源码的*** Jack zhai  [说明]改编自Ed Skoudis的<******演习>中的案例  [介绍] 国华公司(非真实名称)是国际知 ...

  3. [转]ANT技术研究--与VSS整合自动获取源码进行编译

    .首先用MAVEN生成一个工程目录结构 (maven genapp): 2.生成ANT基本脚本 (maven ant:generate-build): 3.修改生成出来的build.xml,在其中加入 ...

  4. 从 sourcemap 中获取源码

    使用 paazmaya/shuji: Reverse engineering JavaScript and CSS sources from sourcemaps 可以从 sourcemap 中获取源 ...

  5. Java中资源文件获取源码浅析

    Java中资源文件获取源码浅析 文章目录 Java中资源文件获取源码浅析 JDK11 Class.getResource(String) Class.getClassLoader().getResou ...

  6. Yocto系列讲解[技巧篇]47 - bb文件中如何获取源码或指定本地目录

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...

  7. 关于微信小程序反编译获取源码

    记录一下微信小程序如果反编译获取源码 需要用到的工具: 1.获取root权限的安卓手机,或者直接用模拟器(推荐用网易mumu模拟器,不推荐用夜神) mumu模拟器下载地址:   http://mumu ...

  8. cloudreve win10 解析域名_Cloudreve 云盘直链获取源码

    Cloudreve 云盘直链获取源码 @虐ふ1999.版本 2 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 调试输出 (获取Could ...

  9. vue代码可以反编译吗_避免小程序被反编译获取源码(转载)

    原地址:https://www.cnblogs.com/taltao/p/10082084.html 众所周知,微信小程序的代码安全性很弱,很容易被别人反编译获取源码.我自己的小程序也被别人反编译拿到 ...

最新文章

  1. 关于 Caused by: java.lang.NoClassDefFoundError: com/alipay/api/AlipayApiException 解决办法
  2. 华数传媒牵手阿里云计算共建媒体云平台
  3. jsp实现简单的分页
  4. Java GC系列(1):Java垃圾回收简介
  5. ttreeview 只展开一层节点_K8S工作节点的演变:由Docker到CRI-O
  6. nodejs异常处理
  7. 在sql server 发生未指定的错误_一条sql查询是怎么执行的?
  8. python初学小结三:文件、集合、函数、变量等
  9. PHP 使用rabbitmq 入门教程
  10. 怎么设置计算机语言中文,Windows10 IE11浏览器怎么把默认语言设置为中文
  11. SuperMap iDesktop常见问题解答集锦 (二)
  12. 【C语言】初识C语言(上篇)
  13. 大数据学长面试之boss直聘面试题
  14. 斯尔福化学实验室设计规划环境及建设要求
  15. 【多图】二进制的起源,从01到创造天地万物
  16. 源码资本宣布完成人民币四期38亿新基金募集
  17. Armeria 小试牛刀
  18. SCA(successive convex approximation)学习
  19. css中按钮变色,CSS控制按钮变色(有图有真相)
  20. p2p 企业信贷 UML 跨行清算

热门文章

  1. linux怎么在win上安装mysql_CentOS下安装MySQL及Windows下使用Navicat for MySQL连接
  2. linux egrep新添的正则表达式元字符
  3. Set的常用实现类HashSet和TreeSet
  4. exit(0) exit(1) return() 3个的区别
  5. Safair css hack
  6. 企业绩效管理系统之平衡记分卡
  7. Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML
  8. 【算法21】从1到n的正数中1的出现次数
  9. Mysql字段数据类型:char与varchar的区别
  10. 组件对象模型:COM