本文主要解释APK的结构,以及其相关的解析过程.
内容分为两部分,一部分是反编译的类文件查看,一部分是其它的文件查看.
(拿到一个apk还是可以获取不少信息的,想想还有点小激动)
apk的文件就是一个普通的归档文件,我们先用zip包的方式打开,看到的目录如下图所示.红色框框部分的.dex是没法直接查看的.这里需要反编译后得到.class文件,然而普通的.class文件也没法直接查看,这里我们选择jd-gui来查看.
查看代码内容
通过enjary反编译apk .
//前面是指定输入的apk文件,后面是输出的jar
enjary app-debug.apk -f -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
查看清单文件:
扫描二维码关注公众号,回复:
2881758 查看本文章
~/Android/Sdk/build-tools/25.0.2/aapt d xmlstrings app-debug.apk AndroidManifest.xml
## 查看签名 ##
METE_INFO下面有三个文件:
- MENIFEST.MF
保存对所有文件的sha(安全哈希)的base24编码 (可以直接打开,我用的notepad++) - CERT.SF
对MENIFEST.MF中的每一项进行sha(安全哈希) 并且通过apk签名的私钥进行运算后的base64编码 (可以直接打开,我用的notepad++)
引用网上一个哥们的话:
这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。
解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。
系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件
- apk签名证书的公钥
通过如下命令查看公钥
keytool -printcert -file CERT.RSA
这里有一个逻辑是,MENIFEST.MF对普通的类和资源文件进行校验,CERT.SF 加上 CERT.RSA 校验MENIFEST.MF . 这样就保证不能伪造他人来发布apk