Android反编译

前言

自学Android有段时间了,发现反编译别人的apk读别人的代码,是个提高的好方式,还能获取一些好的图片资源。网上找了些方式,发现过程和方式有一些出路,还是自己写个blog来记录一下。

反编译工具

反编译的工具,就选用大家通用的Apktooldex2jarJD-GUI。(超链接进入其官网)
这三个软件Apktool的安装稍微麻烦点,其他都还好,基本上下载下来解压了就能用。

  • Apktool(按照官网安装方式,我的是Mac系统,其他系统同样按照官网方式安装)

    • Download Mac wrapper script (Right click, Save Link As apktool)
    • Download apktool-2 (find newest here)
    • Rename downloaded jar to apktool.jar
    • Move both files (apktool.jar & apktool) to /usr/local/bin (root needed)
    • Make sure both files are executable (chmod +x)
    • Try running apktool via cli
  • 基本上按照上面的6个步骤就ok了。虽然很简单,还是解释下吧。

    1. 是下载一个shell脚本,保存的名字就是”apktool”,不要带.sh后缀。可以复制到sublimetext,然后保存下。
    2. 下载最新的apktool-2
    3. 将所下载的jar文件改名为”apktool.jar”
    4. 将shell脚本”apktool”和”apktool.jar”放到 “/usr/local/bin”目录下
    5. 增加这两个文件可执行权限,chmod a+x file
    6. 执行shell apktool就ok了。

安装完毕后可以运行apktool -v查看版本信息

  • dex2jar和JD-GUI
    • 这两个直接下载,然后解压缩就ok

反编译

为了检测下是否能破解,我们先用Apktool反编译,免得我们最后一场空。(只有Apktool能反编译/回编译,我们的破解才有意义)。

  • 新建个apk文件夹,将待破译的apk放进去,之后进到这个目录运行命令: apktool d test.apk
  • apktool b hongbao (hongbao 就是反编译出来的文件夹)
  • 回编译apk过程中会生成build和dist文件夹,编译出来的apk在dist目录下,打开build/apk文件夹会发现少了original文件夹下的META-INF文件夹,也就意味着dist里的apk文件是没有签名的。
  • 我们要用dex2jar将apk转成jar文件,实质是将apk里的classes.dex转成jar。将dex2jar里的d2j_invoke.sh/d2j-dex2jar.sh增加可执行权限。然后进到dex2jar这个文件夹下运行: ./d2j-dex2jar.sh /Users/yanzi/apk/hongbao.apk 得到hongbao-dex2jar.jar文件。
  • 打开JD-GUI,将hongbao-dex2jar.jar拖进去就看到源码了。
    通过看Java源码对比smali文件,修改后回编译就ok了!

添加签名

  • 回编译后的apk是安装不成功的,总是提示
    Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]
    实质是没签名。
    1. 生成签名 keytool -genkey -keystore hongbao.keystore -keyalg RSA -validity 10000 -alias hongbao
    2. 为apk增加签名 jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore hongbao.keystore -signedjar hongbao-signed.apk hongbao.apk hongbao
    3. 注意
      1. 最后的”hongbao”就是-alias后面带的,必须保持一致。
      2. 如果不带-digestalg SHA1 -sigalg MD5withRSA签名后的apk安装也是不成功的,说INSTALL_PARSE_FAILED_NO_CERTIFICATES的错误,如果不带-tsa会报一个时间方面的警告。

使用apktool是为了能将修改后的代码或者资源重新回编译,改进效果。如果只是单纯想要apk里面的代码,还有一种方式更加简单。

  • 修改apk后缀名为.zip
  • 解压apk.zip
  • 拷贝解压文件夹中的classes.dex文件至dex2jar工具存放目录下
  • 终端进入dex2jar目录,执行./d2j-dex2jar.sh classes.dex
  • 生成classes.dex.dex2jar.jar文件
  • 可以通过JD-GUI工具直接打开查看jar文件中的代码