加入我们的 Discord 频道
Squalr 是一个用 Rust 编写的高性能动态分析逆向工程工具。
首先,Squalr 是一个极速的内存扫描器,允许用户搜索并修改运行中的进程内存。通过多线程与 SIMD 结合实现快速扫描,能够在数秒内处理数 GB 的数据。虽然所有 CPU 都支持,但为了获得最佳性能,你的 CPU 需要支持 SSE、AVX 或 AVX-512。
与大多数逆向工程工具不同,动态分析在 Squalr 中是核心功能。这使得可以通过分析程序随时间的行为,实现其他方式无法完成的工作流程。
Squalr 是 Squalr-Sharp 的精神继承者。正在寻找旧的 C# 仓库?请参见 Squalr-Sharp。请注意,Squalr-Sharp 已不再维护,Squalr 已成为开发重点。
本项目与我们团队成员的雇主无关,无论过去、现在还是将来。

Squalr 可以作为桌面应用、终端工具、Android 应用或作为 Rust crate 用于自定义扫描工作流。
当你需要完整的交互工作流时使用:进程选择、元素扫描、数组/字符串扫描、指针扫描、内存查看器、项目文件、符号布局以及插件支持的工具。
| 平台 | GUI | CLI | TUI | 远程(主机) | 远程(终端) |
|---|---|---|---|---|---|
| Windows | ✅ | ✅ | ✅ | ✅ | ✅ |
| Linux | ✅ | ✅ | ✅ | ✅ | ✅ |
| Mac | ✅ | ✅ | ✅ | ✅ | ✅ |
| Android(已 Root) | ✅ | ✅ | ✅ | ❌ | ✅ |
| iPhone(尚不可用) | ✅ | ✅ | ✅ | ❌ | ✅ |
插件是扩展 Squalr 行为的途径。现有的插件 crate 覆盖了内置插件、24 位数据类型、指令提供程序、二进制符号和 Dolphin 内存视图路由。中期目标是让插件能够扩展数据类型、项目项类型、虚拟模块、中间件和工具,而无需修改核心应用。
脚本编写功能正在规划中,但目前尚无稳定的公共脚本接口。
当你希望嵌入 Squalr 的组件而不是运行 Squalr 前端时,直接使用这些 crate。根据你希望 Squalr 负责的工作流部分选择合适的层级。
| 使用者 | 你提供的内容 | Squalr 提供的内容 | Crates |
|---|---|---|---|
| 字节扫描器 | 你自己的字节、快照、文件、模拟器转储或捕获的内存缓冲区 | 扫描计划、数据类型、快照结构、扫描执行和结果过滤 | squalr-engine-api, squalr-engine-scanning |
| 自定义目标集成器 | 你自己的目标实现,例如模拟器、调试器、远程代理、跟踪记录器或沙箱 | 用于内存映射、读取、写入、模块和目标句柄的稳定目标特征 | squalr-engine-api, squalr-engine-targets, squalr-engine-scanning |
| 原生进程扫描器 | 一个本地进程,希望 Squalr 枚举、打开、读取、写入和扫描 | 原生 Windows/macOS/Linux/Android 目标访问加上扫描 crate | squalr-engine-api, squalr-engine-targets, squalr-engine-targets-native, squalr-engine-scanning |
| Squalr 前端或自动化 shell | 一个 GUI、CLI、TUI、机器人或命令运行器,希望使用常规的 Squalr 工作流 | 会话状态、命令调度、应用级编排、目标 I/O 协调、扫描、项目和响应 | squalr-engine-session, squalr-engine |
| 命令行适配器 | 一个 CLI、REPL、远程 shell 或脚本桥,希望将用户输入的命令转化为引擎命令 | 命令语法、别名、帮助/版本处理以及转换为共享命令模型 | squalr-engine-api |
| 项目与符号工具 | 需要读取、写入、检查或转换 Squalr 项目的工具 | 项目文件、符号目录、布局、定位器和共享数据模型 | squalr-engine-api, squalr-engine-projects |
squalr-engine-api 是共享模型 crate。它包含其他层使用的公共数据类型:扫描计划、值、快照、结果、命令、符号和面向项目的结构。
如果你已经拥有字节,请停留在字节扫描器层:构造 SnapshotRegion 值,将它们包装为 Snapshot,然后调用 ElementScanner::scan_snapshot。此路径不需要进程句柄或原生目标后端。
如果你希望扫描真实进程,请将目标 I/O 和扫描保持为独立阶段。使用 squalr-engine-targets 作为抽象,当你需要 Squalr 的原生后端时使用 squalr-engine-targets-native,然后将收集到的内存送入 squalr-engine-scanning。
如果你希望获得完整的 Squalr 应用工作流,请使用会话/命令 crate,而不是自行组装较低层级。该路径适用于希望 Squalr 协调目标访问、扫描、项目和响应的使用者。
系统级工作需要用系统级语言。选择 Rust 是因为它消除了整个类别的 bug,并且非常适合这项任务。
在评估了几个前端框架后,我们最终选择了 egui。Egui 为我们提供了较小的二进制文件大小、原生速度、跨平台性以及易于访问应用程序数据进行显示。
中期来看,Squalr 的目标是使用现代插件系统实现可扩展性。不再需要将插件解压到特殊位置并在每次发布时手动升级。这意味着一个真正的市场,包括大量免费且易于安装的插件。虽然目前尚未实现,但 Squalr 的开发已考虑到开发者希望扩展类型系统、项目系统、注册自定义工具以及注册中间件以支持扫描模拟器内存或其他特定场景的需求。
此外,我们很快将支持脚本编写。我们尚未决定使用哪种语言。虽然大多数人会立刻想到 Lua 或 Python,但这些语言缺乏健壮的数据类型,导致需要笨拙的变通方法。因此,我们尚不清楚将使用什么替代方案,或者是否存在可行的替代选择。
最终,Squalr 将在静态分析方面展开竞争,但初期不会。目前,Squalr 刻意不构建 ASM 到 C++ 的反编译器、代码图或调试器。
长期来看,我们确实希望融入 AI 领域,并以切实为用户创造价值的方式进行。以下是我们打算尝试的几个想法:
Linux 构建通过以下入口点验证:
cargo build -p squalr-cli --lockedcargo build -p squalr-tui --lockedcargo build -p squalr --locked构建前安装原生依赖:
pkg-configlibasound2-devlibudev-devlibxkbcommon-devlibwayland-devlibx11-devlibxcursor-devlibxi-devlibxrandr-devlibxinerama-devAndroid 构建目前已在目标 aarch64-linux-android 上验证,API 级别为 30。
目标:安装 GUI APK,推送特权工作进程,并在 Rooted IPC 模式下运行 GUI。
先决条件:
ANDROID_HOME。ANDROID_NDK_ROOT。rustup target add aarch64-linux-android。cargo install cargo-ndkadb 连接的已 Root 设备。然后在工作区根目录运行以下任一命令:
python ./scripts/build_and_deploy.py(完整冒烟验证:预检 + 构建 + 安装 + 启动 + IPC 工作进程检查)python ./scripts/build_and_deploy.py --compile-check(自动只编译路径:预检 + Android Rust 构建 + GameActivity APK 打包,无需设备)python ./scripts/run_apk.pypython ./scripts/debug_run_privileged_shell.py注意:
ANDROID_HOME、ANDROID_NDK_ROOT、目标安装以及 aarch64-linux-android-clang 的可访问性),然后运行:
cargo ndk --target aarch64-linux-android build -p squalr-clicargo ndk --target aarch64-linux-android build -p squalrtarget/android-gameactivity-gradle 下的 Gradle 项目,使用 androidx.games:games-activity,因此 Android 软输入状态由 GameActivity 而非 NativeActivity 处理。third_party/winit-0.30.13 下的工作区补丁,用于 winit 0.30.13。该补丁保持上游 Android 按键事件处理,将 GameActivity 的文本提交转发到 egui 的正常键盘文本路径,在 IME 激活时抑制重复的可打印按键事件,并在每次提交后清除隐藏的 GameActivity 文本缓冲区。target/android-gradle 下固定的本地 Gradle 发行版进行 GameActivity 打包。要覆盖此设置,请将 SQUALR_ANDROID_GRADLE 设置为兼容的 Gradle 可执行文件。/data/local/tmp/squalr-cli,运行 su -c chmod +x,启动应用,并验证特权工作进程启动。Build in release mode? (y/n [default])。--release 或 --debug 以避免提示。--release 优先使用发布构件;如果未配置发布签名([package.metadata.android.signing.release]),APK 构建会自动回退到调试。adb install 在已有安装上失败,请先卸载:
adb uninstall com.squalr.androidsqualr-cli 可以暴露一个 JSON HTTP 控制接口,用于自动化和集成测试:```text
squalr-cli --http-ipc 127.0.0.1:49321
在Android上,以root身份运行它,并从主机转发端口:```text
adb shell su 0 sh -c "/data/local/tmp/squalr-cli --http-ipc 127.0.0.1:49321"
adb forward tcp:49321 tcp:49321
初始端点有:
GET /healthPOST /command 使用序列化的 PrivilegedCommand JSON 主体,返回 PrivilegedCommandResultGET /events?after=<event_id> 用于轮询引擎事件为了通过 HTTP IPC 端到端验证 Android 调试器路径,请运行:```text python ./scripts/android_http_debugger_smoke.py
烟雾构建发布Android产物,推送一个原生watch目标进程,该进程广告一个静态计数器地址,通过HTTP驱动`Process.Open`以及读/写/访问调试器跟踪,并验证目标在每个跟踪停止并分离后持续发送心跳。
常见的预检失败示例:```text
> rustup target list --installed
aarch64-linux-android
wasm32-unknown-unknown
x86_64-pc-windows-msvc
ANDROID_NDK_ROOT is not set.
如果出现此情况,请将 ANDROID_NDK_ROOT 设置为您的 Android NDK 路径,然后重新运行脚本。
macOS 构建通过以下入口点进行验证:
cargo build -p squalr-cli --lockedcargo build -p squalr-tui --lockedcargo build -p squalr --locked运行目标:
cargo run -p squalr-cli -- process list -w -l 20cargo run -p squalr-tuicargo run -p squalrSqualr 在 macOS 上使用 Mach API(task_for_pid、mach_vm_read_overwrite、mach_vm_write)来打开和检查目标进程。如果这些调用被阻止,进程的打开/读取/写入操作将失败。
要启用这些功能,必须禁用系统沙箱安全功能。请注意,这会影响您的整个系统,并使您的系统更容易受到恶意软件的攻击!除非您知道自己在做什么,否则不建议这样做。