首先apk不能被代码混淆(或未经编译优化),如果混淆了,反编译出来的代号还是看不懂,
当然,在你没反编译出来之前,你也不知道有没有混淆。
网上各种反编译工具,眼花缭乱,本文是个人对这些工作做的一个简单的梳理。
最靠谱也是最原始的方法就是用下面的三个工具:apktool + dex2jar + jd-gui
其他的工具大部分都是衍生自这三个工具,或者说对这三个工具的包装。
apktool
It is a tool for reverse engineering 3rd party, closed, binary Android apps. It can decode resources to nearly original form
and rebuild them after making some modifications; it makes possible to debug smali code step by step.
Also it makes working with app easier because of project-like files structure
and automation of some repetitive tasks like building apk, etc.
反编译apk,输出资源文件和源码的smali文件:
用法:D:\apktool.bat F:\workspace\tmp\test.apk F:workspace\tmp\out
dex2jar
http://code.google.com/p/dex2jar/ //官方功能介绍
dex2jar contains following compment
- dex-reader is designed to read the Dalvik Executable (.dex/.odex) format. It has a light weight API similar with ASM. An example here
- dex-translator is designed to do the convert job. It reads the dex instruction to dex-ir format, after some optimize, convert to ASM format.
- dex-ir used by dex-translator, is designed to represent the dex instruction
- dex-tools tools to work with .class files. here are examples:
- d2j-smali
[To be published]
disassemble dex to smali files and assemble dex from smali files. different implementation to smali/baksmali, same syntax, but we support escape in type desc "Lcom/dex2jar\t\u1234;" - dex-writer
[To be published]
write dex same way as dex-reader.
到官网下载最新的版本,直接反编译apk,apk文件名不能包含中文名称,新版本的aex2jar不用把apk换成zip解压了,直接反编译:
生产jar,然后用jd打开这个文件,在jd中可以查看代码,也可以导出为java文件
使用 dex2jar 来生成 .jar 文件. dex2jar会在someApk.apk所在目录下生成一个someApk_dex2jar.jar文件.
用法:
linux sh /home/dex2jar-version/dex2jar.sh /home/someApk.apk
windows C:\dex2jar-version\dex2jar.bat someApk.apk
注意:dex2jar只能生成jar文件,无法生成资源文件
Levin:apktool和dex2jar都能生成smali代码,两者有何异同?个人认为,两者都是将.dex文件即DalvikExecutable文件
反编译成smali代码,不同的是,apktool输出的是一个一个.smali代码文件,这种单个的.smali代码文件,
jd-gui打不开(我还没找到什么工具能打开),而dex2jar生成的为打包成*.jar格式的smali源码包,
这种jar格式的smali源码包,可以通过jd-gui转换为java代码。
jd-gui
http://jd.benow.ca///官方功能介绍、官方下载
Java Decompiler graphical UI
JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files.
You can browse the reconstructed source code with the JD-GUI for instant access to methods and fields.
前文说过,其他的工具大部分都是衍生自这三个工具,或者说对这三个工具的包装,你可以看到其安装目录下有apktool等工具
下面对这些工具做个罗列,和本人的使用心得:
APKMultiTool:国外团队开发,Console交互界面,用来反编译apk,修改,并重新签名打包。只能反编译出资源文件,不能反编译出java代码
ApkDec: android开发社区www.juapk.com开发,图形界面,可以反编译出资源文件盒smali的jar包,
ApkDec: android开发社区www.juapk.com开发,图形界面,可以反编译出资源文件盒smali的jar包,
目前只有ApkDec-Release-0.1,win32版本,无法在64为机器上运行。找官方团队索要,无果。
Dodo APKTools:国产,只能反编译出一个一个的smali文件
Smali2Java:国产,这款反编译软件比较牛逼,能过将smali文件高保真还原成java文件。比jd-gui更上一层楼
http://www.hensence.com/cn/smali2java/ //官方功能介绍、官方下载
smali2java是一个将smali代码反编译成java代码的工具。
什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将Android应用程序包(apk或jar)反编译为smali代码。
Levin:jd-gui可以反编译smali代码,说明smali代码,类似于.class代码。
smali2java的反编译过程是:dex字节码-->smali代码-->java代码
smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。
什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将Android应用程序包(apk或jar)反编译为smali代码。
Levin:jd-gui可以反编译smali代码,说明smali代码,类似于.class代码。
smali2java的反编译过程是:dex字节码-->smali代码-->java代码
smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。
总结:如果你即想反编译出资源,又想反编译出java源码,本人推荐如下最优方式(省时省力,效果好):
step1:使用apktool,反编译出所有的资源文件
step2:使用Smali2Java反编译出高保真的java代码