NotDec: Webassembly Decompiler und Static Analysis Framework
Webseite
中文
Notdec ist
- Ein Projekt, das darauf abzielt, den Internal of Decompiler zu entmystifizieren.
- Eine Dekompiler eines WebAssembly, das mit neuen Dekompiler -Techniken experimentieren kann.
- Variable Wiederherstellung
- Strukturanalyse
Schlüsselwörter: Reverse LLVM, LLVM C Backend / LLVM-CBE.
Entwicklung - Linux
Basierend auf Ubuntu 22.04
- Abhängigkeiten installieren
- Verwenden Sie
apt sudo apt install wabt python-is-python3 clang-14 cmake zlib1g-dev g++ ninja-build
- Installieren Sie
wasi-sdk an /opt wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz -P /tmp
sudo tar xf /tmp/wasi-sdk-20.0-linux.tar.gz -C /opt
- Klonen Sie dieses Repo
- Installieren Sie LLVM 14
- Führen Sie
scripts/build-debug-llvm.sh aus, um LLVM herunterzuladen und zu erstellen. Sie können beim Verknüpfen Fehler über keinen Speicher stoßen. Verringern Sie einfach die parallele Nummer auf 1.
- Souffle installieren
- https://souffle-lang.github.io/build und setzen Sie
SOUFFLE_DOMAIN_64BIT=ON
- CMake Build
中文
文档站
NotDec: 反编译器原理分析
本项目旨在 :
- 学习现有反编译器的原理 , 系统地总结现有反编译器的工作 , 算法
- 选择合适的算法 , 尝试实现自己的反编译器
资料收集
学习阶段 :
Llvm ir 基础 : llvm ir 的程度就行。即主要理解各种语言特性对应的是什么样的 llvm ir 代码。同时理解带 alloca 的半 ssa 形式 , 即 alloca 里的变量是非 ssa , 外面的是 SSA。
SSA 与编译优化基础
- 《Engineering A Compiler》 上来先看 9.3 章 , 深入研读。其他的章节没那么重要 深入研读。其他的章节没那么重要 深入研读。其他的章节没那么重要
- 再找找其他讲过 SSA 的中文书?
关于 SSA 的实验
- mem2reg 实验指导 · gitbook (buaa-se-compiling.github.io)
- Lv9+.4. SSA 形式 - 北京大学编译实践课程在线文档 | 北大编译实践在线文档 (pku-minic.github.io)
其他不错的资料 :
- 《SSA -Buch》
- 《Einfache und effiziente SSA -Konstruktion》
反编译
资料
现有的反编译器和资料
规划 : 基于 llvm ir 的反编译
为什么要使用 llvm ir?
- 之后可以直接对接 SVF , 得到较好的指针分析结果。 得到较好的指针分析结果。
优先实现 WASM 的反编译。
- WASM 转 LLVM IR
- Wavm 是一个基于 llvm 的 WASM 的 JIT , 有部分逻辑是 WASM 转 LLVM IR
- 生成的 ir 不够简洁 , 有很多为了编译到汇编的冗余的内容
- Todo
规划 : 反编译阶段

图片来自 statische Einzelzuweisung zur Dekompilierung
反编译中的关键算法 : Typ -Wiederherstellung (通过指令约束推导类型) Strukturanalyse (恢复控制流)
- 前端 : 将字节码转为 llvm ir
- 中端 : 优化与分析
- 分析函数参数、分析 Callee gespeichertes Register (WASM 可以跳过这个阶段)
- SSA 构建 : 使得前端可以有些冗余的 Alloca , 由 SSA 构建来将相关 Alloca 消除。 (编译原理相关) (编译原理相关)
- GVNGCM: Globale Wertnummerierung und globale Code -Bewegung 优化算法 , 有强大的优化能力 , 有助于反混淆等。(编译原理相关)
- 内存分析 : : 将各种通过内存访问的变量显式地恢复出来。可能要用到指针分析算法 , : Memory SSA。
- 后端 : : , 将字节码转为 ast , 打印为高级语言的形式。 打印为高级语言的形式。
项目架构与工具
由于基于 llvm ir , 因此语言采用 c ++。
开发环境 : VSCODE + CMAKE 。将 WABT , LLVM 等作为 CMAKE 的外部依赖。
开发环境搭建 - DevContainer
2023 年 9月 7 日注 : 由于对 llvm 的调试需求越来越多 , 项目转为使用本地源码编译的 llvm (relwithdebinfo 或 Debug -Build) , 且编译得到的二进制文件过大 因此不再推荐使用 因此不再推荐使用 DevContainer。
VSCODE DevContainer 。出于性能考虑 , 在 Klon 时可以直接 Klon 到 wsl 的 ext4 文件系统里。
- 安装 Docker Desktop unter Windows: https://docs.docker.com/desktop/install/windows-install/ (无论是家庭版还是专业版均可)
- 其他系统直接安装 Docker
- 用 VSCODE 打开代码 , 安装 Dev Container 插件 , 按 Strg-Shift-P 然后输入查找
Remote-Containers: Rebuild and Reopen in container . - 等待构建 , 构建完成后会直接进入开发环境中。 构建完成后会直接进入开发环境中。
- 安装 cmake 相关插件 , Toolkit 选 klang。
如果出现了无法使用 Windows 侧的 SSH-Agent 提供的 SSH Key 的 Forward 功能 : https://stackoverflow.com/questions/72293035/error-communication-agent-failed-when-aututh-sock-set-set-set-ssh-agent
代码调试
直接使用自带的 c/c ++ 调试 , 不知道为什么会非常慢 , Gdb 执行 Backtrace 要卡 3 秒 , 各种 Schritt 命令要卡 5-6 秒。因此安装使用 vscode 的 codellDB 插件。
代码补全使用 clangd 插件。根据提示禁用 IntelliSense , 然后根据插件提示确认下载 clangd。
提交代码前
- 写好 Nachricht begehen , 简要概况所有的修改。 简要概况所有的修改。
- 检查添加的代码的注释和文档是否充足。
Todo
反编译器自身 : 能够对 "内存" 中的变量也构建 SSA 进行优化。 进行优化。
最终的结果能够很好地重编译。
反编译器实现过程尽量记录完善的文档 , 未来考虑整理扩写为系列教程。 未来考虑整理扩写为系列教程。
将 WASM LIFT 到 LLVM IR
- 支持将 wasm 内存直接映射到某个基地址 , 从而直接支持运行 , 以及 Gedächtnis wachsen 相关指令。
- 支持 Zwerg 调试信息 , 从而映射回原 wat , wasm
设计一个映射 , 将 heben 之后的 ir 反向转回 WASM