BZDaniel/RDPuzzle
GitHub: BZDaniel/RDPuzzle
基于神经网络和多信号匹配的 RDP 位图缓存碎片重建工具,在浏览器端运行 AI 推理与半自动拼接,大幅降低数字取证中屏幕重建的时间成本。
Stars: 26 | Forks: 1

# RDPuzzle
使用神经边缘匹配、自动拼接和 OCR 技术,在浏览器本地将 RDP bitmap cache 碎片重建为可读的屏幕截图。
加载 64x64 位图图块,使用 HSV、Pearson 相关性以及在页面内运行的自训练神经网络 来评估相邻图块的匹配度,然后半自动地将它们拼接成更大的图像。具备多标签工作区、自动拼接、低信息图块过滤、OCR、撤销/重做、会话保存/加载等功能。
**[直接使用 →](https://bzdaniel.github.io/RDPuzzle/RDPuzzle.html)**
## 为什么
目前针对这个问题的工具操作非常手动且耗时,这就是痛点所在。
这个工具是我试图解决该问题的一次尝试。其目标是提取一个一直很强大但在大规模应用时不切实际的工件,并使其真正适用于实际的 IR 工作流,而无需花费半天时间去拼凑几个片段。
## 功能
- 神经 EdgeMatch 评分 (自训练模型,通过 ONNX 在浏览器中运行)
- 具有可配置阈值的自动拼接
- OCR
- 单个 HTML 文件,无需安装
- 低信息图块过滤 (忽略空白/纯色图块)
- 导入时跳过近似重复的图块 (99% 视觉相似度阈值)
- 加载 RDP bitmap cache 碎片 (BMC, BIN)
- 移动和交换已放置的图块
- 多标签工作区
- 撤销 / 重做
- 保存和加载会话
- 将重建的网格导出为图像
- 所有图块显示在网格中,可将其拖动到重建画布上
- 直接导入图像图块
## 匹配
该工具结合多个信号来判断两个图块是否可能相邻。当一个单元格具有多个已放置的相邻图块时,每个图块都会提供匹配证据,因此相邻图块越多,匹配就越强。
**综合评分:**
```
HSV score x HSV weight + Pearson score x Pearson weight + EdgeMatch x EdgeMatch weight
```
权重是可配置的。低信息乘数会对空白或近乎纯色的图块进行惩罚。
### HSV
捆绑的单一指标,结合了两个信号:
- **70%** 相邻图块边缘的 HSV 直方图重叠度
- **30%** 逐像素的接触边缘颜色连续性
适用于 UI 区域、照片、渐变。在平坦或重复区域效果较差。
### Pearson
比较两条接触边缘之间的亮度关系。当亮度模式跨越边界连续时非常有用。当一对图块中的任何一个属于低细节图块时,其权重会被动态降低。
### EdgeMatch (神经)
这是一个基于 InfoNCE 损失函数的自训练 CNN,它将图块和方向转换为 256 维的 embedding。可能相邻的图块最终会具有相似的 embedding。该模型使用真实的 RDP 会话数据并采用了难负例挖掘 进行训练。
**架构:**
输入是 64x64 的 RGB 图块加上一个方向(左/右/上/下)。在送入 CNN 之前,图块会经过旋转或翻转,使得我们关心的边缘始终位于右侧。这样一来,网络只需学习右边缘匹配,而方向则单独处理。
主干网络由四个带有 GroupNorm 的 ResNet 阶段组成。通道演进过程为 3 -> 32 -> 64 -> 128 -> 256。在主干网络之后,一个学习到的逐方向 FiLM 调制会对特征进行不同比例的缩放,以适应不同的方向。
此外,还有一个单独的小型卷积网络,专门处理右边缘的像素带(默认宽度为 16px)。这为模型提供了一条专注于实际图块边界的专用路径。
一个学习到的 32 维方向 embedding 保留了在规范化过程中丢失的上下文信息。
所有特征(主干特征 + 边缘特征 + 方向 embedding)会被拼接起来,并通过两个隐藏层生成一个 L2 归一化的 256 维向量。
**用法:** 给定一个锚点图块和方向,计算其 embedding,计算对侧的候选 embedding,通过余弦相似度 进行比较。相似度越高 = 越有可能是真实的相邻图块。
EdgeMatch 能够处理简单像素比较无法应对的情况:照片、抗锯齿 UI、富含文本的图块、噪点区域、渐变。
## 自动拼接
以保守的方式扩展重建结果:
1. 从用户放置的“种子”图块开始(如果存在)
2. 对边界(已放置图块旁边的空单元格)的所有候选图块进行评分
3. 首先放置最强匹配(高于阈值)
4. 重新计算(因为新图块可以创造多邻居匹配机会)
5. 重复上述步骤,直到没有符合条件的边界匹配为止
6. 然后从具有最高“细节”分数的未使用图块中启动一个新的“孤岛”单元格
7. 继续直到没有良好的匹配剩余或达到孤岛数量限制
孤岛限制控制着自动拼接可以开启多少个新孤岛。用户放置的种子不计入该限制。
为获得最佳效果,请在自动拼接之前尝试手动匹配几个单元格。
## 低信息图块过滤
检测空白、纯色或近乎空白的图块,因为纯色背景或 cmd 图块不包含任何信息,对判断相邻关系没有帮助。
基于亮度方差、梯度能量、Sobel 边缘密度和熵进行计算。
低于阈值的图块会受到惩罚,并降低其相邻评分。
## Cache 顺序
RDP cache 顺序并不是一个可靠的时间线。缓存存储可重用的片段是为了提高性能。文件顺序可能暗示了某些信息,但视觉匹配才是主要信号。
## 保存和加载
会话会保存图块元数据、网格位置、标签页、设置、撤销历史记录、重建状态和 embedding。
## OCR
使用 OCR 来识别富含文本的图块。有助于处理浏览器碎片、终端窗口、文档文本和对话框。仅作为辅助信号。
提供两种 OCR 选项:为保证性能而在 4 个线程上运行的 tesseract,或者在 WebGPU 上运行的 paddleOCR。
## 运行
在浏览器中打开。推荐使用 Chrome/Edge/Chromium(支持 ONNX 推理、canvas、拖放、OCR worker)。
## 隐私
在本地运行。解析、评分、拼接和导出均在客户端进行。根据配置的不同,一些 OCR/模型资源可能会从外部来源加载。
## 局限性
- 缓存碎片可能是不完整的
- 碎片不具备时间顺序
- 重复的 UI 模式可能导致错误匹配
- 纯色背景难以拼接,但由于其包含的“数据”量极少,应当受到惩罚
- 神经相似度只是一个排名信号,并非确凿证据
- 自动拼接仍需要手动修正
## 许可证
RDPuzzle 可免费用于个人、教育、学术和非商业研究用途。
商业用途,包括公司、咨询机构、MDR/IR 供应商、企业内部安全团队或商业取证服务的使用,需要单独的商业许可证。
如需商业许可,请联系:mrdanielbenzano@gmail.com
## 作者
Daniel Ben Zano
特别感谢 Tal Gaffen
标签:BIN, BMC, CNCF毕业项目, HSV, IR工作流, meg, OCR, ONNX, RDP安全, RDP缓存重建, 位图碎片还原, 信息安全, 免安装工具, 单文件HTML, 可视化拼接, 后端开发, 图像处理, 客户端可视化, 库, 应急响应, 数字取证, 数据可视化, 浏览器端工具, 皮尔逊相关性, 碎片重组, 神经网络, 自动化脚本, 自动拼接, 边缘匹配, 远程桌面协议