Website
中文
NotDec is
Keywords: Reverse LLVM, LLVM C Backend / llvm-cbe.
Based on Ubuntu 22.04
apt
sudo apt install wabt python-is-python3 clang-14 cmake zlib1g-dev g++ ninja-build
wasi-sdk to /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
scripts/build-debug-llvm.sh to download and build LLVM. You may encounter errors about no memory during linking, just decrease the parallel number to 1.SOUFFLE_DOMAIN_64BIT=ON文档站
本项目旨在:
学习阶段:
LLVM IR基础:只要达到能手写LLVM IR的程度就行。即主要理解各种语言特性对应的是什么样的LLVM IR代码。同时理解带alloca的半SSA形式,即alloca里的变量是非SSA,外面的是SSA。
SSA与编译优化基础
关于SSA的实验
其他不错的资料:
反编译
现有的反编译器和资料
为什么要使用LLVM IR?
优先实现wasm的反编译。

图片来自Static Single Assignment for Decompilation
反编译中的关键算法: Type Recovery(通过指令约束推导类型) Structual Analysis(恢复控制流)
由于基于LLVM IR,因此语言采用C++。
开发环境:VSCode + CMake。将Wabt,LLVM等作为CMake的外部依赖。
2023年9月7日注:由于对LLVM的调试需求越来越多,项目转为使用本地源码编译的LLVM(RelWithDebInfo或Debug build),且编译得到的二进制文件过大,因此不再推荐使用DevContainer。
VSCode DevContainer。出于性能考虑,在clone时可以直接clone到wsl的ext4文件系统里。
Remote-Containers: Rebuild and Reopen in container.如果出现了无法使用windows侧的ssh-agent提供的ssh key的forward功能: https://stackoverflow.com/questions/72293035/error-communication-with-agent-failed-when-ssh-auth-sock-is-set-but-ssh-agent
直接使用自带的C/C++调试,不知道为什么会非常慢,gdb执行backtrace要卡3秒,各种step命令要卡5-6秒。因此安装使用vscode的CodeLLDB插件。
代码补全使用clangd插件。根据提示禁用Intellisense,然后根据插件提示确认下载clangd。
反编译器自身:能够对“内存”中的变量也构建SSA进行优化。
最终的结果能够很好地重编译。
反编译器实现过程尽量记录完善的文档,未来考虑整理扩写为系列教程。
将wasm lift到LLVM IR
设计一个映射,将lift之后的IR反向转回wasm