这个项目不是真正的二维码传输,而是用屏幕像素编码实现数据跨越网络隔离。
核心架构
Text
远程桌面 (发送端) 本地电脑 (接收端)
┌─────────────────┐ ┌─────────────────┐
│ ReadFile.java │ 屏幕共享 │ ReadData.java │
│ 选文件 → 编码 │ ────────→ │ 截屏 → 解码 │
│ 显示为黑白像素 │ 截屏读取 │ 还原为文件 │
└─────────────────┘ └─────────────────┘
编码原理
不是二维码,是二值位图:
Text
1 字节 = 8 bit = 8 个像素
bit 1 → 黑色像素 (RGB < 100)
bit 0 → 白色像素 (RGB >= 100)
例如: 0xA5 = 10100101
→ 黑白黑白白白黑白
每张"二维码"实际是 240×480 像素的位图:
容量 = 240×480 / 8 = 14,400 字节 ≈ 14KB/帧
前 8 字节存文件长度(小端序)
数据布局
Text
┌──────────────────────────────────────┐
│ [8字节: 文件长度] │ ← 帧头
│ [字节0] [字节1] [字节2] ... [字节N] │ ← 文件数据
│ 每字节占8个水平像素 │
│ 从左到右、从上到下逐行排列 │
└──────────────────────────────────────┘
文件解码 (FileToImage.java)
解码时把 RGB 还原为 3-bit 色深:
Java
// 每个颜色通道只取高 3 位 (0-7)
r = (rgb >> 16) & 0xFF → r >> 5 // 取高3位
g = (rgb >> 8) & 0xFF → g >> 5 // 取高3位
b = (rgb >> 0) & 0xFF → b >> 5 // 取高3位
// 组合成 9-bit 值用于边界检测
传输流程
Text
- 发送端: JFileChooser 选文件
- 发送端: 文件 → 二值位图 → 显示在 JWindow
- 接收端: Robot.createScreenCapture() 截屏
- 接收端: 像素 → bit → 字节 → 写文件
- 接收端: 鼠标中键点击 → 发送端显示下一帧
- 循环直到传输完成
为什么能绕过安全限制
限制 绕过方式
USB 禁用 不需要 USB
网盘/邮箱封锁 不走网络
剪贴板隔离 不用剪贴板
文件导出限制 只有屏幕共享
数据通过屏幕显示 + 截屏这条"隐通道"传输,安全审计通常只监控网络和存储设备,不监控屏幕内容。
局限性
速度极慢:14KB/帧,1G 文件需要 ~15-20 分钟(作者实测)
需要人工操作:每帧需要鼠标中键翻页
依赖屏幕共享:需要远程桌面协议正常工作
像素精度要求:截图区域必须精确对齐
ScreenReader.java 的作用
这是个独立的 OCR 工具,用于从终端截图中识别文字(不是文件传输的一部分)。用 5×6 点阵匹配字母字符。
总结:本质是屏幕隐通道 (covert channel),把文件二进制数据逐像素显示在屏幕上,另一端截屏解码。绕过了所有网络和存储层面的安全限制,但代价是极低的传输速率。
这个项目不是真正的二维码传输,而是用屏幕像素编码实现数据跨越网络隔离。
核心架构
Text
远程桌面 (发送端) 本地电脑 (接收端)
┌─────────────────┐ ┌─────────────────┐
│ ReadFile.java │ 屏幕共享 │ ReadData.java │
│ 选文件 → 编码 │ ────────→ │ 截屏 → 解码 │
│ 显示为黑白像素 │ 截屏读取 │ 还原为文件 │
└─────────────────┘ └─────────────────┘
编码原理
不是二维码,是二值位图:
Text
1 字节 = 8 bit = 8 个像素
bit 1 → 黑色像素 (RGB < 100)
bit 0 → 白色像素 (RGB >= 100)
例如: 0xA5 = 10100101
→ 黑白黑白白白黑白
每张"二维码"实际是 240×480 像素的位图:
容量 = 240×480 / 8 = 14,400 字节 ≈ 14KB/帧
前 8 字节存文件长度(小端序)
数据布局
Text
┌──────────────────────────────────────┐
│ [8字节: 文件长度] │ ← 帧头
│ [字节0] [字节1] [字节2] ... [字节N] │ ← 文件数据
│ 每字节占8个水平像素 │
│ 从左到右、从上到下逐行排列 │
└──────────────────────────────────────┘
文件解码 (FileToImage.java)
解码时把 RGB 还原为 3-bit 色深:
Java
// 每个颜色通道只取高 3 位 (0-7)
r = (rgb >> 16) & 0xFF → r >> 5 // 取高3位
g = (rgb >> 8) & 0xFF → g >> 5 // 取高3位
b = (rgb >> 0) & 0xFF → b >> 5 // 取高3位
// 组合成 9-bit 值用于边界检测
传输流程
Text
为什么能绕过安全限制
限制 绕过方式
USB 禁用 不需要 USB
网盘/邮箱封锁 不走网络
剪贴板隔离 不用剪贴板
文件导出限制 只有屏幕共享
数据通过屏幕显示 + 截屏这条"隐通道"传输,安全审计通常只监控网络和存储设备,不监控屏幕内容。
局限性
速度极慢:14KB/帧,1G 文件需要 ~15-20 分钟(作者实测)
需要人工操作:每帧需要鼠标中键翻页
依赖屏幕共享:需要远程桌面协议正常工作
像素精度要求:截图区域必须精确对齐
ScreenReader.java 的作用
这是个独立的 OCR 工具,用于从终端截图中识别文字(不是文件传输的一部分)。用 5×6 点阵匹配字母字符。
总结:本质是屏幕隐通道 (covert channel),把文件二进制数据逐像素显示在屏幕上,另一端截屏解码。绕过了所有网络和存储层面的安全限制,但代价是极低的传输速率。