一, 反编译工具:
1,APKTool:
APKTool 是由 GOOGLE 提供的 APK 编译工具, 能够完成反编译及回编译 apk 的工作. 同时, 它也有着安装反编译系统 apk 所需要的 framework-res 框架, 以及清理以前反编译文件夹等功能.
APKTool 的使用需要 java 支持.
2,dex2jar:
dex2jar 是将 Android 的. dex 文件转换成 Java 的. class 文件的转换工具, 如果在转换过程中有问题的话, 可以试用下其他的版本.
3,jd-gui:
JD 分为 JD-GUI,JD-Eclipse 两种运行方式, JD-GUI 是以单独的程序的方式运行, JD-Eclipse 则是以一个 Eclipse 插件的方式运行.
jd-gui 只能查看, 不能够将那些文件转换成. java 文件.
文件下载地址: https://pan.baidu.com/s/1ucFu7NATp0V3u9ixSwfnng
提取码: eeir
二, APKTool 使用:
下载好的 apktool 文件夹中包含以下文件: aapt.exe,apktool.bat,apktool.jar,cmd.exe.
1, 反编译:
将要反编译的 apk 文件复制到该文件夹下, 打开 cmd.exe, 进入 cmd 中, 执行命令:
- apktool.bat d hotword.apk
- (不复制也行, 但是执行命令时要使用绝对路径写清 apk 文件放置的精确位置)
在 apktool 文件夹下可以看到 hotword 文件夹, 里面存储的有 res 下的资源文件, 和各种 xml 文件:
如果你给定的 apk 反编译文件已经存在, 那么输入完该命令后会提示你, 并且无法执行, 需要重新修改命令加入 - f 指令:
apktool.bat d -f hotword.apk
这样会强行覆盖已经存在的文件.
2, 回编译:
运行命令:
apktool.bat b hotword
参数 b 代表回编译, hotword 则是 apk 反编译出来的文件夹名.
回编译完成会在 hotword 文件夹生成一个 dist 文件夹和一个 build 文件夹, dist 文件夹里面存放的就是回编译后不带有签名的 apk 文件, build 文件夹里面还有一个 apk 文件夹, 里面存放的是回编译后没有打包成 apk 的文件.
如下:
3, 安装特定的 framework-res.apk 文件:
install-framework 命令, 应用于为 APKTool 安装特定的 framework-res.apk 文件, 方便反编译一些与 ROM 相互依赖的 APK 文件.
三, dex2jar 的使用:
1, 解压文件:
将 apk 文件的后缀名改为 zip 格式, 解压里面的 classes.dex 文件:
将 classes.dex 放置到 dex2jar 文件夹下 (或使用绝对路径), 执行命令:
d2j-dex2jar.bat classes.dex
得到一个 jar 包:
四, jd-gui 的使用:
打开 jd-gui.exe:
File-》open file...
选中刚才生成的 jar 包, 打开可得:
五, 关于反编译:
1, 什么是反编译器 ?
编译的定义是: 将源代码转换成二进制执行代码的过程, 将 C 源代码编译成 exe 可执行文件这样的就叫做编译.
反编译: 把二进制执行代码还原成源代码的过程, 把 exe 转换为 C 源代码就叫反编译.
像 Java,.net 这样基于虚拟机技术的编程语言则反编译非常容易, Java 平台下有 JD 等反编译器,.net 平台下则有 Reflector 等反编译器. 但是主流的 C 的编译器都进行了代码的优化, 把 C 编译生成的 exe 文件反编译成 C 代码非常困难.
2, 反编译得到的是否是源代码?
当然不是.
代码与源代码是非常接近的, 基本 90% 还原, 但是还是会有一些差异. 比如说, 源代码里的 a=2+3; 这行代码, 编译成 apk 再反编译回来, 就变成了 a=5; 不会还原到 2+3 那种代码了.
3, 既然程序可以反编译, 那是不是开发安卓程序很不安全, 面临随时都会被破解的风险?
这倒不至于, 开发人员可以采用代码混淆等技术, 以此来加大反编译的难度和降低反编译代码的可读性.
但归根到底来说, 不可能完全避免这种风险, 不过可以大大减小, 而且 jd-gui 只能查看, 不能够将那些文件转换成. java 文件.
六, 问题解决:
在 apktool 反编译的过程中可能出现如下错误:
- Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
- at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:54)
- at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:604)
- at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:74)
- at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:66)
- at brut.androlib.Androlib.getResTable(Androlib.java:49)
- at brut.androlib.ApkDecoder.decode(ApkDecoder.java:93)
- at brut.apktool.Main.cmdDecode(Main.java:169)
- at brut.apktool.Main.main(Main.java:85)
- Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
- at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48)
- at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:43)
- at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:95)
- at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:81)
- at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:49)
- ... 7 more
这个报错的错因是:
使用了新的 adt, 而反编译使用的 apktool.jar 的版本太低了, 无法反编译某些 apk, 下载新的版本的 apktool.jar 并替换现在的版本即可.
注: apk 的反编译只可用于学习和研究, 坚决不可随意修改他人代码, 更加不可用作商用, 望慎行! 如有恶意行为, 后果自负.
来源: https://www.cnblogs.com/guobin-/p/10711116.html