安卓应用反编译基本整理

  反编译属于逆向工程的一种,虽然不建议通过反编对商业应用进行二次打包和发布(当然目前商业应用的混淆和签名校验做的也已非常成熟),但反编对于提高个人技术水平还是有重要帮助的。对于大量学习性质的应用,反编译能够让开发者迅速定位到感兴趣的模块组件或UI实现,熟悉目标应用架构设计和功能逻辑,我个人在工作中用到反编译多是在对某个应用的炫目动画实现很感兴趣或者想要了解某应用的整体结构时。本文整理了安卓反编译基本工具、流程及个人使用的反编脚本。

反编译的工具

  • dex2jar,顾名思义,将dex文件转化为class文件,class文件以jar包形式存在,可以直接https://github.com/pxb1988/dex2jar下载。
  • jd-jui,将jar包中的class文件转化为java源码显示,实际使用中可以把所有.jar格式文件设置默认使用该工具打开。官网地址http://jd.benow.ca/
  • Apktool, 用于反编资源文件,包括resources.arsc, classes.dex, 9.png及xml文件,如果仅仅解压缩apk得到的xml文件直接打开是乱码,目前ApkTool的官方地址为http://ibotpeaches.github.io/Apktool/ 官网上给了很明白的建议,It is NOT intended for piracy and other non-legal uses. It could be used for localizing, adding some features or support for custom platforms, analyzing applications and much more.

反编译流程

  • apk解压缩后,使用dex2jar工具转化class.dex->classes-dex2jar.jar。命令行:d2j-dex2jar.bat classes.dex ,在当前执行CMD的目录生成jar文件。较早版本的dex2jar偶尔会在该步骤提示虚拟机堆内存不足的错误,如配置允许可以修改Eclipse的虚拟机参数,否则建议关闭Eclipse/AS甚至是模拟器,稍后重试还不行干脆注销重启升级硬件,目测新版dex2jar少有该问题。
  • 打开上步的输出jar文件。命令行:jdgui classes-dex2jar.jar,可配置jar文件默认使用jdgui后双击打开。
  • 前面步骤完成的仅是对源码中SRC目录的逆向,对于其它的xml文件,需要通过ApkTool完成。关于ApkTool的安装请参考安装说明。命令行 : apkTool d -f x.apk,运行后会生一个和应用同名的结果目录,这一步不需要前面两步的输出结果,所以可以提前同步或者是独立进行,目的是为了获取apk中资源文件的原始情况,工作中主要是为了查看xml文件源码。

自定义脚本

  反编译的步骤比较简单,但是实际工作中需要额外做不少的重复工作,包括解压、拷贝、运行等、这些工作可以简化,考虑写个命令行脚本文件,实现自动反编,目标输入是源apk文件,根据输出不同写成两个脚本:

  • ab-res.bat : 该脚本是利用Apktool将源apk文件反编输出到同名文件夹。
    脚本内容为:
    MKDIR %2
    apktool.bat d -f %1 -o %2
    执行格式 :
    ab-res.bat XX.apk(源apk) XX(输出目录)
    ApkTool能够反编的是二进制资源文件,可以简化理解为res,当然也包括AndroidManifest.xml,执行该脚本后会在自动在当前目录下生成反编资源目录,ab可以理解为anti-build的简化,由于这些脚本所在目录最终要添加到Windows的环境变量中,所以命名不宜复杂。
  • ab-src.bat : 同上,这个是利用dex2jar来生成classes-dex2jar.jar的脚本,脚本内容为:
    unzip %1 -d Tmp
    move TMP\classes.dex classes.dex
    rm -rf TMP
    d2j-dex2jar.bat –force classes.dex
      执行格式为:
    ab-src.bat XX.apk(源apk)
      执行结果是在当前目录下产生classes-dex2jar.jar及classes.dex文件,前者可以通过jdjui直接查看源码内容。
  • 要完成上述功能需要先配置环境变量,需要在系统的PATH路径中加入路径。例如,本文的AntiBuild目录包含如下文件:

      目录地址为D:\TOOL\Anti-build\Anti2.0,由于脚本中使用到了该目录及子目录dex2jar-2.0中的工具,所以需要在PATH环境变量中添加如下D:\TOOL\Anti-build\Anti2.0\;D:\TOOL\Anti-build\Anti2.0\dex2jar-2.0;注意自己当前的用户模式,该变量应加在用户的PATH中,把自定义的脚本添加进去后,就可以在任何含有apk的目录下执行脚本。但是默认没有自动补齐,所以要记住两个脚本的名称。完整的AntiBuild的目录包可在http://download.csdn.net/detail/klpchan/9384850下载。
      除此之外,脚步中的unzip和rm都是linux环境下的命令,这里之所以能用在命令行中,是因为我之前安装了cygwin并且把C:\cygwin64\bin的路径添加到了PATH中,这个是比较常见的环境搭建方式,好处是能够在CMD中直接执行unix环境下的命令工具,这样在写脚本时能够使用更多的命令。unzip命令并不是Cygwin中默认安装的,需要自己手动安装如下
    这里写图片描述
     安装后重启Cygwin,可以看到该命令已经添加到/user/bin下供使用。
  • 举个例子,在某目录下有KlpViewInject.apk文件,如要利用脚本反编译,先在命令行模式下进入到该目录,执行ab-src.bat KlpViewInject.apk,生成classes-dex2jar.jar及class.dex, 执行ab-res.bat KlpViewInject.apk KlpViewInject, 则生成含有资源及配置文件的目录,结果如下图:
    生成结果,双击jar文件看查看未混淆部分源码:
    这里写图片描述
    也可正常查看KlpViewInject文件夹下资源配置文件源码。

小结

  逆向工程在开发学习中非常重要,除了能够学习优秀代码提升开发者技术水平以外,反编也是数据包结构解析安全检测的重要工具,作为非专业逆向工程师,了解基本的反编译工具、流程及使用即可,目前越来越多的安卓应用在混淆后反编译的效果并不理想,而且二次打包及伪造签名会给用户带来较差的用户体验,所以目前对于普通的开发者来说,反编译纯粹的目的就是为了提升开发技术水平,不要想得太多~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值