NotDec: WebAssembly Decompiler e Static Analysis Framework
Site
中文
Notdec é
- Um projeto que visa desmistificar o interno do decompilador.
- Um decompilador de montagem webs que pode experimentar novas técnicas de decompilador.
- Recuperação variável
- Análise estrutual
Palavras-chave: reverse llvm, llvm c backend / llvm-cbe.
Desenvolvimento - Linux
Baseado no Ubuntu 22.04
- Instalar dependências
- Use
apt sudo apt install wabt python-is-python3 clang-14 cmake zlib1g-dev g++ ninja-build
- Instale
wasi-sdk para /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
- Clone este repo
- Instale o LLVM 14
- Execute
scripts/build-debug-llvm.sh para baixar e construir llvm. Você pode encontrar erros sobre nenhuma memória durante a ligação, basta diminuir o número paralelo para 1.
- Instale suflê
- https://souffle-lang.github.io/build e defina
SOUFFLE_DOMAIN_64BIT=ON
- Cmake Build
中文
文档站
NotDec: 反编译器原理分析
本项目旨在
- 学习现有反编译器的原理 , 系统地总结现有反编译器的工作 , 算法
- 选择合适的算法 , 尝试实现自己的反编译器
资料收集
学习阶段
Llvm ir 基础 : 只要达到能手写 llvm ir 的程度就行。即主要理解各种语言特性对应的是什么样的 llvm ir 代码。同时理解带 aloca 的半 ssa 形式 , 即 aloca 里的变量是非 ssa , 外面的是 ssa。
SSA 与编译优化基础
- 《Engenharia um compilador》 上来先看 9.3 章 , 深入研读。其他的章节没那么重要 深入研读。其他的章节没那么重要
- 再找找其他讲过 SSA 的中文书?
关于 SSA 的实验
- Mem2reg 实验指导 · Gitbook (buaa-se-compiling.github.io)
- Lv9+.4. SSA 形式 - 北京大学编译实践课程在线文档 | 北大编译实践在线文档 (pku-minic.github.io)
其他不错的资料
- 《SSA Book》
- 《Construção SSA simples e eficiente》
反编译
资料
现有的反编译器和资料
规划 : 基于 llvm ir 的反编译
为什么要使用 llvm ir?
- 之后可以直接对接 svf , 得到较好的指针分析结果。
优先实现 Wasm 的反编译。
- Wasm 转 llvm ir
- Wavm 是一个基于 llvm 的 wasm 的 jit , 有部分逻辑是 wasm 转 llvm ir
- 生成的 ir 不够简洁 , 有很多为了编译到汇编的冗余的内容
- PENDÊNCIA
规划: 反编译阶段

图片来自 Atribuição única estática para descompilação
反编译中的关键算法 : Tipo de recuperação (通过指令约束推导类型) Análise estrutual (恢复控制流)
- 前端 : 将字节码转为 llvm ir
- 中端: 优化与分析
- 分析函数参数、分析 Callee Salved Register (WASM 可以跳过这个阶段)
- SSA 构建 : 使得前端可以有些冗余的 Alloca , 由 SSA 构建来将相关 Alloca 消除。 (编译原理相关))
- GVNGCM: numeração de valor global e movimento de código global 优化算法 , 有强大的优化能力 , 有助于反混淆等。 (编译原理相关)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) µ)))))))))))))))
- 内存分析 : 将各种通过内存访问的变量显式地恢复出来。可能要用到指针分析算法 , 类型恢复等。关键词 : Memória SSA。
- 后端 : 高层控制流恢复 , 将字节码转为 ast , 打印为高级语言的形式。
项目架构与工具
由于基于 llvm ir , 因此语言采用 c ++。
开发环境: vscode + cmake 。将 wabt , llvm 等作为 cmake 的外部依赖。
开发环境搭建 - DevContainer
2023 年 9月 7 日注 : 由于对 llvm 的调试需求越来越多 , 项目转为使用本地源码编译的 llvm (RelwithDebinfo 或 Debug Build) , 且编译得到的二进制文件过大 , DevContainer。
Vscode devContainer 。出于性能考虑 , clone 时可以直接 clone 到 wsl 的 ext4 文件系统里。
- 安装 Docker Desktop nas janelas : https://docs.docker.com/desktop/install/windows-install/ (无论是家庭版还是专业版均可))
- 其他系统直接安装 Docker
- 用 vScode 打开代码 , 安装 Recipientes de dev 插件 , 按 ctrl-shift-p 然后输入查找
Remote-Containers: Rebuild and Reopen in container . - 等待构建 , 构建完成后会直接进入开发环境中。
- 安装 cmake 相关插件 , kit de ferramentas 选 clang。
如果出现了无法使用 Windows 侧的 SSH-AGENT 提供的 Chave ssh 的 Forward 功能: https://stackoverflow.com/questions/72293035/error-communication-with-agent-dailed-when-ssh-auth-sock- is-set-ssh-agente
代码调试
直接使用自带的 C/C ++ 调试 , 不知道为什么会非常慢 , GDB 执行 Backtrace 要卡 3 秒 , Etapa 命令要卡 5-6 秒。因此安装使用 vscode 的 Codelldb 插件。
代码补全使用 Clangd 插件。根据提示禁用 Intellisense , 然后根据插件提示确认下载 Clangd。
提交代码前
- 写好 Comprometer mensagem , 简要概况所有的修改。
- 检查添加的代码的注释和文档是否充足。
PENDÊNCIA
反编译器自身 : 能够对 能够对 内存 内存 中的变量也构建 中的变量也构建 ssa 进行优化。
最终的结果能够很好地重编译。
反编译器实现过程尽量记录完善的文档 , 未来考虑整理扩写为系列教程。
将 Wasm elevador 到 llvm ir
- 支持将 Wasm 内存直接映射到某个基地址 , 从而直接支持运行 , 以及 Memory Grow 相关指令。
- 支持 anão 调试信息 , 从而映射回原 wat , wasm
设计一个映射 , 将 elevador 之后的 ir 反向转回 wasm