#! /usr/bin/python3 # -*- coding: utf-8 -*- # Author: kelvinBen # Github: https://github.com/kelvinBen/AppInfoScanner import os import time import shutil import platform # smali 所在路径 smali_path = "" # backsmli 所在路径 backsmali_path = "" # apktool 所在路径 apktool_path = "" # adb 所在路径 adb_path = "" # frida server 所在路径 frida32_path = "" frida64_path = "" # aapt 所在路径 aapt_apth = "" # 系统类型 os_type = "" # 输出路径 output_path = "" # 下载完成标记 download_flag = False # excel 起始行号 excel_row = 1 class Bootstrapper(object): def __init__(self, path, out_path, all=False, no_resource=False): global smali_path global backsmali_path global apktool_path global adb_path global frida32_path global frida64_path global aapt_apth global os_type global output_path global script_root_dir global txt_result_path global xls_result_path global strings_path global history_path global app_history_path global domain_history_path global excel_row global download_path global download_flag global out_dir global all_flag global resource_flag all_flag = not all resource_flag = no_resource create_time = time.strftime("%Y%m%d%H%M%S", time.localtime()) script_root_dir = os.path.dirname(os.path.abspath(path)) if out_path: out_dir = out_path else: out_dir = script_root_dir tools_dir = os.path.join(script_root_dir, "tools") output_path = os.path.join(out_dir, "out") history_path = os.path.join(script_root_dir, "history") if platform.system() == "Windows": machine2bits = {'AMD64': 64, 'x86_64': 64, 'i386': 32, 'x86': 32} machine2bits.get(platform.machine()) if platform.machine() == 'i386' or platform.machine() == 'x86': strings_path = os.path.join(tools_dir, "strings.exe") else: strings_path = os.path.join(tools_dir, "strings64.exe") else: strings_path = "strings" backsmali_path = os.path.join(tools_dir, "baksmali.jar") apktool_path = os.path.join(tools_dir, "apktool.jar") adb_path = os.path.join(tools_dir + '\\unpacker', "adb.exe") frida32_path = os.path.join(tools_dir + '\\unpacker', "hexl-server-arm32") frida64_path = os.path.join(tools_dir + '\\unpacker', "hexl-server-arm64") aapt_apth = os.path.join(tools_dir + '\\unpacker', "aapt.exe") download_path = os.path.join(out_dir, "download") txt_result_path = os.path.join(out_dir, "result_" + str(create_time) + ".txt") xls_result_path = os.path.join(out_dir, "result_" + str(create_time) + ".xlsx") app_history_path = os.path.join(history_path, "app_history.txt") domain_history_path = os.path.join(history_path, "domain_history.txt") def init(self): if not os.path.exists(out_dir): os.makedirs(out_dir) print("[*] Create directory {}".format(out_dir)) if os.path.exists(output_path): try: shutil.rmtree(output_path) except Exception as e: # 解决windows超长文件名删除问题 if not (platform.system() == "Windows"): raise e self.__removed_dirs_cmd__(output_path) os.makedirs(output_path) print("[*] Create directory {}".format(output_path)) if not os.path.exists(download_path): os.makedirs(download_path) print("[*] Create directory {}".format(download_path)) if not os.path.exists(history_path): os.makedirs(history_path) print("[*] Create directory {}".format(history_path)) if os.path.exists(txt_result_path): os.remove(txt_result_path) if os.path.exists(xls_result_path): os.remove(xls_result_path) def __removed_dirs_cmd__(self, output_path): files = os.listdir(output_path) for file in files: new_dir = os.path.join(output_path, "newdir") old_dir = os.path.join(output_path, file) if not os.path.exists(new_dir): os.makedirs(new_dir) os.chdir(output_path) cmd = ("robocopy %s %s /purge") % (new_dir, old_dir) os.system(cmd) os.removedirs(new_dir) os.removedirs(old_dir)