RetDec Imortek · v2.0.21

一个还原 算法的反编译器,不只是还原代码

机构常常需要弄懂自己没有源码的软件:一套老系统、一个买来的组件、一个来路不明又看着可疑的东西。把机器码还原成可读步骤的工具已经有了。RetDec Imortek 想再往前走一步,给这些步骤起个名字 — 这一段是高级加密标准(AES),这一段是排序,这一段是数据发送前的打包方式。

语言C++
版本v2.0.21
上游RetDec v5.0
星标2
最近一次推送不久前
为什么要 fork RetDec

上游的 RetDec v5.0 从 2022 年起就没动静了。它仍然是少数几个前端覆盖面真正广的开源反编译器之一 — 而这个覆盖面值得留着。

新增语义库还原
新增Qt 6 界面
新增可选的离线神经网络精修
新增算法、并发 & 序列化的识别
大白话

一分钟说清这是什么

问题所在

软件交付出去的形态,是机器读得懂、人读不懂的东西。一旦没有源码 — 供应商没了、合同里本来就没写、文件来自你不信任的地方 — 就没人说得清这个程序到底在干什么。靠手工去查,就是一条一条读机器指令。

解决办法

它把编译好的文件拆开,再从里面重建出 C:测试语料里全部 216 个二进制文件都能还原成可构建的 C。然后它去追意义 — 哪种密码学、哪种排序、哪种线程、哪种文件格式 — 并报告这件事成功的频率,包括它几乎不成功的那种情况。

这是给谁用的

拆恶意软件的安全团队,他们先要答案,再要代码。在跑没人有源码的软件的公司,在安全地重建或替换任何东西之前,先得有一份对它的描述。以及任何被一种从来没有文档的文件格式卡住的人 — 旧档案,或者一台只肯跟自家软件说话的机器。

给算法起出名字才是难的那部分,而它的两个数字这里都摆出来了。 给它一个还带着自己标签的二进制文件,识别器和这些标签一致;把标签剥掉,它就接近瞎猜。本页余下的部分是工程细节:加了什么、怎么测的、在哪里垮掉。
最底下那一级,真的在跑

真正的解码器,编译成了 WebAssembly

这上面的一切都是沿着抽象阶梯走的脚本化演示。这一级是真的在跑:Capstone — 和本地 RetDec 构建所链接的是同一个反汇编器 — 解码你粘贴进来的字节。

capstone — WebAssembly

791 千字节(KB),因为一个真正的 x86 解码器带着整套指令集 — 每一种编码、前缀和扩展。这就是这东西老实的大小。

解码器
—
指令数
—
这是解码器,不是反编译器。 再往上的那几级 — 提升到 LLVM 中间表示(IR)、整理控制流、给算法起名 — 是 LLVM 的活,而 LLVM 无论做到多小都塞不进一个网页。说得不是这样,会是这个站上最容易撒的谎。
Capstone 5,用 Emscripten 构建,只支持 x86。本地构建链接的是同一个库,来自 deps/capstone.
前端

原生、字节码和新兴格式

输出取决于格式,因为假装什么东西都能反编译成 C 帮不了任何人。前端接受可执行与可链接格式(ELF)、可移植可执行文件(PE)和 Mach-O 的原生二进制;字节码,包括 Java 虚拟机(JVM)class 文件、Dalvik 可执行文件(DEX)和公共中间语言(CIL);以及 CUDA 的并行线程执行(PTX)这类较新的目标。

原生

ELF · PE · Mach-O

产出 C 伪代码,外加这个 fork 真正要的那一层语义。

字节码

Python · Lua · JVM · DEX · CIL

Python 和 Lua 字节码返回的是它们自己的语言;托管代码路径产出的是 Java 系或 C# 系的输出。

新兴

WebAssembly · CUDA PTX

WebAssembly 转成 WebAssembly 文本格式(WAT)。PTX 是当作一等输入来处理的,不是事后补的。

交互演示

看一个函数爬上抽象阶梯

挑一个二进制函数,让它一步步走过流水线:原始字节、反汇编、抬升后的 IR、C 伪代码,最后是语义判定 — 那个有名字的算法,以及识别出它的证据。

抽象的五级:原始字节、反汇编、抬升后的 IR、C 伪代码,以及有名字的算法连同它的规格出处
滑动查看完整示意图 →
最后那一级才是产品。 它上面的一切,别的反编译器已经给你了。

retdec — 规格提取


          

语义判定

尚未还原
一步步走到语义阶段。

证据

置信度
—
模式
不看符号名

符号被剥掉之后,还原只能靠结构本身 — 常量、轮数、控制流形状。那是难的那种情况,也是实测 F1 0.056 所指的那一种。

这是为这个页面写的、把真实还原阶段串起来的脚本化演示。反编译器本身是 C++,离线运行。
它能还原什么

六类结构

运行时

标准模板库(STL)容器和 C++ 运行时结构 — 一个 std::vector 的形状从分配模式里重新浮现出来。

密码学

AES、安全散列算法(SHA)家族、ChaCha20、Rivest–Shamir–Adleman(RSA)以及椭圆曲线原语,靠常量和轮结构辨认出来。

排序 & 查找

内省排序、归并排序、二分查找 — 包括那个会暴露内省排序身份的深度限制切换。

图

图算法,外加广度优先搜索(BFS)和深度优先搜索(DFS)的遍历模式。

并发

std::thread、pthreads、OpenMP、线程构建模块(TBB)和裸原子操作。

序列化

Protobuf、FlatBuffers、MessagePack、JavaScript 对象表示法(JSON)和可扩展标记语言(XML)的封帧。

实测

216 个二进制文件,以及那个难看的数字

测试语料里全部 216 个 ELF 二进制文件,加上 --buildable之后都能产出可构建的 C 代码,而这个选项默认就是开的。算法还原是另一回事,老实的报告方式是把两个数字并排放出来。

指标结果条件
可构建的 C 输出216 / 216--buildable,默认开启
算法还原 F10.056不借助符号名,95% 置信区间 0.034–0.083
算法还原 F11.000借助符号名,带符号的二进制文件
默认的 .c 能重新编译否这个 fork 和原版 RetDec 都不行
这两个 F1 数字要一起读。 有符号时的 1.000 意味着识别器和符号表意见一致。没有符号时的 0.056 意味着在剥掉符号的二进制上做结构还原,今天还接近瞎猜。只报第一个数字是营销;只报第二个数字,则会掩盖一件事:只要流水线有点线索可循,它是能工作的。
神经网络精修

可选、离线,而且要过关卡

精修通过 llama.cpp 用 GGUF 模型来跑,完全离线,而且只在设置了 RETDEC_NEURAL_REFINE=1 并给出模型路径时才跑。它默认关闭,也从不取代基线输出。

  • 编译关卡。 精修后的输出必须先通过 gcc -fsyntax-only 才会被接受。
  • 结构校验。 精修结果必须仍然对应抬升出来的结构。
  • 确定性基线保留。 没精修过的反编译器输出仍然是那份可审计的产物。如果你要为一个结论辩护,你辩护的是那一份。
  • 不联网。 本地 GGUF 推理。关于你那个二进制文件的任何信息都不会离开这台机器。
$ export RETDEC_NEURAL_REFINE=1
$ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf
$ retdec-decompiler --buildable ./target.elf
这是给谁用的

在源码已经不在的时候,弄清楚一个程序在做什么

软件发出来的样子,是机器读得懂、人读不懂的。这个工具把它重新拆开,用大白话告诉你这个程序实际上在做什么。

01

拆解恶意软件的安全团队

你拿到的不是一页页读不懂的代码,而是答案:这一段在打乱数据,这一段是它怎么回连控制端的,这一段是它怎么藏起来的。这才是分析人员最先需要的那一块。

02

有老软件但没有源码的公司

系统还在撑着业务,而当初写它的人几年前就走了。这个工具还原出一份关于它做什么的描述,而在任何人能安全地重建或替换它之前,你需要的正是这个。

03

任何被一个没人写过文档的文件格式卡住的人

老档案、一台只跟自家软件说话的机器、竞争对手导出的文件。这个工具把结构弄清楚,好让你自己的软件能读。

在这里看到你自己的情况了吗? 它现在已经开放测试,而它是为哪些人做的,那些人的反馈才是真正会改变它的。 成为测试用户 →
界面

Qt 6 图形用户界面(GUI),或者完全不用 GUI

C、汇编、IR 和控制流图之间同步的代码视图,配上函数导航、字符串检视、二进制浏览器和一个助手面板。无界面模式去掉全部 GUI 依赖,所以同一份构建也能在持续集成(CI)里跑。

双重许可

开源使用适用 GNU Affero 通用公共许可证(AGPL-3.0+),专有部署则用商业授权。版权归 Odin Loch,以 Imortek 名义经营,2025–2026 年。

在 v2.0.21 上可以发布。CI 关卡反映的是开发阶段的标准,不是生产成熟度的标准 — 这是项目自己说的,不是推断出来的。