Androguard 基础使用笔记
📌 工具简介
Androguard 是一个 Python 编写的 Android 应用逆向分析工具,主要用于:
- APK/DEX 文件解析
- 代码反编译(Smali 级别)
- 方法调用关系分析
- 恶意行为检测
开源地址: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()