Android 反编译
这篇草稿存了好久了,还是发出来吧。
首先介绍下要用到的工具:
- jdk: Java Development Kit
- baksmali:把 classes.dex 转为为 smali 文件的工具
- dex2jar:classes.dex 转为 jar 包的工具
- jdgui:阅读 jar 文件的工具
- smali:把 smali 文件编译打包为 classes.dex 的工具
其中关于 baksmali 和 smali 可以看下谷歌的介绍
反编译后得到的 dex 文件以及转为 jar 包后都无法进行修改,只能把 dex 文件转化为 smali 文件进行修改,然后再编译打包为 dex 文件,替换掉原有 apk 中的 dex 文件,然后对 apk 进行签名,这样就完成了对 apk 源码的修改,具体步骤如下:(以下操作是在 linux 下进行,windows 可能会略有差异)
1. 解压 apk 文件,获取 classes.dex 并拷贝到资源根目录(使用 zip 或其他解压工具即可)
2. 使用 baksmali 工具将 classes.dex 转为 smali 文件,在命令行定位到资源根目录并执行:
java -jar baksmali-2.0.3.jar -x classes.dex
执行完后会在当前目录下生成 out 目录,目录结构跟源码相同,在对应目录下查找对应的 smali 文件
3. 使用 dex2jar 工具把 dex 转为 jar 文件,拷贝 classes.dex 到资源目录下的 dex2jar-0.0.9.15 目录下,把命令行定位到该目录并执行:
./dex2jar.sh classes.dex (windows:dex2jar.bat classes.dex)
执行完后会在当前目录下生成 classes_dex2jar.jar 文件,然后可以通过 jdgui 进行查看
4. 使用 jdgui 工具查看 HelloWorld 的源码,根据不同的系统打开资源目录下对应的 jdgui 工具,然后把第 3 步生成的 classes_dex2jar.jar 文件拖到工具中
5. 修改对应的 smali 文件
6. 使用 smali-2.0.3.jar 工具把 smali 文件转为 dex 文件,把命令行定位到资源根目录并执行:
java -jar smali-2.0.3.jar -o classes.dex out
执行完后会生成并替换掉根目录下的 classes.dex 文件,这样就修改成功了
7. 把新生成的 classes.dex 文件替换到原来的 apk 文件里(使用压缩工具)
8. 使用签名工具对 apk 进行签名,把 apk 拷贝到资源根目录下的 sign_tool 目录,把命令行定位到该目录并执行:
java -jar signapk.jar platform.x509.pem platform.pk8 HelloWorld.apk Signed.apk
执行完后会在该目录下生成 Signed.apk 文件,这个文件就是最终的文件了。