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 文件,这个文件就是最终的文件了。