Skip to content

main.py — 经典 CLI 入口 ​

经典 CLIargparse

apkid/main.py 是 apkid 命令的入口(setup.py 注册 apkid=apkid.main:main)。它用 argparse 解析参数、构造 Options、跑 Scanner、用 OutputFormatter 输出。

📋 文件内容 ​

符号类型说明
get_parser()func构造 argparse parser
build_options(args)func把 argparse namespace 转 Options
main()func主流程

⚙️ get_parser() ​

定义了经典 CLI 的全部参数:

usage: apkid [-h] [-v] [-t TIMEOUT] [-r] [--scan-depth SCAN_DEPTH]
             [--entry-max-scan-size ENTRY_MAX_SCAN_SIZE]
             [--typing {magic,filename,none}] [-j]
             [-o DIR] [FILE [FILE ...]]
参数说明默认
FILE输入文件/目录(可多个)—
-v/--verbose调试日志False
-t/--timeoutYARA 超时秒30
-r/--recursive递归子目录False
--scan-depth嵌套 ZIP 深度2
--entry-max-scan-size条目大小上限100 MB
--typing文件识别策略magic
-j/--jsonJSON 输出False
-o/--output-dir写多文件目录None
--include-types含 file_typeFalse

用 ArgumentDefaultsHelpFormatter,help 里会显示默认值。

🔧 build_options(args) ​

python
def build_options(args) -> Options:
    return Options(
        timeout=args.timeout, verbose=args.verbose, json=args.json,
        output_dir=args.output_dir, typing=args.typing,
        entry_max_scan_size=args.entry_max_scan_size,
        scan_depth=args.scan_depth, recursive=args.recursive,
        include_types=args.include_types,
    )

注意 Options 构造时已 RulesManager() + OutputFormatter(...) 就绪,这里只是把 argparse 字段映射过去。

🚀 main() ​

python
def main():
    parser = get_parser()
    args = parser.parse_args()
    options = build_options(args)

    if not options.output.json:
        print(f"[+] APKiD {__version__} :: from RedNaga :: rednaga.io")  # 横幅

    rules = options.rules_manager.load()      # 加载 rules.yarc
    scanner = Scanner(rules, options)

    for input in args.input:
        scanner.scan(input)                   # 扫描,OutputFormatter 直接写

特点:

  • 不走 common.make_scanner()——经典 CLI 用自己的 Options + Scanner + OutputFormatter 路径。
  • 非输出时打印横幅([+] APKiD ...)。
  • 支持多输入文件/目录,循环扫描。
  • Scanner.scan() 内部已调 OutputFormatter.write(),所以 main 不直接处理结果。

🆚 与 AI CLI 入口的区别 ​

维度main.py(经典)cli/app.py(AI)
参数解析argparsetyper
默认 entry_max_scan_size100 MB0(不限)
输出OutputFormatterAIOutputFormatter
横幅有无
共享 make_scanner否是

经典 CLI 的 --entry-max-scan-size 默认 100MB 是历史默认,偏保守;AI CLI 默认 0(不限)更贴合"扫到底"的 AI 用例。

📍 相关 ​

基于 GPL & Commercial 双重许可发布