作者因最近分析一些JAVA程序 对JAVA的反编译进行了一番了解 下面将我所了解的情况作以下介绍 希望对JAVA爱好者有所帮助 JAVA是采用一种称做 字节编码 的程序结构 分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型 无论哪种结构 一旦用JAVAC 命令编译后 均变成后缀为CLASS的同名可执行文件 这种文件是不可阅读的代码 经查阅了SUN公司的JDK(JDK )文档资料后 我找到了一个据称是可反编译JAVA的JAVAP文件(EXE) 这个文件位于JDKBIN 下面 经按说明使用后 感到失望 原来这个 反编译 仅可反编译出JAVA程序的数据区(定义) 若干方法和类的引用等 这里我用了一个简单例子来说明问题 JAVA的源程序hello_java java如下 import java applet *;import java awt *;public class hello_java extends Applet{public void paint(Graphics g){g drawString( Hello Java!n );}} 经用反编译命令 javap c package public private hello_java hello java 得到的反编译结果(hello java)如下 (有关javap命令的选择参数请见其使用说明 这里 c表示选择了反编译)Compiled from hello_java javapublic synchronized class hello_java extends java applet Applet /* ACC_SUPER bit set */{public void paint(java awt Graphics);public hello_java();Method void paint(java awt Graphics) aload_ ldc # bipush bipush invokevirtual # returnMethod hello_java() aload_ invokespecial # ()V return}从上述结果不难看出该反编译未能将源程序全译出来 像语句g drawString( Hello Java!n ); 就没有 随着程序量增加 未能编译的JAVA语句还会更多 所以这个反编译程序仅能起个参考作用 幸亏有了INTERNET 笔者通过YAHOO很快找到了一个JAVA反编译 自由软件 (SHAREWARE) 这个软件叫MOCHA 据说是一位 来岁的加拿大的研究生所完成 仅是个 ? 版 原因是这位叫做H P VAN VLIET的小伙子患癌逝世了 十分可惜呀!经使用MOCHA反编译软件 感到这个软件十分好用 笔者试反编译多个JAVA程序 均得到很好的结果 这里给出如何使用这个软件 首先 用WINZIP等将 mocha b zip 解开得到 mocha zip 文件 mocha zip 不须再解开 这个包内包括了反编译的类文件 只需将其拷贝到JDK所在的目录下 如 c:jdkbin 此外 须设置路径 SET CLASSPATH=c:myclasses;c:jdkbinmocha zipMOCHA用法 java mocha Depiler [ v] [ o] Class class Class class java 调用Java虚拟机 mocha Depiler 指示要进行JAVA反编译 v 选择详细输出 o 选写入已有的 mocha 文件 ClassX class 指出要反编译类名注意 不需给出输出的JAVA文件名 因为MOCHA自动产生一个与CLASS同名但扩展名为MOCHA的JAVA源文件 对于上例 可用命令 java mocha Depiler [ v] [ o] hello_java class得到的源文件 /* Depiled by Mocha from hello_java class *//* Originally piled from hello_java java */import java applet Applet;import java awt Graphics;public synchronized class hello_java extends Applet{public void paint(Graphics g){g drawString( Hello Java!n );}public hello_java(){}}我们不难发现 此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最大为 K的源文件 均取得成功 在此 笔者向英年早逝的VLIET表示敬意 感谢他给我们留下这个工具软件 如读者下载MOCHA有困难 可给笔者来电子邮件 笔者可将MOCHA寄去 参考文献 ) ) ) ) lishixinzhi/Article/program/Java/Javascript/201311/25331
创新互联建站主打移动网站、成都做网站、网站制作、网站改版、网络推广、网站维护、申请域名、等互联网信息服务,为各行业提供服务。在技术实力的保障下,我们为客户承诺稳定,放心的服务,根据网站的内容与功能再决定采用什么样的设计。最后,要实现符合网站需求的内容、功能与设计,我们还会规划稳定安全的技术方案做保障。
1.下载反编译工具
需要下载四个工具:dex2jar、JD-GUI、apktool、apktool-install-windows-r05-ibot
dex2jar:将apk中的classes.dex转化成Jar文件。
JD-GUI:反编译工具,可以直接查看Jar包的源代码。
apktool:反编译工具,通过反编译APK中XML文件,直接可以查看。
apktool-install-windows-r05-ibot:辅助windows批处理工具。
2.解压缩APK包
apk文件也是一种常见的zip,常用的压缩软件就可轻松地解压apk文件。用压缩软件将apk文件中的文件解压到一个文件夹中,得到APK中的资源包括XML文件和classes.dex文件,classes.dex就是java文件编译再通过dx工具打包而成的。
3.反编译dex文件
解压apk文件后,你会发现res目录的图片没有加密,但java源码编译成了一个classes.dex文件,无法用普通的反编译class文件的方法来处理,dex2jar可以将dex文件转换成普通的jar包。
解压下载的dex2jar,把解压后的文件夹放到系统盘跟目录中并把这个目录加到系统path变量中,就可以直接用:dex2jar.bat或dex2jar.sh转换dex文件了。
DOS行命令如下:dex2jar.bat xx\classes.dex(xx是classes.dex文件所在的路径)。
将在同目录得到普通jar包:classes_dex2jar.jar,就可以用处理普通jar包的方法来反编译这个jar包得到原文件。
4.反编译jar包
得到jar包后,下载自已喜欢的反编译工具,推荐使用JD-GUI,有比较简单的图形界面,可以反编译单个class文件,也可以反编译jar包,比较方便。
打开压缩文件JD-GUI,运行jd-gui.exe,打开上面生成的jar包,即可看到源代码了。
5.反编译xml文件
打开解压的res\layout目录,有很多xml文件,如果你想看下作者是如何设计界面的,你会很失望,因为你看到的是一大堆乱码!这个时候我们需要用到的是apktool。
具体操作方法:将下载的apktool和apktool-install-windows-r05-ibot两个包解压到同一个文件夹下,这个文件夹有三个文件:aapt.exe,apktool.bat,apktool.jar。把这个文件夹也放到系统盘的根目录中并把这个目录加到path变量中。以HelloWord.apk为例:
在DOS命令行中输入:apktool d xx\HelloWord.apk HelloWord得到HelloWord文件夹,此文件夹中的xml文件就是编译好的可以正常查看的文件。
这样就得到了可以得到编译的源码和XML资源。
注意:文件的路径中最好不要出现中文!
java代码的编译,就是你写完代码,java编译器把它编译成java虚拟机认识的代码,然后再由虚拟机执行它。反编译就是反过来,当然这不是java虚拟机干的事儿,是你找反编译工具干的事儿,把编译过的代码反编译成人看得懂的源代码。
如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的制作方面。1999年在美国对JAVA程序员的需求量首次超过C++!
作者因最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助。
JAVA是采用一种称做“字节编码”的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC 命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。
经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于\JDK\BIN\ 下面,经按说明使用后,感到失望,原来这个“反编译”仅可反编译出JAVA程序的数据区(定义)、若干方法和类的引用等。
这里我用了一个简单例子来说明问题。
JAVA的源程序hello_java.java如下:
import java.applet.*;
import java.awt.*;
public class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n",20,20);
}
}
经用反编译命令:javap -c -package -public -private hello_java hello.java
得到的反编译结果(hello.java)如下:(有关javap命令的选择参数请见其使用说明,这里-c表示选择了反编译)
Compiled from hello_java.java
public synchronized class hello_java extends java.applet.Applet
/* ACC_SUPER bit set */
{
public void paint(java.awt.Graphics);
public hello_java();
Method void paint(java.awt.Graphics)
0 aload_1
1 ldc #1
3 bipush 20
5 bipush 20
7 invokevirtual #6
10 return
Method hello_java()
0 aload_0
1 invokespecial #5 ()V
4 return
}
其实这个 我只是了解一点 我知道多少说多少吧 class文件是java自己内部通过程序员写的java文件编译出来的 class文件 人是看不懂的 只有机器能识别 java文件是人看得懂的 因为java文件最终是要机器使用 所以 就要编译成机器能识别的文件 其实java文件中有些是要用到底层的东西的 这些在java文件中是看不到的 只有在class文件中才能看见 既然class文件可以看得见 我们有看不懂 所以 我们就用反编译器把class文件反编译成我们看得懂的文件 这样有些在java文件中不会有的代码在反编译后的class文件中就会看得到 其实大部分class文件反编译后的代码和java文件的代码都是一样的 区别只是少数
就是有些R资源只显示ID号,还有一些没用的代码也反编译出来了