Notdec: Webassembly Decompiler وإطار التحليل الثابت
موقع إلكتروني
中文
Notdec هو
- مشروع يهدف إلى إزالة الغموض عن Decompiler الداخلي.
- decompiler webassembly الذي يمكنه تجربة تقنيات decompiler جديدة.
- الاسترداد المتغير
- التحليل الهيكلي
الكلمات المفتاحية: عكس LLVM ، LLVM C الخلفي / LLVM-CBE.
التنمية - لينكس
بناء على Ubuntu 22.04
- تثبيت التبعيات
- استخدم
apt sudo apt install wabt python-is-python3 clang-14 cmake zlib1g-dev g++ ninja-build
- تثبيت
wasi-sdk إلى /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
- استنساخ هذا الريبو
- تثبيت LLVM 14
- تنفيذ
scripts/build-debug-llvm.sh لتنزيل وبناء LLVM. قد تواجه أخطاء حول عدم وجود ذاكرة أثناء الارتباط ، فقط قلل من الرقم المتوازي إلى 1.
- تثبيت Souffle
- https://souffle-lang.github.io/build وتعيين
SOUFFLE_DOMAIN_64BIT=ON
- بناء cmake
中文
文档站
Notdec: 反编译器原理分析
: :
- 学习现有反编译器的原理 , 系统地总结现有反编译器的工作 , 算法
- 选择合适的算法 , 尝试实现自己的反编译器
资料收集
: :
llvm ir :
SSA 与编译优化基础
- 《هندسة مترجم》 上来先看 9.3 章 , 深入研读。其他的章节没那么重要
- 再找找其他讲过 SSA 的中文书?
关于 SSA 的实验
- mem2reg 实验指导 · gitbook (buaa-se-compiling.github.io)
- LV9+.4. SSA 形式 - 北京大学编译实践课程在线文档 | 北大编译实践在线文档 (pku-minic.github.io)
: :
- 《كتاب SSA》
- 《بناء SSA بسيط وفعال》
反编译
资料
现有的反编译器和资料
: : 基于 llvm ir 的反编译
为什么要使用 llvm ir?
- 之后可以直接对接 SVF , 得到较好的指针分析结果。
优先实现 wasm 的反编译。
- WASM 转 llvm IR
- wavm 是一个基于 llvm 的 wasm 的 jit , 有部分逻辑是 wasm 转 llvm ir
- 生成的 IR 不够简洁 , 有很多为了编译到汇编的冗余的内容
- تودو
: : 反编译阶段

图片来自 مهمة واحدة ثابتة لإزالة التجميع
: : استعادة النوع (通过指令约束推导类型) التحليل الهيكلي (恢复控制流)
- : : 将字节码转为 llvm ir
- : : 优化与分析
- 分析函数参数、分析 سجل Callee المحفوظ (WASM 可以跳过这个阶段)
- ssa : : 使得前端可以有些冗余的 leca , 由 ssa
- GVNGCM : ترقيم القيمة العالمية وحركة الكود العالمي 优化算法 , 有强大的优化能力 , 有助于反混淆等。 (编译原理相关)
- : : 将各种通过内存访问的变量显式地恢复出来。可能要用到指针分析算法 , : memory ssa。
- : : 高层控制流恢复 , 将字节码转为 将字节码转为 , 打印为高级语言的形式。
项目架构与工具
由于基于 llvm ir , 因此语言采用 c ++。
: vscode + cmake 。将 wabt , llvm 等作为 cmake 的外部依赖。
开发环境搭建 - DevContainer
2023 年 9月 7 : :
VScode devcontainer 。出于性能考虑 , 在 clone 时可以直接 clone 到 wsl 的 ext4 文件系统里。
- 安装 Docker Desktop على Windows : https://docs.docker.com/desktop/install/windows-install/ (无论是家庭版还是专业版均可)
- docker
- 用 حاويات VScode 打开代码 , 安装 حاويات dev 插件 , 按 ctrl-shift-p 然后输入查找
Remote-Containers: Rebuild and Reopen in container . - 等待构建 , 构建完成后会直接进入开发环境中。
- 安装 cmake 相关插件 , مجموعة الأدوات 选 clang。
如果出现了无法使用 Windows 侧的 SSH-AGENT 提供的 SSH KEY 的 إلى الأمام : https://stackoverflow.com/questions/72293035/error-communication-with-agent-failed-when-ssh-auth-sock-is-set-but-ssh-agent
代码调试
直接使用自带的 c/c ++ 调试 , 不知道为什么会非常慢 , gdb 执行 backtrace 要卡 3 秒 , 各种 命令要卡 5-6 秒。因此安装使用 vscode 的 codelldb 插件。
代码补全使用 clangd 插件。根据提示禁用 Intellisense , 然后根据插件提示确认下载 clangd。
提交代码前
- 写好 ارتكاب رسالة , 简要概况所有的修改。
- 检查添加的代码的注释和文档是否充足。
تودو
: : 能够对 "内存" 中的变量也构建 ssa 进行优化。
最终的结果能够很好地重编译。
反编译器实现过程尽量记录完善的文档 , 未来考虑整理扩写为系列教程。
将 WASM LIFT 到 llvm IR
- 支持将 wasm 内存直接映射到某个基地址 , 从而直接支持运行 , 以及 تنمو الذاكرة 相关指令。
- 支持 قزم 调试信息 , 从而映射回原 wat , wasm
设计一个映射 , 将 رفع 之后的 ir 反向转回 wasm