AI 驱动的逆向工程:用 tmux MCP 操控 GDB 与 Frida
让 AI 助手直接操控调试器,实现全自动化逆向分析。
背景
逆向工程的核心工作流是:启动调试器 → 设断点 → 运行 → 观察状态 → 推理逻辑。这个过程高度依赖交互式终端操作,传统上只能由人手动完成。
现在,通过 tmux MCP(Model Context Protocol)服务器,AI 助手可以直接操控终端中的 GDB、Frida 等交互式工具。AI 不再只是"建议你输入什么命令",而是自己动手调试、自己分析结果、自己定位答案。
本文通过两个示例展示这套工作流:
1. GDB 调试 x86-64 二进制 — 分析加密逻辑,提取 flag 2. Frida Hook Android 应用 — 动态拦截加密函数,直接解密
工具链安装
tmux + tmux MCP
# 安装 tmuxsudo apt install -y tmux # Debian/Ubuntubrew install tmux # macOS# 安装 tmux MCP 服务器npm install -g tmux-mcp配置 Claude Code 连接 tmux MCP
claude mcp add tmux -- npx -y tmux-mcp添加成功后会看到确认信息:

通过 /mcp 命令可以验证连接状态:

GDB 与 Frida
# GDBsudo apt install -y gdb# Frida(需要 Python 环境)pip install frida-tools核心概念:rawMode 与 capture-pane
tmux MCP 提供以下关键工具:
create-session | |
split-pane | |
execute-command | |
capture-pane |
操控 GDB、Frida 这类交互式程序时,必须使用 rawMode: true。原因是这些程序启动后不会退出,普通模式会等待命令结束导致超时。rawMode 下发送命令后,通过 capture-pane 读取输出结果。
工作流程:
execute-command(rawMode: true) → 发送 gdb 命令 ↓capture-pane → 读取 gdb 输出 ↓AI 分析输出 → 决定下一步操作 ↓execute-command(rawMode: true) → 发送下一条命令示例一:GDB 调试 x86-64 二进制程序
场景
一个 check_flag 程序,输入正确的 flag 才会输出 "Correct!"。程序使用了 AES 加密、MD5 哈希和 XOR 混淆。
AI 自动调试过程
只需一句话指令:
分析这个二进制程序,用 tmux 来调用 gdb 调试得到 flag
AI 自动完成了以下步骤:
1. 创建 tmux 会话并启动 GDB
tmux create-session → gdb ./check_flag (rawMode: true)2. 信息收集 — 反汇编 main 函数
AI 发现关键符号:aes_sbox、md5_shift、expected_cipher、xor_key.0、enc.1,判断这是一个 XOR + MD5 + AES 的加密流程。
3. 查看静态数据
(gdb) x/s 0x20400x2040 <xor_key.0>: "WoRkTHi3"(gdb) x/32bx 0x20500x2050 <enc.1>: 0x25 0x0a 0x24 0x0e 0x26 0x3b 0x0c 0x6c ...4. 设断点并运行
(gdb) b *main+1046 # AES 加密循环前(gdb) b *main+1749 # memcmp 调用处(gdb) runEnter flag: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5. 提取关键数据
# XOR 解密结果(gdb) x/s $rsp+0x100"reverse_challenge_key_2024"# AES IV(gdb) x/16bx $rsp+0x500x10 0x32 0x54 0x76 0x98 0xba 0xdc 0xfe0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef# memcmp 比较长度(gdb) info registers rdxrdx 0x30 # 48 字节6. AI 自动编写解密脚本并验证
AI 根据调试结果推理出完整加密流程,编写 Python 解密脚本:
from Crypto.Cipher import AESimport hashlibkey_str = b'reverse_challenge_key_2024'md5_key = hashlib.md5(key_str).digest()iv = bytes([0x10,0x32,0x54,0x76,0x98,0xba,0xdc,0xfe, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef])expected_cipher = bytes([ 0xb7,0x81,0x69,0x87,0xeb,0x02,0x46,0xef, 0x08,0x37,0x8f,0xce,0x38,0x87,0x80,0xcf, 0x31,0xeb,0x6c,0x1f,0xdb,0x5e,0xfd,0xd1, 0xf1,0xc9,0x15,0x59,0xa0,0x8e,0x11,0xec])cipher = AES.new(md5_key, AES.MODE_CBC, iv)decrypted = cipher.decrypt(expected_cipher)flag = decrypted[:-decrypted[-1]].decode()print(flag) # flag{aes_md5_r3vers3_ez!}AI 完成了从启动 GDB 到逐步分析加密逻辑、提取密钥、编写解密脚本的全过程:

程序加密流程
enc.1 XOR "WoRkTHi3" → "reverse_challenge_key_2024" │ MD5 ↓ AES-128 密钥 (16 bytes) │用户输入 → AES-128-CBC(key, IV) → 密文 → memcmp(expected_cipher)整个过程 AI 调用了约 7 次 tmux 工具,从启动 GDB 到拿到 flag,全程无需人工介入。
示例二:Frida Hook Android 应用
场景
同样的加密逻辑被移植到 Android 应用 com.example.checkflag。这次用 Frida 动态 hook,在运行时拦截加密函数并直接解密。
为什么需要 tmux
Frida 的工作模式决定了必须多窗格并行:
• Pane 1:Frida REPL(前台交互进程,持续输出 hook 日志) • Pane 2:adb 命令(触发 app UI 交互)
单终端无法同时运行两者。tmux 解决了:
1. 多窗格并行操作 2. 会话持久化(SSH 断连不丢失 Frida 会话) 3. 实时观察 hook 输出
AI 自动 Hook 过程
指令:
你当前目录是一个 app,你先阅读源码,写 frida 脚本,用 tmux 运行 frida 来 hook 这个 app(adb 已经连接)来 getflag,不要直接静态分析。
AI 的操作流程:
1. 分析源码,理解加密逻辑
AI 先用 Explore agent 阅读 app 源码,理解了:
• buildMd5Source():XOR 解密得到 MD5 源数据• md5Hash():生成 AES 密钥• NativeAES.encrypt():JNI 层 AES-CBC 加密
2. 编写 Frida 脚本
Java.perform(function() { var NativeAES = Java.use("com.example.checkflag.NativeAES"); var MainActivity = Java.use("com.example.checkflag.MainActivity"); // Hook buildMd5Source 获取 XOR 解密结果 MainActivity.buildMd5Source.implementation = function() { var result = this.buildMd5Source(); console.log("[*] buildMd5Source: " + bytesToHex(result)); return result; }; // Hook encrypt,拦截 key 和 IV,直接解密 NativeAES.encrypt.implementation = function(data, key, iv) { console.log("[*] Key: " + bytesToHex(key)); console.log("[*] IV: " + bytesToHex(iv)); // 用 javax.crypto 在设备上直接解密 var SecretKeySpec = Java.use("javax.crypto.spec.SecretKeySpec"); var IvParameterSpec = Java.use("javax.crypto.spec.IvParameterSpec"); var Cipher = Java.use("javax.crypto.Cipher"); var keySpec = SecretKeySpec.$new(key, "AES"); var ivSpec = IvParameterSpec.$new(iv); var cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(2, keySpec, ivSpec); var expectedBytes = Java.array('byte', EXPECTED_CIPHER); var decrypted = cipher.doFinal(expectedBytes); console.log("[*] Decrypted flag: " + bytesToAscii(decrypted)); return this.encrypt(data, key, iv); };});3. tmux 多窗格执行
┌─────────────────────────────────────────────┐│ Pane 1: Frida REPL ││ [Pixel 4::com.example.checkflag ]-> ││ [*] MD5 hash (AES key): 9086dc3e... ││ [*] Decrypted flag: flag{aes_md5_r3vers3... │├─────────────────────────────────────────────┤│ Pane 2: adb 操作 ││ $ adb shell input tap 540 1320 ││ $ │└─────────────────────────────────────────────┘AI 通过 tmux MCP 的操作序列:
1. create-session— 创建会话2. execute-command(rawMode: true)— 启动 Frida spawn 模式3. split-pane— 分割出第二个窗格4. execute-command— 在 Pane 2 执行 adb input 触发按钮5. capture-pane— 读取 Pane 1 的 Frida 输出

总结
tmux MCP 把 AI 从"建议者"变成了"操作者"。它不是替代逆向工程师的判断力,而是把重复性的调试操作自动化,让人可以专注在更高层的分析和决策上。
对于标准化的逆向任务(提取密钥、分析加密流程、hook 函数拦截参数),这套工作流已经可以做到端到端自动完成。

夜雨聆风