linux系统上如何反编译.class文件

问题描述:

很多时候,我们开发都是在windows环境进行的,因此,习惯了使用鼠标,习惯了很方便的浏览,但是,生产环境并不是这样的。很多时候生产环境只有冷冷的terminal界面(字符界面)。这给我们带来了很多问题,其中一个就是,有时候生产上需要验证java程序版本是否正确,我们应该怎么做呢?可以比较文件的大小,可以比较文件的MD5,但最可靠的方法,还是把.class文件反编译,查看内容是否正确。今天我要解决的就是如何在linux/Unix上反编译.class文件。

问题解决:

 在windows环境下面经常用到的反编译工具是jad-gui,那么这个工具有没有linux版本?答案肯定是的,他在这个地方:

https://varaneckas.com/jad/

根据cpu类型,我们选择了。

Jad 1.5.8e for Linux on Intel platform

直接上传到服务器,使用

gzip -d jad158e.linux.intel.zip

解压会得到jad可执行文件和readme.txt文件。为了方便使用,可以把jad拷贝到PATH包含的目录下面。

jad命令的参数如下:

有时候,我们只需要反编译一个文件,那么可以使用命令:

jad [class文件名]

反编译。

通常我们会碰到反编译jar的需求,jad不支持直接反编译jar包,需要分两步实现,第一步,jar解压缩,可以创建一个src目录,使用

jar -xvf [jar文件]

然后,使用通配符解压所有class文件。

jad -r -ff -s java com/**/*.class

那么会生成同名的java文件,并且目录跟package是一致的。

接着删除原来的class文件:

find . -name "*.class" -type f | xargs rm -f

其实对于多语言国家来说,现在class文件反编译还是没有完成,譬如说中文国家,打开java文件,原来的中文全部变成了\u开头的叫unicode escape的ascii文本,这时候,可以使用jdk自带的工具修改一下:

find . -name "*.java" -type f | xargs -I {} native2ascii -reverse -encoding utf8 {} {}

那么,所有的\u开头表示的中文都会变成utf8编码了。至此,jar反编译完成了。

当然了,使用shell脚本,jar,jad和native2ascii这几个工具,可以写出更方便的反编译脚本。

笔者就写了个工具,能够填入项目中一个类的类名,就能够显示这个类的路径和反编译后的源码,包括jar包中的类也可以自动显示jar包,以及在jar包中的路径和反编译的结果。

后续:

另外还有一个工具也是挺好用的

http://www.benf.org/other/cfr/

你可能感兴趣的:(linux系统上如何反编译.class文件)