• Android 反编译技术流程


    为何需要反编译

    作为一名Android开发者,很多的时候需要去学习别人优秀的代码,原本在GitHub上就有很多开源的项目代码,但有的时候在使用软件时候遇到自己想要的功能时,想要学习实现的代码时,这时候就需要使用到反编译这项技术了。

    什么是反编译

    总的来说反编译指两个部分的反编译,一个是代码的反编译(src),一个是资源的反编译(res)。

    反编译的工具

    这里同样分成两个部分,一个是代码的反编译工具,一个是资源的反编译工具。

    代码反编译的工具:

    • dex2jarjd-gui:dex2jar将Android APK内的dex转化为jar文件,然后使用jd-gui可以查看,保存为java文件。

    • jadx:jadx是一个非常好用的反编译工具,可以原作者已经没有维护了。但也不妨成为一个经典工具。

    反编译资源的工具:

    • APKTool:使用APKTool将布局图片等资源可以提取出来。

    反编译的流程

    在这里我用一个之前编写的一个简单软件来作为演示。

    (Ⅰ). 首先需要拿到反编译的软件,拿到的软件一般是xxx.apk,但有的时候拿到的软件会是xxx.apk和xxx.odex,后者是平台优化过的产物,关于xxx.apk与xxx.odex的合并会在另一篇文章中讲到。拿到完整apk以后,手就可以着手反编译的工作了。

    (Ⅱ). 反编译资源文件:

    java -jar apktool_2.3.1.jar d -f KeyValueTest.apk -o KeyValueTest
    • 执行以上命令以后如下未报错则说明反编译成功:
      反编译成功
    • 参数说明:
      • -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
      • -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
      • -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
      • -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)
    • 此时便在当前文件夹下生成了一个KeyValueTest文件夹
      文件目录
    • 在这个文件夹下面便是反编译出来的资源文件,我们只需要res目录和AndroidManifest.xml文件。
      APKTool反编译目录
      对比layout:
      对比layout
      对比AndroidManifest.xml:
      对比AndroidManifest
    • 通过对比发现,APKTool反编译出来的资源文件都可以直接使用了!

    (Ⅲ). 反编译代码文件:

    • 将apk文件修改后缀为zip然后解压或者直接解压,得到以下文件目录如下:
      解压APK
    • 此处我们关注的是classes.dex文件,这个文件就是类似于Java中的字节码文件(.class),所以我们要先使用dex2jar将.dex文件反编译为jar文件。dex2jar文件目录结构如下,其中用到的为d2j-dex2jar.bat。
      dex2jar目录
    • 将classes.dex放入该文件夹,当前文件路径下,命令行输入d2j-dex2jar.bat classes.dex
      dex2jar成功
    • 然后生成相应jar文件:
      生成jar
    • 使用jd-gui打开,发现多了一个BuildConfig,这个是编译时候的配置文件不用管
      jd-gui打开
    • 在MainActivity中,对比反编译得到的代码与源代码,基本无异。在资源的引用上,替换成了数字,这个数字可以通过在R中查找替换回去。
      反编译的到的代码
      源代码
      R中查找到的资源ID
      资源ID
    • 通过jd-gui的保存功能(Save All Source)便可将代码保存下来

    (Ⅳ). 可以使用dex2jar,也可以使用jadx对classes.dex进行反编译,相对于dex2jar,jadx更加方便快捷,打开bin文件中的jadx-gui.bat然后直接选择APK即可,虽然jadx也可反编译资源文件,但有时候并不准确。
    jadx
    jadx界面

    (Ⅴ). 综上,反编译APK可以采用APKTool+JADX,也可以采用APKTool+dex2jar。推荐使用前者。有一个在线的反编译网站,采用的是JADX。
    ->由此去<-

    (Ⅵ). 至此,可以得到结论在未加扰的情况下,基本可以得到和源代码一摸一样的代码,加扰的情况阅读起来会很费劲,在此不做演示。将得到的res和AndroidManifest.xml以及java文件整合在一起,便得到了一份内似于源代码的代码。

    以上属于个人体验心得总结,若有不足之处,还望不吝赐教,欢迎批评指正,共同进步

  • 相关阅读:
    关于Redis的介绍,使用以及集群
    关于RESTful详解
    关于Nginx——反向代理
    关于RabbitMQ
    关于Nginx——负载均衡
    关于Nginx——配置虚拟主机
    StringBuffer是字符串缓冲区
    数组的查找操作
    获取任意年的二月有多少天
    快速排序算法
  • 原文地址:https://www.cnblogs.com/cj5785/p/9892978.html
Copyright © 2020-2023  润新知