要獲取一批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腳本會用到,後續再寫吧…