ataoytun/Obscura
GitHub: ataoytun/Obscura
Obscura 是 Sandboxie-Plus 的用户模式隐藏插件,通过 hook 和 PEB 操作让沙箱内程序无法检测到 Sandboxie 的存在,从而解决部分软件因检测到沙箱而拒绝运行的问题。
Stars: 0 | Forks: 0
# Obscura
一个用于 [Sandboxie-Plus](https://github.com/sandboxie-plus/Sandboxie) 的 Windows `InjectDll` 插件,
它向运行**在**沙箱**内部**的程序隐藏 Sandboxie **自身**的痕迹,
从而让那些拒绝在沙箱中运行的软件能够正常运行,
同时保持完全的隔离状态。
## 为什么会有这个项目,以及它的合法性
有些应用程序会检查自己是否处于沙箱环境中,如果是,就会退出。
这破坏了两种合法的工作流程:
- **恶意软件分析。** 分析人员希望逃避沙箱的样本能够真正执行,以便观察其行为,而不是让它检测到 Sandboxie 并退出。Obscura 会让沙箱看起来不存在,从而使样本运行并被隔离以供研究。
- **兼容性 / 隐私。** 用户希望在沙箱中运行挑剔、防篡改或包含 DRM 的应用程序以实现隔离,但当应用程序检测到 Sandboxie 时会拒绝运行。
Obscura 与 Sandboxie-Plus 提到的开源工具 [SbieHide](https://github.com/VeroFess/SbieHide) 属于同一类。它是一个**用户模式隐藏**插件:它绝不会脱离沙箱,绝不会提升特权,也绝不会削弱容器。它只是过滤或规范化那些原本会向被隔离进程暴露 Sandboxie 的查询结果。安全边界保持不变;被隔离的程序依然被安全隔离。
它仅隐藏 Sandboxie **自身**的痕迹。它不是通用的进程隐藏工具,也不能用于对抗反作弊系统(这会导致账号被封禁)。
## 它隐藏的内容
Obscura 是 SbieHide 的独立超集:它重新实现了核心隐藏功能,并填补了 SbieHide 遗漏的环节。当某个查询会泄露沙箱路径时,Obscura 会将其**规范化**为真实主机的对应路径,使得调用仍然能返回一个合理的成功值(避免产生“调用突然失败”的预言机破绽);只有在没有合适的主机值时,它才会拒绝或过滤该条目。
| 领域 | 检测途径 | ntdll hook | 处理方式 |
|---|---|---|---|
| 已加载模块 | 模块名称 / 句柄中的 SbieDll | (PEB 解链) | 从所有 4 个 Ldr 列表中移除 |
| PEB | `InLoadOrder/InMemoryOrder/InInitializationOrder/HashLinks` | (PEB 解链) | 解链 + 名称清零 |
| 内存 | SbieDll 区域的映射文件名 | `NtQueryVirtualMemory` | 隐藏镜像;规范化沙箱路径 |
| 内存 | SbieDll 区域的 `MEM_IMAGE` | `NtQueryVirtualMemory` | 报告为 `MEM_PRIVATE` |
| 节 (Section) | SbieDll 节的原始基址 | `NtQuerySection` | 对隐藏范围拒绝请求 |
| 对象 | 基于沙箱的对象名称 | `NtQueryObject` | 规范化至主机;仅限沙箱的对象 -> 无名称 |
| 文件 | 基于沙箱的文件路径 | `NtQueryInformationFile` | 规范化至主机路径 |
| 系统 | 模块列表中的 `SbieDrv.sys` | `NtQuerySystemInformation` | 移除槽位 + 压缩列表 |
| 系统 | `SbieSvc.exe` / 沙箱进程 | `NtQuerySystemInformation` | 剔除相关条目 |
| 进程 | 沙箱路径 / 命令行 | `NtQueryInformationProcess` | 规范化至主机 |
| 对象 | Sandboxie 命名对象 | `NtQueryDirectoryObject` | 过滤;保留大小探测状态 |
| 设备 | `\Device\SandboxieDriverApi` | `NtOpenFile` / `NtCreateFile` | 读取结果为未找到 |
| 注册表 | `Services\SbieDrv` / `SbieSvc` | `NtOpenKey` / `NtEnumerateKey` | 拦截 / 跳过索引 |
| 注册表 | 沙箱配置单元键路径 | `NtQueryKey` | 规范化为真实配置单元 |
| 令牌 (Token) | 完整性低于 Medium | `NtQueryInformationToken` | 提升至 Medium |
所有内容都不会硬编码为特定的沙箱或用户名:沙箱根目录是在运行时通过 SbieDll 自身的 `SbieApi_QueryBoxPath` 导出函数发现的。
Obscura 以与隐藏 SbieDll 相同的方式隐藏自身的模块——基于镜像范围(PEB 解链作用于映射的基址),因此插件的文件名无关紧要。相比之下,SbieHide 依赖于自身的名称。
## 限制(客观存在的瓶颈)
这些是用户模式 DLL 的固有属性,**不**属于“留待后续修复的 bug”:
- **直接系统调用 (Direct syscalls)。** 自行构建 `syscall` 指令的程序会绕过所有用户模式 hook(包括 Obscura 和 Sandboxie 的),读取未经任何过滤的真实沙箱状态。任何 DLL 都无法堵住这个漏洞。探测工具演示了这一点。
- **TLS 回调时机。** 目标的 TLS 回调可以在加载器初始化期间,即在 Obscura 的 hook 安装之前运行检测。Obscura 会尽可能早地进行 PEB 解链(在 `DllMain` 中,在 hook 之前),以应对最基础的此类检查,但要实现全面覆盖需要单独的启动器(这超出了本项目的范围)。
- **Hook 自我检测。** 内联 hook (Inline hooks) 可以通过函数序言扫描、全新的 ntdll 字节对比或时序分析发现。这在一定程度上是任何 hook 方式所固有的。
- **内核对象。** 无论用户模式采取何种操作,`SbieDrv.sys`、服务以及驱动设备都存在于内核中。Obscura 只能从查询中*过滤*它们,而无法*移除*它们;要移除它们需要驱动程序(存在 PatchGuard 风险)。
- **令牌组 SID (`tok-sid`)。** 沙箱注入的组 SID 是针对每个沙箱/会话生成的。盲目过滤令牌组是有风险的,因此该过滤器默认**关闭**;默认仅开启完整性规范化。要启用它,请在沙箱内捕获该沙箱的组 SID,开启 `OBSCURA_ENABLE_TOKEN_GROUP_FILTER`,并在 `src/filter_token.cpp` 中实现具体的判定逻辑。
## 环境要求
- 安装了 Sandboxie-Plus 的 Windows 系统。
- 需同时安装 `Obscura32.dll` 和 `Obscura64.dll`,以全面覆盖 32 位和 64 位沙箱进程。
- 路径规范化通过 SbieDll 的 `SbieApi_QueryBoxPath` 导出函数解析沙箱根目录。如果该导出函数不可用,规范化将不执行任何操作,但基于范围和名称的过滤器仍会生效。
## 构建
要求使用 Visual Studio 2022 (MSVC x64 + x86),CMake >= 3.21。
```
cmake --preset obscura-x64 && cmake --build --preset obscura-x64
cmake --preset obscura-x86 && cmake --build --preset obscura-x86
```
(MSVC 无法在一次配置中同时生成两种架构,因此提供了两个预设。)输出结果会存放在 `dist\` 目录中:
```
dist\Obscura64.dll dist\Obscura32.dll
dist\obscura_probe_x64.exe dist\obscura_probe_x86.exe
```
两个 DLL 均链接静态 CRT,且仅依赖于 `ntdll.dll` 和 `KERNEL32.dll`,
因此它们不会向沙箱进程中引入任何额外的负担。
依赖项已直接存放在 `extern\` 目录下:包含 [phnt](https://github.com/winsiderss/phnt) 原生头文件和 [MinHook](https://github.com/TsudaKageyu/minhook) v1.3.3(使用相同标志从源码编译)。请参阅 `extern\` 中它们各自的许可证。
## 安装
Obscura **不会**修改您的 Sandboxie 配置。要启用它,请将 `docs\InjectDll.snippet.ini` 中的那两行 `InjectDll`/`InjectDll64` 复制到目标沙箱的配置节中(请先备份 `Sandboxie.ini`)。要移除它,请删除这些行并重新加载配置。
## 验证
`obscura_probe.exe --selftest` 会针对主机上的合成沙箱路径验证路径重写逻辑——无需沙箱环境。如果在沙箱内运行,同一个探测工具会将每个检测途径报告为 LEAK 或 CLEAN。
## 目录结构
```
src\ entry.cpp, hook_engine, peb_hide, image_registry, box_roots,
path_normalizer, filter_objdir, filter_registry, filter_token, nt_shims
test\ obscura_probe.cpp (detection-vector harness + --selftest)
docs\ InjectDll.snippet.ini (documented-only config snippet)
extern\ phnt\ minhook\ (vendored dependencies)
```
## 许可证
MIT - 请参阅 [LICENSE](LICENSE)。`extern\` 目录下的内置依赖项保留其各自的许可证(phnt, MinHook)。
标签:API Hook, Awesome列表, Bash脚本, C/C++, DAST, Linux, 事务性I/O, 兼容性, 恶意软件分析, 沙箱, 用户态插件