1 什么是编译和反编译
相信在大学学习过编译原理这门课程的小伙伴都看过这段话,“编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序,翻译为计算机能解读、运行的低级语言的程序,也就是可执行文件。那么反之,我们亦可以通过低级语言进行反向工程,获取其源代码。这个过程,就叫做反编译。”
简单来说,
编译:人读的 > 机器读的;
反编译:机器读的 > 人读的。
我们说Java编译,一般是将java文件转换成class文件。那么反编译就是值将class文件转换成java文件。
java中的编译器:javac是jdk中的JAVA语言编译器,使用javac命令可以将以.java结尾的源文件编译成以.class结尾的能够由jvm识别的字节码。
那么如何进行反编译呢?这就需要借助工具了,接下来我们就来讲讲几种常用的反编译工具。
2 常用的反编译工具
jd-gui:将打成jar包的class文件转化成的java文件,即源码文件。
dex2jar:将dex文件转换为class文件,然后class文件打成jar包。
apktool:编译或者反编译apk文件。
AXMLPrinter2:反编译apk的xxx.xml文件。
在线反编译工具:decompiler,大一统,支持多种文件反编译。
注:dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。当java程序编译成class后,还需要使用dex工具将所有的class文件整合到一个dex文件。
1、jd-gui
jd-gui下载:https://github.com/java-decompiler/jd-gui/releases/download/v1.6.6/jd-gui-windows-1.6.6.zip
将zip包解压后双击jd-gui.exe即可打开jd-gui。
可直接将jar包直接拖拽到jd-gui页面,即可查看反编译后的源代码。
2、dex2jar
dex2jar下载:
https://sourceforge.net/projects/dex2jar/
dex2jar使用:
cmd下进入到d2j-dex2jar.bat目录,
执行:d2j-dex2jar.bat classes.dex,
(将apk后缀名改为zip或者rar再解压即可查看classes.dex)
得到classes-dex2jar.jar
强制覆盖:d2j-dex2jar.bat ../classes.dex --force。
将classes-dex2jar.jar拖拽到jd-gui即可查看源码。
3、apktool
apltool.jar下载:https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.6.0.jar,
将jar包重命名为apktool.jar。
apltool.bat下载:https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat ,
将脚本另存为apktool.bat,和apktool.jar放同一个文件夹下。
apktool是否安装成功:
apktool --version。
apktool的使用:
cmd下进入到apktool目录,
反编译:apktool d xxx.apk;
编译打包apk:apktool b xxx。
设置编译后的文件输出到固定文件夹:
apktool d xxx.apk -o (destination)。
覆盖原文件:apktool d -f xxx.apk。
如果报错非法Dex,比如有些apk的assets目录下有加密后的Dex文件,添加–only-main-classes参数即可:
apktool d -f xxx.apk -only-main-classes。
用apktool反编译apk之后的目录:
4、AXMLPrinter2
下载静态分析工具之-AXMLPrinter2.jar,进入cmd(AXMLPrinter2.jar所在路径),
AXMLPrinter2的使用:
cmd下进入到AXMLPrinter2.jar目录,
1、执行:java -jar AXMLPrinter2.jar AndroidManifest.xml>AndroidManifest.txt
(注:可将需要解析的xml放到和jar同级目录下)
2、执行:java -jar AXMLPrinter2.jar AndroidManifest.xml
(直接在控制台查看AndroidManifest.xml文件内容)
源AndroidManifest.xml内容
(将apk后缀名改为zip或者rar再解压即可查看AndroidManifest.xml)。
反编译AndroidManifest.xml文件后AndroidManifest.xml内容
5、在线反编译工具
https://www.decompiler.com/
直接将文件上传上去,即可查看反编译后的代码,非常方便。
3 总结
为什么需要反编译呢?假设被人给我们提供一个jar包或者apk包,我们可以通过反编译查看其源代码来分析代码或者定位问题。
感兴趣的小伙伴可以跟着教程实际操作一波,也许哪天就用到了呢,多去了解些基础知识准没错。