最近没活了, 表演一个咬打火机 随便找个软件逆向着玩玩. 纯水博客来的.
选中了某款 AI 热潮大力降价推广营销的工具, 想看看能不能把它的 API 抓包出来自己用.
TL;DR: Vibe Reverse Engineering 好像有那么点说法
引用某群友发言
逆向 Rust 二进制
直接装证书抓包就能抓到 API 请求, 发现整个请求体是一个 JSON, 其中的 message 是很长一串 base64, 无法 decode 出有意义的内容, 明显加密了.
追溯请求来源的进程, 发现其处理逻辑在一个 DLL 里.
IDA Pro 打开没发现特别的 Imports 和 Exports, 但发现 Strings 里有很多可读的字符串, 其中包括大量的 cargo 和 crates. 看起来这是一个 Rust 写的 DLL.
完了, 还不会写 Rust 就要开始 Rust 逆向了.
菜鸟教程, 启动!.jpg
两个小时后: 我确信我已经学会 Rust 了, 尽管我只写了个 Hello World.
修复符号
通过速成, 我了解到 Rust 是个比较奇妙的语言, 它没有稳定的 ABI, 所有的依赖库需要拉源码下来静态编译在一起. 然后就会像 Golang 一样打出巨大的 binary.
用 IDA Pro 打开, 这一个 100M 的二进制分析了半天分析出来 250,000+ 个 func, 并且全部 strip 完没有任何符号, 库和用户代码全混在一起, 并且 rustc 还有激进的优化, 并且 Rust 自己的一堆所有权的移动还会生成很多样板代码. 可能看到一个可疑的函数, 追进去追了半天发现是个库或者是个结构体拷贝甚至是 Display 实现. 这个恶心程度和 C++ class 满天乱飞的指针坐一桌.
我先尝试硬干从 API 发出请求的地方断点沿着栈追溯, 不过追到 tokio 的异步逻辑里就断了, 后来决定还是要花时间修复一下符号.
先尝试了我之前用过的第三方 Lumina 服务器 https://abda.nl/lumen/, 不过并不顺利, IDA Pro 7.x 和 9.x 版本连接到服务器拉符号似乎都会卡在请求上, 我合理怀疑是这个巨大的二进制让服务器卡了, 或者服务器恰好有点问题.
后来找到另外一些工具可以修复 Rust 的符号, 例如 rustbinsign 和 Cerberus, 还有其他很多.
它们的原理基本上是识别二进制中引用的库和使用的 toolchain 版本, 重新编译这些库之后进行 sign 对应符号与 asm, 再导入到 IDA 中.
Cerberus 我没跑通, rustbinsign 的默认参数跑了大半天, 最后只修出了大约 1/10 的符号, rustbinsign 是推荐使用 --full-compilation 参数获取更好的结果, 不过这样需要拉 git 仓库编译, 这坨💩山的依赖拉了 150G 都没编译完, 由于硬盘不够+Windows 环境难配暂时先放弃了. 下次有别的 Rust 目标再尝试.
至少也修出了一些重要的符号
一些其他插件
- findcrypt 照样是好用的工具, 专查 AES/Base64/RSA 等加密算法入口
- IDARustHelper 用于识别 Rust 里不太一样的 string 结构
Vibe Reverse Engineering
这下符号虽然修了点, 但调试断点断不出来, 只能继续苦力一层层追了… 需要惊人的注意力…
等等? 注意力! 为什么不能让最擅长 attention 的 LLM 帮我逆向呢, 于是我找到了:
安装之后我直接把 MCP 配进了 VS Code, 这样 Copilot 就能直接调用了.
我尝试了 Gemini-3-Pro-Preview / GPT-5.2-Codex / Claude Sonnet 4.5 / Claude Opus 4.5 四个模型.
Prompt 也不需要什么花里胡哨的, 直接了当即可:
1 | 帮我调用 IDA Pro MCP,分析其中打开的这个 AI 相关的程序是如何加密请求字符串的,请关注其中 xxx/yyy 相关的调用点 |
这里的 xxx/yyy 可以直接写请求的 API, 不过我的实践中, 如果能给出自己分析得到的中间结果或者发现的可疑点, 效果会好不少, 模型不容易跑飞.
大模型分析一段时间后可能会偷懒停下来, 此时我会人工 review 一下逆向结果, 如果完全跑偏了就重开 Session, 还在有点像是正确的方向就继续引导, 类似:
提供一些让 LLM 自主验证结果和迭代的依据(很重要的一步, 省了很多自己验证的功夫):
1 | req.txt 是我实际抓包得到的一个请求,尝试用你的发现解密 req.txt |
让它别瞎猜:
1 | 仔细使用 IDA Pro 分析,梳理链路,确认你之前的发现是否正确,而不是盲目猜测或暴力 |
在我的这次分析&测试中, Gemini-3-Pro-Preview 在长上下文会开始死循环或者出现严重的幻觉, Claude Sonnet 4.5 则是无论如何 prompt 都不愿意积极地调用 MCP, 随意调用几次就开始瞎编.
GPT-5.2-Codex 会非常积极地调用模型, 在重置了几次对话后, 换了几组切入点尝试引导后, 第一个正确分析出加密算法, 并给出了正确解密的 Python 代码.
Claude Opus 4.5 比起摆烂的 Sonnet 积极很多, 在一开头就快速分析出了关键的加密方法, 边调用工具还会边和用户解释, 看起来逻辑更加清晰. 但就不像 GPT 5.2 那么注意力”旺盛”和”飘忽不定”, 最后不知怎么就没注意到藏在 HTTP Header 的几个关键参数, 原地打转, 卡到 context 用完也没解密成功.
由于 Opus 更贵, 我就没有反复尝试. 我相信多试几轮也是能成功的.
Claude Opus 的对话记录(算是基本解密了加密算法, 输出的文档比 GPT 更详细)
回顾
最后的分析结果就是, 它采用了一个经过三次 XOR 混淆的硬编码密钥用标准的 AES-256-GCM 加密请求体, 每个请求发出时, 还会再随机一些字节 XOR 到密钥上, 并且把这些随机字节随请求一起发出; Nonce 就是普通的拼在密文前面.
并不是什么高明的手法, 甚至可以算得上简单… 唯一难点在于耐心在很冗长的 Rust 反编译结果里梳理清逻辑. 后续的接口逆向就是纯粹的观察 API 行为, 不再赘述.
我也回顾了 AI 的分析结果, 其实我自己按 findcrypt 找到的 Base64 特征表, 向前追溯, 多花一点时间也可以定位到这段逻辑. 实际上, 我在放弃之前已经分析到了第二个 xref, 我要找的逻辑就在第四个 xref 旁边. 手动操作时我还可以调试, 直接拿到去混淆过后的密钥, 理论上会比静态分析更加容易.
但 LLM 逆向的出现确实在这次分析中帮到了我不少, 本来可能需要大半天时间的分析, 在 LLM 的帮助下两小时就搞定了. 更重要的是, 我省了很多盯着逆向结果一点点看的力气, 干的轻松了不少.
最后要指出的是, 我完全不赞同 AI/LLM 包办一切的 Vibe XXX 模式. 在我的本次体验中, 人类仍然需要做好充分的准备 (例如基本的目标信息收集, 修复结构/符号, 初步的分析), 以及在 LLM 干活的同时给予合适的 Prompt/充分的监督和引导, 让 LLM 代劳苦力而不是代劳思考, 才能达到最好的效果.
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/rust-and-vibe-reverse-engineering/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬