静态代码扫描工具-Androguard

/ 0评 / 0

Androguard 基础使用笔记

📌 工具简介

Androguard 是一个 Python 编写的 Android 应用逆向分析工具,主要用于:

开源地址:https://github.com/androguard/androguard

🛠️ 基础使用

1. 安装工具

pip install androguard

2. 使用方法

from androguard.misc import AnalyzeAPK

# a: APK基本信息  d: DEX结构  dx: 高级分析
a, d, dx = AnalyzeAPK("app.apk") 

🔧 常用操作

1. 提取基础信息

print("包名:", a.get_package())
print("主Activity:", a.get_main_activity())
print("权限列表:", a.get_permissions())
print("SDK版本:", a.get_sdk_version())
print("最小SDK版本:", a.get_min_sdk_version())
print("目标SDK版本:", a.get_target_sdk_version())
print("版本名称:", a.get_version_name())
print("版本号:", a.get_version_code())
print("签名信息:", a.get_signature())
print("签名证书:", a.get_certificate())

2. 遍历类与方法

# 获取所有类
for cls in d.get_classes():
    print("类名:", cls.get_name())

    # 获取类中的方法
    for method in cls.get_methods():
        print("  方法:", method.name)

    # 获取类中的字段
    for field in cls.get_fields():
        print("  字段:", field.name)

3. 字符串检索

# 查找含特定关键字的字符串
for s in a.get_strings():
    if "http" in s:
        print("网络相关字符串:", s)

4.调用关系分析

# 查找调用 Log.d() 的方法
method = dx.find_methods("Landroid/util/Log;->d")[0]

# 获取所有调用该方法的位置
xrefs = method.get_xref_from()

if not xrefs:
    print(f"✅ {cls} => {method.name}未找到调用记录")
    return

print(f"📌 {cls} => {method.name}共发现 {len(xrefs)} 处调用:")

# 输出详细调用信息
for caller_class, caller_method, offset in xrefs:
    print(f"    调用类:{caller_class.name}")
    print(f"    调用方法:{caller_method.name}{caller_method.descriptor}")

5.字节码查看

首先通过MethodAnalysis获取dex.EncodedMethod,然后获取dex.Instruction

def print_method_bytecode(method):
    # 获取指令列表(Dalvik字节码)
    instructions = method.get_instructions()

    # 获取方法的字节码偏移量信息
    code = method.get_code()
    bytecode = code.get_bc() if code else None

    print(f"方法: {method.get_class_name()}->{method.get_name()}")
    print(f"寄存器数量: {method.get_code().get_registers_size()}")
    print("指令列表:")

    # 遍历所有指令
    for idx, ins in enumerate(instructions):
        # 获取指令的原始字节
        raw_bytes = ins.get_raw()

        # 格式化输出
        print(f"{idx:04d} | OP: 0x{ins.get_op_value():02X} "
              f"{ins.get_name()} "
              f"{ins.get_output()} "
              f"Bytes: {raw_bytes.hex().upper() if raw_bytes else ''}")

    # 显示异常处理块(可选)
    if code:
        print("\n异常处理块:")
        for eh in code.get_exceptions():
            print(f"Try[{eh.start_addr}-{eh.end_addr}] -> Catch[{eh.handler_addr}]")

apk, dvm, analysis = AnalyzeAPK(apk_path)
for m in analysis.get_methods():
    print_method_bytecode(m.get_method())

常用方法如下

ins.get_op_value()     # 获取操作码数值(十进制)
ins.get_name()         # 获取指令名称(如"invoke-virtual")
ins.get_output()       # 获取带参数的完整指令文本
ins.get_raw()          # 获取原始字节码(bytes类型)
ins.get_length()       # 获取指令占用的字节数

# 直接显示字节码样式
methodAnalysis.get_method().show()

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注