关于如何使用反编译器,获取源码清单
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
关于如何使用反编译器,获取源码清单相关推荐
- 基于springboot+bootstrap+thymeleaf的物联网一站式宠物管理平台(领养、救助、商城)设计 毕业论文+用户手册+源码清单+项目源码及数据库文件
下载:https://download.csdn.net/download/m0_66682818/77957797 项目介绍: 基于springboot+bootstrap+thymeleaf的物联 ...
- ***“出更”---获取源码的***
***"出更"---获取源码的*** Jack zhai [说明]改编自Ed Skoudis的<******演习>中的案例 [介绍] 国华公司(非真实名称)是国际知 ...
- [转]ANT技术研究--与VSS整合自动获取源码进行编译
.首先用MAVEN生成一个工程目录结构 (maven genapp): 2.生成ANT基本脚本 (maven ant:generate-build): 3.修改生成出来的build.xml,在其中加入 ...
- 从 sourcemap 中获取源码
使用 paazmaya/shuji: Reverse engineering JavaScript and CSS sources from sourcemaps 可以从 sourcemap 中获取源 ...
- Java中资源文件获取源码浅析
Java中资源文件获取源码浅析 文章目录 Java中资源文件获取源码浅析 JDK11 Class.getResource(String) Class.getClassLoader().getResou ...
- Yocto系列讲解[技巧篇]47 - bb文件中如何获取源码或指定本地目录
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...
- 关于微信小程序反编译获取源码
记录一下微信小程序如果反编译获取源码 需要用到的工具: 1.获取root权限的安卓手机,或者直接用模拟器(推荐用网易mumu模拟器,不推荐用夜神) mumu模拟器下载地址: http://mumu ...
- cloudreve win10 解析域名_Cloudreve 云盘直链获取源码
Cloudreve 云盘直链获取源码 @虐ふ1999.版本 2 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 调试输出 (获取Could ...
- vue代码可以反编译吗_避免小程序被反编译获取源码(转载)
原地址:https://www.cnblogs.com/taltao/p/10082084.html 众所周知,微信小程序的代码安全性很弱,很容易被别人反编译获取源码.我自己的小程序也被别人反编译拿到 ...
最新文章
- 关于 Caused by: java.lang.NoClassDefFoundError: com/alipay/api/AlipayApiException 解决办法
- 华数传媒牵手阿里云计算共建媒体云平台
- jsp实现简单的分页
- Java GC系列(1):Java垃圾回收简介
- ttreeview 只展开一层节点_K8S工作节点的演变:由Docker到CRI-O
- nodejs异常处理
- 在sql server 发生未指定的错误_一条sql查询是怎么执行的?
- python初学小结三:文件、集合、函数、变量等
- PHP 使用rabbitmq 入门教程
- 怎么设置计算机语言中文,Windows10 IE11浏览器怎么把默认语言设置为中文
- SuperMap iDesktop常见问题解答集锦 (二)
- 【C语言】初识C语言(上篇)
- 大数据学长面试之boss直聘面试题
- 斯尔福化学实验室设计规划环境及建设要求
- 【多图】二进制的起源,从01到创造天地万物
- 源码资本宣布完成人民币四期38亿新基金募集
- Armeria 小试牛刀
- SCA(successive convex approximation)学习
- css中按钮变色,CSS控制按钮变色(有图有真相)
- p2p 企业信贷 UML 跨行清算
热门文章
- linux怎么在win上安装mysql_CentOS下安装MySQL及Windows下使用Navicat for MySQL连接
- linux egrep新添的正则表达式元字符
- Set的常用实现类HashSet和TreeSet
- exit(0) exit(1) return() 3个的区别
- Safair css hack
- 企业绩效管理系统之平衡记分卡
- Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML
- 【算法21】从1到n的正数中1的出现次数
- Mysql字段数据类型:char与varchar的区别
- 组件对象模型:COM