ARET(Automatic Reverse Engineering Toolkit)是一个用 Rust 编写的开源项目。输入一个 Windows .exe,它返回一个可以直接在 CPU 上运行的原生 Linux ELF —— 不需要 Wine、QEMU 或任何运行时虚拟化。
ARET 的工作方式是将机器码通过类型化 SSA IR 翻译为 C 语言,再用原生 shim 层重新实现系统调用,最后编译为普通原生二进制。输出可以是 ELF 或 WebAssembly 模块。
架构流程:Windows PE → x86 解码器 → 类型化 SSA IR → C 后端 / WASM 后端 → ELF 二进制 / WebAssembly + 原生 Win32/CRT HLE 层。
HLE 层不模拟 Windows 内核或 CPU,而是为程序所需的 Win32/CRT API 提供原生 C 实现(如 kernel32、msvcrt、user32)。文件路径做 Windows→POSIX 转换,线程通过 ucontext 协作式纤程实现,GUI(开发中)使用 SDL2 和 FreeType 渲染原生控件。
关键设计:共享栈模型——不做函数签名恢复,直接保留显式机器栈状态,通过传值方式传递栈指针 esp,确保 cdecl/stdcall/regparm 等调用约定下参数安全传递。
正确性原则:所有机制要么通过独立参考(Unicorn 指令、Wine API、Z3 SMT 重写)验证,要么在无法建模时明确中止,避免静默错误。
同一 IR 支持:透明编译到 C/LLVM/WASM、反编译为可读伪 C、控制流图分析、墙检测(静态发现未建模指令和缺失导入)。在 27 MB 游戏二进制上恢复了约 43k 个函数。
验证方式:差分测试,仓库包含 21 个二进制回归测试集,以 Wine 为参考。已验证 Lua 5.4.7、sqlite3.exe、NASM 2.16.01、busybox-w32、strings.exe 等,输出与 Wine 字节一致。
当前局限:仅支持 x86 32 位,64 位尚未实现;GUI 栈不完整;无 DirectX 支持;无内核驱动;依赖未文档化 Windows 内部的程序可能触发“中止”墙。
GitHub
#开发者 #工具 #ARET #Rust #逆向工程 #二进制翻译 #Linux #Windows #静态翻译
@DevToolboxHub