ssl_log() 主函数
🧭 r0capture.py 的核心,串联「连接设备 → 注入脚本 → 接收消息 → 写 pcap」全流程。
📎 源码在线查看:
r0capture.py#L131-L512(ssl_log)
签名
python
def ssl_log(process, pcap=None, host=False, verbose=False, isUsb=False,
ssllib="", isSpawn=True, wait=0, selftest=False):| 参数 | 来源 | 含义 |
|---|---|---|
process | 位置参数 | 进程名或 PID |
pcap | -p | pcap 输出路径 |
host | -H | 远程 frida-server 地址 |
verbose | -v | 详细输出 |
isUsb | -U | USB 连接 |
ssllib | -ssl | SSL 库通配符 |
isSpawn | -f | Spawn 模式 |
wait | -w | 等待秒数 |
selftest | --selftest | 自检模式 |
执行步骤
步骤详解
1. 定义内嵌函数
log_pcap、serve_bridge、on_message 都作为 ssl_log 的内嵌函数定义,闭包捕获 pcap_file、ssl_sessions 等上下文,避免全局状态污染。
2. 选设备
python
if isUsb:
device = frida.get_usb_device() # 失败退回 get_remote_device
elif host:
device = manager.add_remote_device(host)
else:
device = frida.get_local_device()3. spawn 或 attach
python
if isSpawn:
pid = device.spawn([process])
time.sleep(1)
session = device.attach(pid)
time.sleep(1)
device.resume(pid)
else:
session = device.attach(process)4-5. pcap 全局头
python
if pcap:
pcap_file = open(pcap, "wb", 0) # 无缓冲
for writes in ( # 逐字段写 24 字节全局头
("=I", 0xa1b2c3d4), ... # magic
):
pcap_file.write(struct.pack(writes[0], writes[1]))6-8. 脚本加载
python
_FRIDA_SCRIPT = open("script.js").read()
script = session.create_script(_FRIDA17_BOOTSTRAP + "\n" + _FRIDA_SCRIPT)
script.on("message", on_message)
script.load()把 frida17 引导代码拼在 script.js 前面一起注入,保证 Java 桥接按需加载。
10. 阻塞等待
python
signal.signal(signal.SIGINT, stoplog)
signal.signal(signal.SIGTERM, stoplog)
sys.stdin.read() # 主线程阻塞,hook 事件由 frida 消息线程驱动