Python批量獲取apk信息

要獲取一批apk的基本信息,手動一個個查詢太耗時間,遂通過python腳本批量獲取。

思路:
通過androguard獲取apk的基本信息(文件md5、簽名md5、包名等信息),再用openpyxl寫到一張excel表中。

遇到的難點:
1.androguard沒提供直接獲取簽名md5的方法,去項目github處發現一個androsign.py文件,它提取了META-INF下的證書信息,再使用hashlib.md5摘要獲取證書md5。整合了它調用相關代碼,添加到腳本即可。

2.由於xlwt不能生成xlsx,所以採用openpyxl。自定義字體可以使用openpyxl.styles中的Font類,填充顏色可以使用PatternFill。

完整代碼:

#!/usr/bin/python3

import hashlib
import sys
import os
import datetime

from androguard.core.bytecodes.apk import APK
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

def main(path):
    """
    獲取 apk信息
    :param path: 目標路徑
    :return: None
    """
    if os.path.isdir(path):
        wd = WriteData()
        wd.write_data(is_init=True)
        for root, dirs, files in os.walk(path):
            for f in range(len(files)):
                info = get_apk_info(root, files[f])
                print(info)
                wd.write_data(row=f, data=info)
    else:
        print('參數輸入有誤,不是一個目錄...')


def get_apk_info(root, f):
    """
    獲取apk信息
    :param root:
    :param f:
    :return:
    """
    apk_path = os.path.join(root, f)

    apk_info = []
    try:
        androguard = APK(apk_path)
        if androguard.is_valid_APK():
            apk_info.append(f)
            apk_info.append(get_file_md5(apk_path))
            apk_info.append(get_cert_md5(androguard))
            apk_info.append(androguard.get_app_name())
            apk_info.append(androguard.get_package())
            apk_info.append(androguard.get_androidversion_name())
    except Exception as e:
        print(f + ' ->>', e)

    return apk_info


def get_cert_md5(a):
    """
    獲取證書md5
    :param a:
    :return:
    """
    cert_md5 = ''
    certs = set(a.get_certificates_der_v2() + [a.get_certificate_der(x) for x in a.get_signature_names()])
    for cert in certs:
        cert_md5 = hashlib.md5(cert).hexdigest()

    return cert_md5


def get_file_md5(file):
    """
    獲取文件md5
    :param file:
    :return:
    """
    with open(file, 'rb') as f:
        md5obj = hashlib.md5()
        md5obj.update(f.read())
        md5 = md5obj.hexdigest()
        md5 = str(md5).lower()

    return md5


class WriteData:
    def __init__(self):
        self.wb = Workbook()
        self.ws = self.wb.active
        self.today = str(datetime.date.today())
        self.font = Font(name='等線', size=11)
        self.fill = PatternFill("solid", fgColor="E0EEE0")
        self.title = ['filename', 'file_md5', 'cert_md5', 'app_name', 'pkg_name', 'app_version']

    def write_data(self, row=1, data=None, is_init=False):
        """
        寫入數據
        :param row:
        :param data:
        :param is_init:
        :return:
        """
        if not is_init:
            for col in range(1, len(data) + 1):
                operate = self.ws.cell(row=row + 2, column=col, value=data[col - 1])
                operate.font = self.font
        else:
            for i in range(1, len(self.title) + 1):
                operate = self.ws.cell(row=row, column=i, value=self.title[i - 1])
                operate.font = self.font
                operate.fill = self.fill

        self.wb.save(os.path.join(os.getcwd(), self.today + '.xlsx'))


if __name__ == '__main__':
    main(sys.argv[1])

測試信息:

使用方法:
pyhton3 get_apk_info.py apk目錄

1.通過androguard獲取apk信息
在這裏插入圖片描述

2.用於記錄的excel表格
在這裏插入圖片描述

bingo,下次要獲取apk的相關信息就沒必要重複造輪子了,直接調用即可。
p.s. 在寫批量下載apk腳本會用到,後續再寫吧…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章