APK逆向过程基础

一.APK的打包过程

       了解apk的逆向过程首先需要了解apk包是怎么来的,都包括哪些内容,所以我会从apk的打包过程讲起。下面可以看到Android官网给出的一张apk打包的基本流程图:(蓝色格子是本人添加的)

      APK逆向过程基础

从中可以梳理出apk打包的基本流程有如下7步:

1. 打包资源文件

对象:Resource文件(res目录中的文件)、 Assets文件(assets目录中的文件)、 AndroidManifest.xml文件

工具:aapt(Android Asset Package Tool)工具,负责编译和打包资源

产物:项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制,除了assets和res中的raw资源被原封不动地打包进APK之外,其它的资源都会被编译或者处理,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源ID常量

 

2. 处理AIDL文件

对象:aidl文件

工具:aidl(Android Interface Definition Language)工具,即Android接口描述语言工具

产物:生成相应的Java文件供程序调用,若项目中没有使用到aidl文件,则跳过这步

 

3. 编译项目源代码

对象:R.java、Java接口文件以及工程源代码

工具:Java编译器(javac)

产物:生成多个.class文件(字节码文件)

 

4. 转换所有.class文件

对象:.class文件和第三方库的jar包

工具:dx工具

产物:生成classes.dex文件(Dalvik字节码)

 

5. 打包生成apk

对象:classes.dex文件、resources.arsc和其他的资源(没有编译的资源,如assets目录下资源、/res/raw目录下的资源)

工具:apkbuilder

产物:未签名的apk文件

 

6. 对apk文件签名

对象:apk文件

工具:JDK提供的jarsigner工具或Android源码提供的signapk工具

产物:Android调试程序时带有默认debug.keystore签名的apk 或者 打包发布时提供特有的签名文件的apk

 

7apk对齐处理

对象:签名的apk文件

工具:zipalign工具

产物:使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快,对齐的作用就是减少运行时内存的使用

二、Android反编译

Android开发者反编译别人的apk,主要目的还是为了学习到更多,取彼之长,补己之短。那么如何反编译呢?

首先了解基本的apk包都包括哪些文件:(以下是本人打的最基础的apk包,解压后如图)

     APK逆向过程基础

具体文件如下:

      名称                内容                                                                                                      详细
META-INF 签名文件夹 三个签名证书(MANIFEST.MF、CERT.SF、CERT.RSA)。MANIFEST.MF文件是对每个文件的SHA-256-Digest;CERT.SF是对每个文件的头3行进行SHA-256-Digest;CERT.RSA这个文件保存了签名和公钥证书。
res 资源文件 有animator,anim,color,drawable,layout,menu,raw,value等文件夹
AndroidManifest.xml 清单文件 记录应用的包名、版本、权限、引用的库文件等信息
classes.dex 执行文件 java编译后的Android可执行的dex文件
resources.arsc 编译后的二进制资源文件 记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。 这是一个索引文件。

        其次了解Android中常用的反编译工具有三个:dex2jar、jd-gui和apktool,这三个工具的作用如下:

  1.  apktool:反编译生成smali字节码文件,提取apk中的资源文件。下载地址:https://ibotpeaches.github.io/Apktool/install/
  2.  dex2jar:将apk中的classes.dex文件转换成jar文件。下载地址:https://github.com/pxb1988/dex2jar
  3.  jd-gui:查看由dex2jar转换成的jar文件,以界面的形式展示反编译出来的Java源代码。下载地址:http://java-decompiler.github.io/

工具具体的使用方法:

(一)apktool的使用:

  • ① 进入apktool文件夹执行如下命令,反编译指定apk文件APK逆向过程基础
  • ② 最终会生成一个对应文件夹,如下:

          APK逆向过程基础

具体文件如下:

名称

内容

详细

original

包括/META-INF、

AndroidManifest.xml(这是二进制的清单)

 

三个签名证书(MANIFEST.MF、CERT.SF、CERT.RSA)

.....

res

资源文件

有animator,anim,color,drawable,layout,menu,raw,value等文件夹

smali

源代码文件夹

项目源代码.smali文件

AndroidManifest.xml

清单文件

记录应用的包名、版本、权限、引用的库文件等信息

apktool.yml

apktool.yml文件

记录了apk名、packageInfo、sdkInfo(minSdkVersion和targetSdkVersion)、versionInfo(versionCode和versionName)

  • ③ 根据需求修改相关的资源和代码后,利用apktool进行二次打包:

APK逆向过程基础

④ 经过执行以上的命令,app-release文件夹会增加两个文件:

         APK逆向过程基础

⑤ 其中/dist文件夹里面的便是二次打包生成的未签名的apk包,接下来便要对其进行签名才能正常安装:

APK逆向过程基础
        其中第一个红圈指的是签名文件,绿色框指的是签名后的文件名, 黄色圈指的是待签名的apk, 第二个红圈指的是签名文件的别名。执行命令后输入签名文件对应的密码便可生成指定名称的签名apk,至此apktool工具大概的使用就差不多了。

 

(二)dex2jar的使用:

① 如图,执行d2j-dex2jar.bat app-release.apk命令:(实际上是反编译apk里的classes.dex文件,读者也可以执行d2j-dex2jar.bat classes.dex这个命令)

APK逆向过程基础

② 生成一个app-release-dex2jar.jar文件(或者是classes-dex2jar.jar文件) 

 

(三)jd-gui的使用:

       运行下载的jd-gui.exe,运行jd-gui.exe 点击File--->OpenFile--->classes-dex2jar.jar,打开刚才使用dex2jar反编译生成的jar文件便可出现如下界面:

APK逆向过程基础

       至此,本人所了解的apk逆向过程的基础基本如此,若要了解更多还需更进一步的学习!文章如有不对或排版不行的地方,还望读者指出与批评。如有不清楚的地方,还望留言指出。

 

参考链接:

https://blog.****.net/luoshengyang/article/details/8738877

https://www.cnblogs.com/royi123/p/3576746.html

https://blog.****.net/goodlixueyong/article/details/51126874

https://www.cnblogs.com/xunbu7/p/7345912.html

https://blog.****.net/loongago/article/details/89646920#7_APK_55

https://www.52pojie.cn/forum.php?mod=viewthread&tid=822434&page=1