发布了一个自己开发的java反编译+UI辅助工具ClassExplorer

taolei 2009-09-14 09:02:38
刚发布了一个java反编译+UI辅助工具ClassExplorer

在这里下载

反编译引擎是自己写的,一次发布到公共网络上,
UI辅助工具包含很多方便的功能,可以直接查看jar文件、可以模糊查找类名、查看继承关系、查找引用、查找字符串等。
欢迎大家去试用一下。


...全文
281 点赞 收藏 21
写回复
21 条回复
wfiskz 2012年09月12日
我反编译出来很多不认识的东西,例如:goto#25,goto#17的东西。我们公司让我反编译一个apk,能不能告诉我改怎么弄啊?
回复 点赞
taolei 2009年09月16日
别人推荐了一个反编译工具,反编译效果很不错,推荐大家试试
http://java.decompiler.free.fr/
回复 点赞
lxxzhy 2009年09月15日
[Quote=引用 17 楼 taolei 的回复:]
The JavaTM Virtual Machine Specification
[/Quote]

非常感谢.
回复 点赞
daisycool 2009年09月15日
顶一下,感谢楼主的分享
回复 点赞
taolei 2009年09月15日
The JavaTM Virtual Machine Specification
回复 点赞
lxxzhy 2009年09月15日
嗯,学习.

但是byte code很难读懂,有没有什么参考资料.
回复 点赞
taolei 2009年09月14日
反编译Exception也算难了,其实是我当初写分析程序的时候没有把所有编译器可能编译的方式考虑周全。
对我来说,最难的是循环(for/while/do)的分析,尤其是嵌套循环再加上if语句,class里的代码就是跳来跳去,很难准确的分析出java源代码。

你可以用JDK 里的javap -c看看class的byte code是什么样子的。
回复 点赞
taolei 2009年09月14日
呵呵,我的反编译工具的反编译能里确实不如jad等其他工具。
其中反编译引擎是几年前写的,现在想改也不是那么容易的事情了。

你上面的程序以多出一个System.out.println("finally");确实是我的反编译引擎能力不足。
原因是这样的:
现在的编译器(Eclipse自带的)里有个选项是Inline finally blocks。编译后的java class把每一个可能运行到的分支直接插入finally里的代码。有多少个分支就有多少份。上面的程序有一个异常分支和一个正常分支,就有两个finally代码。当初分析代码的时候没有考虑过这种情况。

回复 点赞
lxxzhy 2009年09月14日
jad貌似连反编译Exception都有问题,也不强到哪里去啊.

再请教多一个问题,为什么反编译Exception这么难呢?
回复 点赞
taolei 2009年09月14日
反编译原理?
1、解析java class的binary code
2、根据这些binary code猜测可能是怎样的java源代码编译生成的。
由于sun 对java class编译有相应的规范,所以反编译java class相对反编译其他语言程序还是容易得多的。但毕竟是猜测出的源代码,不太可能做到完全准确的反编译。jad等工具虽然比我这个强,但同样不能完全反编译。
这类工具只是用来学习研究的,要反编译出来的程序完全符合java规范并可再编译成class是不现实的。

回复 点赞
lxxzhy 2009年09月14日
public class CommonTesting{


public static void main(String[] args){
try {
int a = Integer.parseInt("1fs");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("finally");
}
}

}

我写了一个类来测试能否反编译Exception,代码如上,反编译代码如下:
public class CommonTesting
{
public CommonTesting()
{
super();
return;
}

public static void main(String[] args)
{
try
{
int a = Integer.parseInt("1fs");
}

catch(Exception e)
{
e.printStackTrace();
}

finally
{
System.out.println("finally");
}

System.out.println("finally");
return;
}

}

为什么会多了一行System.out.println("finally");呢?
回复 点赞
lxxzhy 2009年09月14日
我不是在eclipse里面操作的,只不过我之前是在file system tag下面操作,所以不行,加到project里面就行了.

这个东西很有用喔.能不能稍微解释下原理(不过可能比较复杂吧)
回复 点赞
taolei 2009年09月14日
你是说在你的IDE (Eclipse)里还是在ClassExplorer工具里?
IDE里能看到JRE/JDK的源代码那是因为JDK自带源代码的,通常是JDK目录下的src.zip
其他的jar也是可以配置源文件路径的(如果有)

在ClassExplorer里,你选中XXXXX.class点击鼠标右键,弹出菜单里有"View Decompiled Source"。
回复 点赞
lxxzhy 2009年09月14日
行了,原来要先加到lib里面.

非常不错.
回复 点赞
lxxzhy 2009年09月14日
怎么我看jre的class文件就能反编译成源代码,看jar或者自己其它的class文件却不能.

注都是同样的操作,双击class或jar文件一直展开到不能展开.
回复 点赞
taolei 2009年09月14日
classexplorer.jar里有一个classexplorer.htm里面有一些简单的介绍,
运行程序后按F1也可以看到这个页面。

反编译的源代码是不需要任何调试信息的。
回复 点赞
奋斗并快乐着 2009年09月14日
不错
回复 点赞
taolei 2009年09月14日
这么快就掉下去了,下载过的朋友帮忙顶一下啊!
回复 点赞
lxxzhy 2009年09月14日
是不是编译的时候没有加上debug信息就看不到源代码.
回复 点赞
lxxzhy 2009年09月14日
怎么看源代码?
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告