Java反编译工具CFR,Procyon简介
Java反编译工具有很多,个人觉得使用最方便的是jd-gui,当然jad也不错,jd-gui主要提供了图形界面,操作起来很方便,但是jd-gui很久没有更新了,java 7出来很久了,jd-gui在反编译java 7的class文件时候会遇到部分语法不支持的问题,下面我举几个例子,我使用的是jd-gui035。
这是java7支持的在switch中使用String,下面可以看jd-gui反编译的结果:
反编译结果看起来有点绕,当然结果是一样的,只是代码意图不直接。
下面看下java 7的资源自动关闭:
jd-gui反编译的结果为:
我使用的这个jd-gui反编译报错,可能是我的版本不是最新的。
再看下java 7的语法糖功能:
jd-gui反编译结果:
反编译结果正确,综上,jd-gui对java 7的资源自动关闭语法不支持。
下面我介绍2个支持java 7语法的反编译工具,cfr和procyon,可能大家听说过,我会做个实际例子看下怎么用。
(一)cfr简介
cfr官网链接:
http://www.benf.org/other/cfr/
- CFR will decompile modern Java features - Java 8 lambdas (pre and post Java beta 103 changes), Java 7 String switches etc, but is written entirely in Java 6
这是官网的描述,Jar在附件提供下载。
语法:
反编译单个class文件:
- java -jar cfr_0_59.jar SwitchTest.class
反编译整个Jar包:
- java -jar cfr_0_61.jar java7_jar.jar --outputdir D:/Java/tmp
下面是具体使用,仍以上面的class为例,使用cfr进行反编译:
这个和jd-gui结果一样,可以看到java7的语法糖只是显示处理好看些,反编译出来还是原始的数据类型。
cfr对java 7的自动关闭语法反编译的结果是显式在finally里面添加close方法。
cfr反编译Switch String使用了Goto 语句,在Goto中使用equals字符串比较,比jd-gui反编译的结果稍微好看些。
可以看出cfr使用还是很方便的。
(二)procyon简介
procyon官网链接:
https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler
使用语法:
帮助
- java -jar decompiler.jar
反编译单个class文件
- java -jar procyon-decompiler-0.5.24.jar AutoCloseableExample.class
反编译整个Jar包
- java -jar procyon-decompiler.jar -jar myJar.jar -o out
提醒:
- Java 7 is required to run
procyon需要java 7环境。
下面仍以上面的class为例,看procyon反编译的结果
和cfr一样,procyon反编译显式的在finally中关闭资源。
procyon反编译java 7语法糖显示原始数据类型。
可以看出procyon对Switch String的反编译结果最直接。
procyon反编译Jar也是支持的。
反编译工具还有 Krakatau,使用了Python 2.7编译,个人电脑是Python 3.3,运行不了,就没测试了,感兴趣的朋友可以自己测试下。
链接地址:
- https://github.com/Storyyeller/Krakatau
如果需要反编译java 7的class,个人推荐使用procyon,其次是cfr。
文章为原创,转载请注明出处。写的不好的地方请指出。如果有需要但下载不了附件,请发邮件到1329186624@qq.com,我会把附件cfr和procyon发给你,谢谢。
全文完。
from: http://53873039oycg.iteye.com/blog/2015192
Java反编译工具CFR,Procyon简介的更多相关文章
- java反编译工具cfr
http://www.benf.org/other/cfr/ 下载反编译工具 @echo off SET home=%cd% rem 指定存放jar包的目录 SET jar_dir=%home%\ja ...
- 转:介绍几个著名的实用的Java反编译工具,提供下载
from :http://www.glorze.com/219.html 反编译 众所周知,我们将源代码进行编译,生成可执行的程序或者容器发布包,这个将代码转换的过程就是编译的过程,而反编译就是将这些 ...
- Java 反编译工具哪家强?对比分析瞧一瞧
前言 Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Class 字节码文件的生成有着严格的要求,如果你非常熟悉 Java 虚拟机规范,了解 Class 字 ...
- java反编译工具JD-GUI
这款java反编译工具是由C++写的,是一款免费的非商业用途的软件,(Xjad也不错,但是不支持jar反编译) 一.支持众多.class反编译工具 二.支持反编译jar
- 7 款开源 Java 反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
- java反编译工具
由于JAVA语言安全性高.代码优化.跨平台等特性,从1995年5月由SUN公司发布后,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位. 不过,JAVA最突出的跨平台优势使得它 ...
- java反编译工具(XJad)
java反编译工具(XJad) 2.2 绿色版 http://www.cr173.com/soft/35032.html Demo.class ---> Demo.java
- 7款开源Java反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
- 推荐一款非常好用的java反编译工具(转)
源: 推荐一款非常好用的java反编译工具
随机推荐
- 关于spark standalone模式下的executor问题
1.spark standalone模式下,worker与executor是一一对应的. 2.如果想要多个worker,那么需要修改spark-env的SPARK_WORKER_INSTANCES为2 ...
- H5判断网络状态
1.判断网络连接的网络状态 if (navigator.onLine) { alert('online')} else { alert('offline');} 想要监听浏览器的联网状态, 使用win ...
- 010.KVM虚机冷迁移
一 实验环境 原虚机名称:vm01-centos6.8 原虚机所在宿主机:kvm-host-2 迁移后虚机名称:vm01-cloud-centos6.8 迁移后虚机所在宿主机:kvm-host-2 二 ...
- Redis创建高可用集群教程【Windows环境】
模仿的过程中,加入自己的思考和理解,也会有进步和收获. 在这个互联网时代,在高并发和高流量可能随时爆发的情况下,单机版的系统或者单机版的应用已经无法生存,越来越多的应用开始支持集群,支持分布式部署了. ...
- [ 转载 ] get和post的区别
GET和POST两种基本请求方法的区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过r ...
- 【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4981 Solved: 1941 Description ...
- EditText 数字范围 检查string 是不是数字
public static boolean isNumeric00(String str){ try{ Integer.parseInt(str); return true; }catch(Numbe ...
- BZOJ2976 : [Poi2002]出圈游戏
首先模拟一遍得到n个同余方程,然后用扩展欧几里得求出最小的可行解即可,时间复杂度$O(n^2)$. #include<cstdio> #define N 30 int n,i,j,k,x, ...
- Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem 贪心
D. Dasha and Very Difficult Problem 题目连接: http://codeforces.com/contest/761/problem/D Description Da ...
- 没用过的函数 GetHomePath - 获取用户程序数据目录
uses System.IOUtils; procedure TForm1.FormCreate(Sender: TObject); var S: string; begin { 三种方法结果一致: ...