APK文件结构
apk文件实际是一个zip压缩包。可以用解压缩工具打开。以QQ安全中心APP为例,其中AndroidManifest.xml是压缩的,名字是固定的。
androguard用于APK的静态分析
python中有androguard包,可用于Android恶意软件分析。一般第三方库都会在Python官方的pypi网站注册,其安装可通过pip命令(pip install androguard)或者源码下载安装(python setup.py install)。androguard包github源码
- apk文件信息获取代码示例:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import time
import commands
import sys
import logging
from androguard.core.bytecodes.apk import APK #创建APK文件对象的类,用于访问APK文件中的所有元素
from androguard.core.bytecodes.dvm import DalvikVMFormat#DEX文件对象的类,解析APK文件中的classes.dex
from androguard.core.analysis.analysis import VMAnalysis#分析结果对象的类,分析DEX文件对象
def get_androguard_info():
#APK、DalvikVMFormat、VMAnalysis类参数属性、方法
androguard_info = dict()
androguard_info['APK_info'] = dir(APK)
androguard_info['DalvikVMFormat_info'] = dir(DalvikVMFormat)
androguard_info['VMAnalysis_info'] = dir(VMAnalysis)
return androguard_info
def get_apk_info(apkfile):
apk_info = {}
apk_object = APK(apkfile)
#print apk_object.xml["AndroidManifest.xml"].toxml()
apk_info['manifest_xml'] = apk_object.get_AndroidManifest() #获取manifest文件
apk_info['dex_file'] = DalvikVMFormat(apk_object.get_dex()) #获取dex文件
apk_info['app_name'] = apk_object.get_app_name() #获取APK应用
apk_info['apkfile_name'] = apk_object.get_filename() #获取APK文件名
apk_info['signature'] = apk_object.get_signature() #获取APK签名
apk_info['android_version'] = apk_object.get_androidversion_code() #获取Android版本名
apk_info['is_valid'] = apk_object.is_valid_APK() #判断APK是否有效
apk_info['package'] = apk_object.get_package() #获取package名
#get_activities() 获取APK所有activity名称列表
#get_main_activity() 获取APK主activity名称
#get_services() 获取APK所有service名称列表
#get_receivers() 获取APK所有receiver名称列表
#get_providers() 获取APK所有provider名称列表
#get_files() 获取APK文件列表
#show() APK基本信息
#get_permissions(),get_requested_permissions(),get_declared_permissions(),get_certificate() 获取APK权限相关信息
return apk_info
if __name__ == '__main__':
logger = logging.getLogger()#创建logger对象,
logger.setLevel(logging.DEBUG) # logger的总开关,只有大于Debug的日志才能被logger对象处理,DEBUG < INFO < WARNING < ERROR < CRITICAL
format = logging.Formatter(fmt="%(asctime)s - %(levelname)s: %(message)s",datefmt='%Y-%m-%d %H:%M:%S') # output format
sh = logging.StreamHandler(stream=sys.stdout) # output to standard output
sh.setFormatter(format)
logger.addHandler(sh)
logger.info("This is androguard class methods and properties.")
print get_androguard_info()
if len(sys.argv) == 2:
logger.info("This is APK info.")
print get_apk_info(sys.argv[1])
else:
print 'usage: python apk_info.py <file_path>'
- androguard模块介绍和使用
模块名称 | 模块作用 | 使用方式 |
---|---|---|
androapkinfo.py | 查看apk文件的包、资源、权限、组件、方法等信息 | ./androapkinfo.py -i ./test.apk |
androxml.py | 解密apk包中的AndroidManifest.xml文件 | ./androxml.py -i -i ./test.apk |
androcsign.py | 添加apk文件的签名信息到一个数据库文件 | ./androcsign.py -i signatures/test.sign -o signatures/dbandroguard |
androsign.py | 检测apk的签名信息是否在数据库里 | ./androsign.py –i ./test.apk -b signatures/dbandroguard -c signatures/dbconfig |
androdd.py | 生成apk文件中,每个类的方法的调用流程图 | ./androdd.py -i ./test.apk -o ./out -d -f PNG |
androdiff.py | 比较两个apk文件的差异 | ./androdiff.py -i ./test.apk ./test2.apk |
androdump.py | 用于dump一个linux进程的信息 | ./androdump.py -i pid |
androgexf.py | 生成apk的gexf格式的图形文件,Gephi软件查看 | ./androgexf.py -i ./test.apk -o ./test.gexf |
androlyze.py | 交互式的Android静态分析程序 | ./androlyze.py -s可进入shell终端 |
andromercury.py | 对Mercury的包装 | 参考Mercury的使用介绍 |
androrisk.py | 评估apk的潜在风险,最后会得出一个分 | ./androrisk.py -m -i ./test.apk |
androsim.py | 计算两个apk文件的相似度 | ./androsim.py -i ./test.apk ./test2.apk |
androxgmml.py | 生成apk/jar/class/dex等文件的控制流程及功能调用图 | ./androxgmml.py -i ./test.apk -o ./test.xgmml |
apkviewer.py | 为apk文件中每个类生成一个独立的graphhml文件 | ./apkviewer.py -i ./test.apk -o ./output |