自动化逆向框架:Androguard、Radare2、Ghidra脚本化分析

说实话,手动逆向一个App,就像在迷宫里找钥匙。偶尔玩玩还行,真要天天搞,谁也受不了。我入行那会儿,每天对着IDA按F5,眼睛都快瞎了。后来我学乖了——把重复劳动交给脚本,把精力留给逻辑分析。今天聊的三个框架,就是帮你实现「自动化逆向」的利器。

为什么需要自动化?

你想想看,一个中型App,少说也有几百个类、几千个方法。人工一个个看,不现实。更别说有些恶意软件会动态加载、加壳、混淆。这时候,脚本化分析的价值就出来了:

  • 批量处理:一次性扫描所有类,找出敏感API调用
  • 模式匹配:用正则或AST匹配已知恶意模式
  • 数据提取:自动提取字符串、URL、加密密钥
  • 流程分析:自动构建调用图,定位关键路径

核心观点:自动化不是替代你,而是放大你的能力。你定规则,机器执行。

Androguard:Android逆向的瑞士军刀

Androguard是我最早接触的自动化框架。纯Python写的,对Android DEX/APK支持极好。我个人习惯用它做静态分析,尤其是批量扫描恶意软件的时候。

基本用法

from androguard.misc import AnalyzeAPK

# 加载APK
a, d, dx = AnalyzeAPK('sample.apk')

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

# 查找特定方法调用
for method in d.get_methods():
    if 'getDeviceId' in method.get_name():
        print(f'发现敏感调用: {method.get_class_name()} -> {method.get_name()}')

这段代码能干什么?几秒钟内,把APK里所有调用了getDeviceId的地方揪出来。我在项目里遇到过,有些恶意软件会把这个调用藏在JNI层,但Androguard的DEX解析器能穿透大部分混淆。

进阶:自定义规则扫描

from androguard.core.analysis import analysis

# 构建调用图
cg = dx.get_call_graph()

# 查找从onCreate到敏感API的路径
for path in cg.find_paths(
    'Lcom/example/MainActivity;->onCreate',
    'Landroid/telephony/TelephonyManager;->getDeviceId'
):
    print('路径:', ' -> '.join(path))

避坑指南:我曾经用Androguard扫描一个加了360加固的APK,结果直接崩了。后来发现,得先用脱壳工具把DEX dump出来,再喂给Androguard。记住,它处理不了加壳后的DEX。

Radare2:命令行下的逆向引擎

Radare2(简称r2)是那种「用惯了就觉得真香」的工具。它没有GUI,但脚本化能力极强。我刚开始用的时候也觉得别扭,直到有一次需要在服务器上做批量逆向——没有显示器,没有鼠标,r2成了唯一的选择。

r2pipe:Python控制r2

import r2pipe

# 打开文件
r2 = r2pipe.open('sample.dex')

# 分析所有函数
r2.cmd('aaaa')

# 列出所有函数
functions = r2.cmdj('aflj')
for func in functions:
    print(f'{func["name"]} @ {hex(func["offset"])}')

# 反编译指定函数
print(r2.cmd('pdc @ main'))

r2.quit()

这里有个小技巧:cmdj返回的是JSON格式,可以直接用Python解析。我写过一个脚本,用r2pipe批量分析100个样本,自动提取所有字符串常量,然后匹配C2服务器地址。嗯,效率比手动高了一个数量级。

r2的自定义命令

# 查找所有交叉引用
r2.cmd('axt @ 0x123456')

# 打补丁(修改字节)
r2.cmd('wx 9090 @ 0x123456')

# 导出分析结果
r2.cmd('aaa > analysis.txt')

注意:r2的学习曲线比较陡。我建议你先从r2 -c 'aaaa; afl' sample.dex这种简单命令开始,慢慢再上脚本。别一上来就想搞复杂的自动化,容易劝退。

Ghidra:NSA的开源巨兽

Ghidra是NSA开源的逆向框架,支持插件和脚本。它的Python脚本接口(Jython)非常强大。我个人觉得,Ghidra最大的优势是它的程序分析引擎——能自动识别函数签名、恢复变量名、甚至做反编译。

Ghidra脚本基础

# 获取当前程序
from ghidra.program.model.listing import Function

program = getCurrentProgram()
listing = program.getListing()

# 遍历所有函数
for func in listing.getFunctions(True):
    print(f'函数: {func.getName()} @ {func.getEntryPoint()}')

# 查找特定字符串
from ghidra.app.util.search import SearchString
strings = SearchString.search(program, "http://", True)
for s in strings:
    print(f'发现URL: {s}')

批量分析脚本

# 自动标记所有可疑调用
from ghidra.app.script import GhidraScript

class BatchAnalyzer(GhidraScript):
    def run(self):
        # 获取所有调用指令
        for instr in self.getCurrentProgram().getListing().getInstructions(True):
            if 'CALL' in instr.getMnemonicString():
                target = instr.getAddress(0)
                func = self.getFunctionAt(target)
                if func and 'getDeviceId' in func.getName():
                    self.setBackgroundColor(instr.getMinAddress(), 0xFFFF00)
                    self.println(f'标记可疑调用: {instr.getMinAddress()}')

经验之谈:Ghidra的脚本运行在Jython上,性能不如CPython。如果你要处理超大型APK(比如100MB+),建议先用Androguard做粗筛,再用Ghidra做精细分析。我踩过这个坑——直接用Ghidra分析一个200MB的APK,等了半小时还没加载完。

三框架对比

特性 Androguard Radare2 Ghidra
语言 Python C/Python (r2pipe) Java/Jython
主要用途 Android DEX静态分析 通用二进制分析 深度反编译+脚本化
学习曲线
自动化能力 强(纯Python) 中(命令行管道) 强(插件+脚本)
适合场景 批量扫描、恶意软件检测 嵌入式、无GUI环境 深度逆向、漏洞挖掘

实战:自动化分析流水线

我一般这样组合使用:

  1. Androguard做第一道筛子:提取所有类、方法、字符串,标记可疑点
  2. Radare2做快速验证:对可疑函数做反汇编,确认逻辑
  3. Ghidra做深度分析:对确认的恶意代码做反编译,理解完整逻辑

说白了,就是「粗筛→验证→深挖」三步走。每个框架都有自己的强项,别指望一个工具搞定所有事。

我的建议:刚开始别贪多。先精通Androguard,因为它最贴近Android逆向。等遇到瓶颈了,再学Radare2和Ghidra。一口吃不成胖子,逆向更是如此。

知识体系总览

下面这张图,帮你理清三个框架的关系和定位:

自动化逆向框架知识体系 Androguard Radare2 Ghidra DEX解析 / 批量扫描 命令行 / 嵌入式分析 反编译 / 深度分析 自动化分析流水线 Androguard 粗筛 Radare2 验证 Ghidra 深挖 每个框架各有侧重,组合使用才能发挥最大效能

这张图展示了三个框架的定位和协作关系。Androguard负责快速扫描,Radare2擅长命令行环境下的验证,Ghidra则做最后的深度反编译。三者配合,基本能覆盖90%的逆向场景。


好了,关于自动化逆向框架,今天就聊这么多。记住,工具只是手段,思路才是核心。下次遇到一个恶意样本,别急着上手,先想想:能不能用脚本自动化掉一部分工作?

公众号:蓝海资料掘金营,微信deep3321