kapla0011/InsomniacUnwindingCrossProcess
GitHub: kapla0011/InsomniacUnwindingCrossProcess
跨进程休眠掩码 PoC,通过精准保留 UNWIND_INFO 结构实现无需调用栈伪装的内存加密休眠。
Stars: 56 | Forks: 3
# InsomniacUnwinding - 跨进程
无需 call stack spoofing 即可在外休眠掩码中精准保留 `UNWIND_INFO`。
**博客文章:** [Unwind Data Can't Sleep - Introducing InsomniacUnwinding](https://lorenzomeacci.com/unwind-data-cant-sleep-introducing-insomniacunwinding)
## 概述
传统的休眠掩码会对整个 payload 镜像进行加密,从而破坏 stack unwinding。
这个跨进程 POC 采用了不同的方法:
- 通过 named pipe 请求休眠掩码
- 精准提取仅保留 stack walking 所需的 `UNWIND_INFO` 结构(对比约 6KB 的完整 `.rdata`,仅需约 250 字节)
- 当 beacon 和 sleepmask 都位于 backed memory 中时,无需进行 call stack spoofing
## 架构
```
Connects to named pipe
SLEEP_REQUEST {PID, ImageBase, ImageSize, SleepTimeMs}
InsomniacUnwinding.exe <───────────────────────────────────────────── Beacon-Sample.exe
│ │
│ 1. OpenProcess(PID) │
│ 2. ReadProcessMemory(ImageBase, ImageSize) │
│ 3. Save regions: PE Headers + .pdata + UNWIND_INFO (~250 bytes) │
│ 4. VirtualProtectEx → PAGE_READWRITE │
│ 5. SystemFunction032 (encrypt entire image) │
│ 6. Patch back preserved regions │
│ │
│ WriteProcessMemory │
├─────────────────────────────────────────────> [ENCRYPTED] │
│ │
│ 7. Sleep(SleepTimeMs) [Blocked on ReadFile]
│ [Stack intact]
│ 8. SystemFunction032 (decrypt) [YARA = 0 hits]
│ 9. Patch back preserved regions │
│ │
│ WriteProcessMemory │
├─────────────────────────────────────────────> [DECRYPTED] │
│ │
│ 10. VirtualProtectEx → PAGE_EXECUTE_READ │
│ │
│ SLEEP_RESPONSE {Success, ErrorCode} │
└─────────────────────────────────────────────> │
[Continues execution]
```
## 用法
1. 在 Visual Studio 中构建这两个项目(x64 Release)
2. 启动 sleepmask 服务:
```
.\InsomniacUnwinding.exe
```
3. 在另一个终端中,运行 beacon:
```
.\Beacon-Sample.exe
```
4. Beacon 将连接到 named pipe 并进入休眠周期。在休眠期间检查 call stack,以验证它是否能通过 `BaseThreadInitThunk` 和 `RtlUserThreadStart` 正确解析。
## YARA 测试
包含了一个测试 YARA 规则,用于验证签名在休眠期间是否已加密:
```
.\yara64.exe BeaconSignature.yar
```
预期结果:
- **唤醒状态:** 2 次命中(位于 `.rdata` 和 `.data` 中的 `DEADBEEF`)
- **休眠状态:** 0 次命中(签名已加密)
## 核心见解
Call stack spoofing 是 unbacked sleepmask memory 带来的架构性后果,而非基本要求。当 sleepmask 从 backed memory 中执行时,spoofing 就变得不再必要。
标签:OpenAI, SSH蜜罐, UML, 免杀技术, 内存规避, 客户端加密, 暴力破解检测, 端点可见性, 进程注入