android反编译技术总结

android apk 破解技术总结

1 反编译得到java代码

首先要下载两个工具:dex2jar和JD-GUI
前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。

  • 首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的;
  • 利用dex2jar 将classes.dex 转为jar包:

    1
    path/to/dex2jar.sh ./com.hf_5.1.6_56.apk_FILES/classes.dex
  • 利JD-GUI查看并保存成java源代码
    用jd-gui打开jar包,然后全部另存为java文件,绝大多数应该都能生成java代码,但是有部分可能无法反编译成java代码。利用JD-GUI可以查看jar包中到代码,但是查找功能有限。

此外还有APKTool,但是apktool 反编译得到的是smali代码。Android采用的是java语言 进行开发,但是Android系统有自己的虚拟机Dalvik,代码编译最终不是采用的java的class,而是使用的smali,smali不易读,因此一般不适用apktool反编译成smali

2 阅读源代码

阅读源代码主要分为两个部分

  1. 关键字查找: 将java源代码的文件夹用sublime 或java IDE打开,利用正则表达式,查找所需的关键字,在本次项目中是要寻找RESTful接口,因此把url作为关键字,可以找到与此RESTful接口相关到java处理代码。

  2. 追踪方法或类的使用情况。 由于代码的加密和混淆的原因,利用IDE自身的功能,难以查找某一个方法在那些地方被使用,往往需要根据字符串匹配来实现。
    比如 查找包 com.a.b.b 中的某个类c的方法 d的使用情况,直接点击d方法,IDE一般无法找到所有d的使用地方。因此可以尝试下面两种方法

    1. 搜索 import com.a.b.b.c 在找到的java文件中查看d方法的使用情况
    2. 在com/a/b/b/ 目录下 的java文件寻找c.d((如果d是静态方法),或者寻找new c(

3 利用jar包编写程序

一般来说,我们需要使用apk中某些方法,因此在找到我们所需要的方法之后,我们

  • 新建一个项目,把jar包加入到项目的library中
  • 把android.jar 也加入到项目的libray中。 因为作为android apk,项目中的文件经常会使用到android的一些类,虽然android的类一般不会直接作用与这个函数,但是当java 文件中出现import android.app.Application时就会报错,所以为了方便省事,还是应该把android.jar 加入到项目的libray中。
  • 有些时候我们想要修改jar包中的某些函数, 比如某个函数在执行的时候需要获取android 的Context 对象,但是这个对象却不是我们所关心的,因此我们需要修改这个函数,以便我们使用。但是修改完java代码却无法将其重新编译回jar包,因此备选的做法时,把需要修改的那部分代码全部拷贝出来,新建一个包。

我们经常需要尝试jar包中的某些函数的功能,但是为每一个函数都写一个测试文件又显得麻烦,而且在弄清楚jar包中函数的参数,类的方法之前,测试类也不好写。因此建议利用REPL来测试。java目前还不支持REPL ,但是有如下三种解决方法

  • 利用groovy ,Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,可以很方便的读取jar包,并访问其中的函数和类
  • 利用scala
  • 安装jdk9 ,利用jdk9中带的 jshelljshell是java自带的REPL,不过还不成熟