26
2017
09

Android Apk解析

本文主要解释APK的结构,以及其相关的解析过程.
内容分为两部分,一部分是反编译的类文件查看,一部分是其它的文件查看.
(拿到一个apk还是可以获取不少信息的,想想还有点小激动)

图片

apk的文件就是一个普通的归档文件,我们先用zip包的方式打开,看到的目录如下图所示.红色框框部分的.dex是没法直接查看的.这里需要反编译后得到.class文件,然而普通的.class文件也没法直接查看,这里我们选择jd-gui来查看.

查看代码内容

 
这里是安装反编译工具教程

通过enjary反编译apk .

 //前面是指定输入的apk文件,后面是输出的jar
 enjary -f app-debug.apk -o test.jar

通过jd-gui来查看.class .jar文件

 //后面是jd-gui的jar
 java -jar /opt/jd-gui/jd-gui.jar

图片

## 查看资源文件 ##
之前有说到apk就是一个普通的归档文件,这里就直接把apk解压缩.里面包含的内容出了.dex 还有这些:
1.清单文件
2.图片,布局等资源文件.
3.METE_INFO

坑爹的,你会发现虽然说布局文件和清单文件都是普通的xml文件,但是无法用编辑器打开的.这是因为为了节省空间,google在打包apk的过程对这些xml进行来压缩工作.所以这些文件都是压缩后的文件.
这里以25.0.2举例,在android sdk的sdk/build-tool/25.0.2/目录下有一个aapt工具,这个工具就非常有用了.可以直接对apk进行操作,获取你想要的信息
aapt (Android Asset Packaging Tool)
先看它有什么功能

 //可以获取到它的功能列表,这里暂只看dump的功能
  ~/Android/Sdk/build-tools/25.0.2/aapt --help

图片

查看权限:

  ~/Android/Sdk/build-tools/25.0.2/aapt d  permissions  app-debug.apk 

查看清单文件:

~/Android/Sdk/build-tools/25.0.2/aapt d  xmlstrings  app-debug.apk AndroidManifest.xml

## 查看签名 ##
METE_INFO下面有三个文件:

  1. MENIFEST.MF
    保存对所有文件的sha(安全哈希)的base24编码 (可以直接打开,我用的notepad++)
  2. CERT.SF
    对MENIFEST.MF中的每一项进行sha(安全哈希) 并且通过apk签名的私钥进行运算后的base64编码 (可以直接打开,我用的notepad++)
 引用网上一个哥们的话:
这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。
解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。
系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件
  1. apk签名证书的公钥
    通过如下命令查看公钥
 keytool -printcert -file CERT.RSA

这里有一个逻辑是,MENIFEST.MF对普通的类和资源文件进行校验,CERT.SF 加上 CERT.RSA 校验MENIFEST.MF . 这样就保证不能伪造他人来发布apk

图片

上一篇:JAVA中的反射机制 下一篇:Android性能优化之app启动时间测量