NOTDEC: Breadwork de WebAssembly Decompiler y Analysis Static
Sitio web
中文
NotDec es
- Un proyecto que tiene como objetivo desmitificar la interna del descompilador.
- Un descompilador de WebAssembly que puede experimentar con nuevas técnicas de descompilador.
- Recuperación variable
- Análisis estructural
Palabras clave: Reverse LLVM, LLVM C Backend / LLVM-CBE.
Desarrollo - Linux
Basado en Ubuntu 22.04
- Instalar dependencias
- Usar
apt sudo apt install wabt python-is-python3 clang-14 cmake zlib1g-dev g++ ninja-build
- Instale
wasi-sdk a /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
- Clon este repositorio
- Instalar LLVM 14
- Ejecutar
scripts/build-debug-llvm.sh para descargar y construir llvm. Puede encontrar errores sobre ninguna memoria durante el enlace, solo disminuir el número paralelo a 1.
- Instalar Souffle
- https://souffle-lang.github.io/build y establecer
SOUFFLE_DOMAIN_64BIT=ON
- construcción de cmake
中文
文档站
NotDec: 反编译器原理分析
本项目旨在 :
- 学习现有反编译器的原理 , 系统地总结现有反编译器的工作 算法 算法
- 选择合适的算法 尝试实现自己的反编译器 尝试实现自己的反编译器
资料收集
学习阶段 :
Llvm ir 基础 : 只要达到能手写 llvm ir 的程度就行。即主要理解各种语言特性对应的是什么样的 llvm ir 代码。同时理解带 alloca 的半 ssa 形式 , 即 alloca 里的变量是非 ssa , 外面的是 ssa。
SSA 与编译优化基础
- 《Ingeniería Un compilador》 上来先看 9.3 章 深入研读。其他的章节没那么重要 深入研读。其他的章节没那么重要
- 再找找其他讲过 SSA 的中文书?
关于 SSA 的实验
- MEM2GREG 实验指导 · GITBOOK (BUA-SE-COMPLIEND.GITHUB.IO)
- LV9+.4. SSA 形式 - 北京大学编译实践课程在线文档 | 北大编译实践在线文档 (pku-minic.github.io)
其他不错的资料 :
- 《Libro de SSA》
- 《Construcción SSA simple y eficiente》
反编译
资料
现有的反编译器和资料
规划 : 基于 llvm ir 的反编译
为什么要使用 llvm ir?
- 之后可以直接对接 SVF 得到较好的指针分析结果。 得到较好的指针分析结果。
优先实现 wasm 的反编译。
- Wasm 转 llvm ir
- Wavm 是一个基于 llvm 的 wasm 的 jit , 有部分逻辑是 wasm 转 llvm ir
- 生成的 ir 不够简洁 有很多为了编译到汇编的冗余的内容 有很多为了编译到汇编的冗余的内容
- HACER
规划 : 反编译阶段

图片来自 Asignación única estática para la descompilación
反编译中的关键算法 : Tipo de recuperación (通过指令约束推导类型) Análisis estructural (恢复控制流)
- 前端 : 将字节码转为 llvm ir
- 中端 : 优化与分析
- 分析函数参数、分析 Registro guardado de Callee (WASM 可以跳过这个阶段)
- SSA : : 使得前端可以有些冗余的 Alloca , 由 SSA 构建来将相关 Alloca 消除。 (编译原理相关)
- GVNGCM: numeración de valor global y movimiento del código global 优化算法 , 有强大的优化能力 有助于反混淆等。(编译原理相关) 有助于反混淆等。(编译原理相关)
- 内存分析 : 将各种通过内存访问的变量显式地恢复出来。可能要用到指针分析算法 , : Memoria SSA。
- 后端 : 高层控制流恢复 将字节码转为 将字节码转为 AST , 打印为高级语言的形式。
项目架构与工具
由于基于 llvm ir , 因此语言采用 c ++。
开发环境 : VScode + CMake 。将 Wabt , LLVM 等作为 CMake 的外部依赖。
开发环境搭建 - DevContainer
2023 年 9月 7 日注 : 由于对 llvm 的调试需求越来越多 , 项目转为使用本地源码编译的 llvm (relwithdebinfo 或 depuración construye) , 且编译得到的二进制文件过大 因此不再推荐使用 因此不再推荐使用 devcontainer。
VScode DevContainer 。出于性能考虑 , 在 clon 时可以直接 clon 到 wsl 的 ext4 文件系统里。
- 安装 Docker Desktop en Windows: https://docs.docker.com/desktop/install/windows-install/ (无论是家庭版还是专业版均可)
- 其他系统直接安装 Docker
- 用 Vscode 打开代码 , 安装 安装 CONTENEDORES DE DEV 插件 按 按 CTRL-SHIFT-P 然后输入查找
Remote-Containers: Rebuild and Reopen in container . - 等待构建 构建完成后会直接进入开发环境中。 构建完成后会直接进入开发环境中。
- 安装 cmake 相关插件 , kit de herramientas 选 clang。
如果出现了无法使用 Windows 侧的 SSH-AGENT 提供的 Clave SSH 的 Avance 功能 : https://stackoverflow.com/questions/72293035/error-communication-with-agent-failed-when-ssh-auth-sock-isset-sh-agent
代码调试
直接使用自带的 C/C ++ 调试 , 不知道为什么会非常慢 , GDB 执行 Backtrace 要卡 3 秒 , 各种 Paso 命令要卡 5-6 秒。因此安装使用 Vscode 的 Codelldb 插件。
代码补全使用 CLANGD 插件。根据提示禁用 IntelliSense , 然后根据插件提示确认下载 CLANGD。
提交代码前
- 写好 Mensaje de confirmación 简要概况所有的修改。 简要概况所有的修改。
- 检查添加的代码的注释和文档是否充足。
HACER
反编译器自身 : 能够对 “内存” 中的变量也构建 SSA 进行优化。
最终的结果能够很好地重编译。
反编译器实现过程尽量记录完善的文档 未来考虑整理扩写为系列教程。 未来考虑整理扩写为系列教程。
将 Wasm Lift 到 llvm ir
- 支持将 wasm 内存直接映射到某个基地址 , 从而直接支持运行 以及 以及 以及 crecimiento de la memoria 相关指令。
- 支持 enano 调试信息 从而映射回原 从而映射回原 wat , wasm
设计一个映射 , 将 将 之后的 之后的 ir 反向转回 wasm