自动化逆向框架: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环境 | 深度逆向、漏洞挖掘 |
实战:自动化分析流水线
我一般这样组合使用:
- Androguard做第一道筛子:提取所有类、方法、字符串,标记可疑点
- Radare2做快速验证:对可疑函数做反汇编,确认逻辑
- Ghidra做深度分析:对确认的恶意代码做反编译,理解完整逻辑
说白了,就是「粗筛→验证→深挖」三步走。每个框架都有自己的强项,别指望一个工具搞定所有事。
我的建议:刚开始别贪多。先精通Androguard,因为它最贴近Android逆向。等遇到瓶颈了,再学Radare2和Ghidra。一口吃不成胖子,逆向更是如此。
知识体系总览
下面这张图,帮你理清三个框架的关系和定位:
这张图展示了三个框架的定位和协作关系。Androguard负责快速扫描,Radare2擅长命令行环境下的验证,Ghidra则做最后的深度反编译。三者配合,基本能覆盖90%的逆向场景。
好了,关于自动化逆向框架,今天就聊这么多。记住,工具只是手段,思路才是核心。下次遇到一个恶意样本,别急着上手,先想想:能不能用脚本自动化掉一部分工作?