【Android TimeCat】 反编译
背景
需要参考一些好的项目,但是并没有开源,自己写是不会写的,这辈子都不会写的,抄又不能直接抄,只有靠反编译才能维持得了生活这样子。。。
神操作
在线反编译:http://www.javadecompilers.com/apk
常规操作
APK Analyzer
Android Studio 自带的 APK Analyzer 可直接查看APK内的 图片,xml内容,dex结构,文件尺寸等,还可以比较两个apk的差异。
虽然不能导出资源有点可惜,但已经很强大方便了。
用法:将 apk 拖入 AndroidStudio 就好了
参考:developer.android.com/studio/buil…
常用三件套
安装java
下载工具
apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看
下载地址:https://ibotpeaches.github.io/Apktool/
Mac下载地址:http://mac.softpedia.com/get/Developer-Tools/Apktool.shtmldex2jar:将apk反编译成java源码(classes.dex转化成jar文件)
下载地址:https://github.com/pxb1988/dex2jar
Mac下载地址:http://mac.softpedia.com/get/Developer-Tools/dex2jar.shtml- jd-gui:查看APK中classes.dex转化成出的jar文件,即源码文件
下载地址:https://code.google.com/archive/p/innlab/downloads
Mac下载地址:http://mac.softpedia.com/get/Development/Java/JD-GUI.shtml
注:有个合集,更加傻瓜化的工具onekey-decompile-apk:https://github.com/ufologist/onekey-decompile-apk
把apk拖到文件目录下就能直接反编译了
其实一些常见工具都可以通过 homebrew 或 homebrew-cask 安装1
2
3
4
5brew install apktool
brew install smali
brew install dex2jar
brew install jadx
brew cask install jd-gui
使用
apktool
apk 虽然实际上是个 zip 可以直接 unzip,但里边的 xml 都是 Binaray XML 形式,需要再次转化成 xml 才能查看。
apktool 可以将 apk 内的资源全部提取出来,同时 xml 也转化好可直接查看内容。
apktool 也可以用于在修改资源后重新打包 apk
用法:1
2
3
4
5
6
7
8// 提取资源
apktool d test.apk
// 提取资源并指定输出目录
apktool d test.apk -o test
// 重新打包apk
apktool b test
参考:ibotpeaches.github.io/Apktool/
smali/baksmali
baksmali 可将 dex/odex 转成 .smali 文件集
smali 可将 .smali 文件集 转成 dex/odex
注:odex 转 smali 需要相应系统的 framework,adb pull /system/framework
用法:1
2
3
4
5
6
7
8
9
10// 将 test.dex 分解到 test 目录
baksmali test.dex -o test
// 将 test 目录里的 smali 文件组装到 haha.dex
smali test -o haha.dex
// 获取系统 framework
adb pull /system/framework
// 将 test.odex 分解到 test 目录
baksmali test.odex b framework -o test
参考: https://github.com/JesusFreke/smali/wiki
下载:https://bitbucket.org/JesusFreke/smali/downloads/
dex2jar
dex2jar 可将 .dex 转换成 .jar
用法:1
2// 将 test.dex 转成 test.jar 文件
d2j-dex2jar test.dex -o test.jar
参考: https://github.com/pxb1988/dex2jar
下载:https://bitbucket.org/pxb1988/dex2jar/downloads/
jadx
jadx 可以将 .dex/.jar/.class 文件反编译成 .java 源码
jadx 也可以直接反编译 .apk 并处理好资源(binary xml -> xml)
jadx-gui 可视化查看工具
用法:1
2
3
4
5
6
7
8
9
10
11// 反编译 test.dex 并输出到 test 目录
jadx test.dex -d test
// 反编译 test.apk
jadx test.apk -d test
// 反编译 test.jar
jadx test.jar -d test
// 反编译 test.class
jadx test.class -d test
jd-gui
jd-gui 可视化反编译查看 .jar 文件
参考:jd.benow.ca/
附:Android APK中的Java代码可以被反编译到什么程度
Android APK中的Java代码可以被反编译到什么程度主要看APK的加密程度。
第一种情况:无混淆无加密无加壳。直接利用Dex2jar和JD-GUI可把源码从APK里抠出来,代码逻辑清晰,基本上做到可复用,只是资源文件的引用需要计算一下。
第二种情况:混淆。通常是利用Proguard做的防护。因为是对jar做的不可逆混淆(除非有mapping),因此不能还原成原来的代码。但是代码结构,代码逻辑一致,只要花长时间对代码进行梳理一样可找准核心代码,解密方法跟第一种一致。
第三种情况:加密。这里以DexGuard为例。对于这种代码加密的方法,在程序运行中必定会进行解密,只要抽出它解密的逻辑便可。PS:我自己做过DexGuard的解密,如果用Dex2jar反编译看的话逻辑是不对的,一定要从Smali代码看。后来发现网上已经有人做了。解密的脚本:A look inside Dexguard
第四种情况:加壳。这种情况跟第三种类似。无论你怎么加壳,运行的时候必定是Dalvik可识别的Odex代码,建议直接在内存里dump出来。这里推荐Xpose的ZjDroid。脱壳教程:ZjDroid工具介绍及脱壳详细示例1
2
3
4作者:Vince
链接:https://www.zhihu.com/question/30723538/answer/49382019
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。