利用WPS灵犀Claw检查U盘是否为扩容盘(续集)


Lv.3 优质创作者
大家好,我是依旧不用灵犀办公的南月。
在上一集《利用WPS灵犀Claw检查U盘是否扩容》中,最后没有让灵犀自动测试完成,是因为灵犀Claw在单次执行任务时有610s的超时等待时常,超过后就按无响应处理了,后来我是让灵犀帮我生成了一个245GB的大文件,我手动拷进去的。
我妈买的两个扩容盘,左边细看也不是hp,是类np | 我给我妈的固态U盘,联想小新128GB | 盘身有正儿八经的标识 |
这次我无意中找到了我妈之前买的一个128GB的扩容盘,花了十几块,这次时间充裕,我想着让灵犀Claw再次帮我验证,顺便看看它的验证方法是否有误。
这次我没让他直接开始写入文件,只是先进行信息读取,和写入速度测试:
信息读取完成,和上集中的U盘一样,厂商依旧是VendorCo,但这次多检测了个VID/PID和序列号,都有问题,经过速度测试写入也只有USB2.0常见的10MB/s。
接下来进入文件写入测试,基于上集中的教训,这次我尝试让他不要在执行的代码里写循环,而是让灵犀Claw自己去反复执行测试代码,以免造成单次代码执行过长而超时:
索性灵犀理解了我的要求。
但果然,灵犀使用的验证方案出现了问题:(开始测试的时候我就出去吃饭了,吃饭回来发现灵犀还在检验)
看到已经写入30GB了我就感觉不对了,要是十几块买一个32GB的U盘也是血赚啊,所以我中断了灵犀正在进行的第62轮的执行。
往里复制了一张照片,发现无法打开:
说明此时U盘空间占用已经超过了安全容量,所以我让灵犀自查一下:
经他自查发现他使用的检验方式实际上检查的是系统缓存中的文件,所以一直查不出问题,后来改用Windows API方式检测确实后写入的文件MD5已经发生了变化。
然后它开始沿着已写入的文件从后往前爬,直到查出最后一个没问题的文件编号,再按512MB计算出大致的安全容量(因为是单次写入512MB的测试文件):
这次任务才圆满完成!
最后测试出大致的安全容量范围是14.5GB,如果缩小单次写入的文件大小,还可以更精细。
最后生成skill:
skill内容:
---
name: usb-capacity-test
description: 检测 USB 扩容盘(虚假容量U盘)的真实物理容量。适用于判断U盘是否为扩容盘、查找安全容量边界、验证数据完整性。当用户提供U盘盘符(如 E: 盘)并要求检测容量真伪时触发。
---
# USB 扩容盘检测
检测 USB 可移动存储设备是否为扩容盘(篡改固件伪装成大容量的山寨U盘),并找到其真实的物理安全容量。
## 触发条件
- 用户要求检测U盘是否为扩容盘 / 假容量U盘
- 用户要求测试U盘的安全容量 / 真实容量
- 用户对U盘容量产生怀疑,要求验证
## 核心原理
扩容U盘通过修改固件,让操作系统看到比实际 NAND Flash 大得多的容量。写入超过实际物理容量的数据时,数据会丢失或损坏,但文件系统层面仍显示正常。
**关键陷阱:操作系统写缓存。** 写入文件后立即读取验证,数据来自缓存而非物理介质,校验会虚假"通过"。必须**绕过操作系统缓存**进行物理读写验证。
## 检测前准备
1. 获取目标盘符(如 `E:`)
2. 检查可用空间
3. **如果用户没有指定单次测试的文件大小,必须先询问用户**,不要自作主张选择大小
4. 确认用户是否允许删除测试文件
## 检测方法
### 方法一:基于文件写入 + 物理读取校验(推荐)
每次写入一个固定大小的文件(用户指定大小),写入完成后通过 Windows API 绕过缓存进行物理读取校验。
#### 写入方式(强制写透)
使用 `CreateFileW` 配合以下标志:
```
FILE_FLAG_NO_BUFFERING = 0x20000000
FILE_FLAG_WRITE_THROUGH = 0x80000000
```
- `FILE_FLAG_WRITE_THROUGH`:数据直接写入物理介质,不经过缓存
- `FILE_FLAG_NO_BUFFERING`:绕过系统缓存
读取验证时使用 `FILE_FLAG_NO_BUFFERING`,确保从物理介质读取而非缓存。
#### 对齐要求
`FILE_FLAG_NO_BUFFERING` 要求所有读写操作的缓冲区**按扇区对齐**(通常 512 字节)。操作步骤:
1. 分配对齐的缓冲区(大小必须是 512 的倍数)
2. 写入时确保数据偏移和大小对齐到 512 字节
3. 读取时同样对齐
#### 校验流程
1. 生成指定大小的随机数据
2. 计算源数据 MD5
3. 使用 `FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH` 写入文件到 U 盘
4. 关闭文件句柄
5. 使用 `FILE_FLAG_NO_BUFFERING` 重新打开文件读取
6. 计算读取数据的 MD5
7. 对比 MD5:一致则通过,不一致则说明已超出安全容量
### 方法二:通过复制到其他物理盘验证(备选)
如果方法一因权限等原因不可行,可退而求其次:
1. 使用普通方式写入文件到 U 盘
2. 调用 `FlushFileBuffers()` 强制缓存落盘
3. 将文件从 U 盘**复制到另一块物理硬盘**(如 D 盘)
4. 计算复制过程中读取数据的 MD5
5. 与源数据 MD5 对比
> 注意:此方法仍可能受系统缓存干扰,不如方法一可靠。
## 逐轮测试流程
必须采用**逐轮、手动推进**的方式,不得在循环中自动完成:
1. 第 1 轮:写入用户指定大小的文件 → 物理读取校验 → 报告结果
2. 第 2 轮:再写入一个相同大小的文件 → 物理读取校验 → 报告结果
3. 以此类推,每写完一个文件校验一次
4. 直到某轮写入失败(磁盘错误)或校验不通过(MD5 不一致)时停止
**禁止**在单段代码中用循环自动执行多轮测试,避免超时和无法观察中间结果。
## 安全容量判定
安全容量 = (通过的轮次数) × (单次文件大小)
例如:每轮 512MB,通过 29 轮,第 30 轮校验失败,则安全容量为 29 × 512MB = 14.5 GB。
## 测试过程中的关键信号
- **写入速度骤降**(如从 9 MB/s 降至 5 MB/s):可能是 U 盘物理空间即将耗尽,NAND 开始反复擦写的信号
- **校验失败**:说明写入位置已超出物理容量,数据覆盖到虚假地址
- **写入时间异常变长**:同上
## 数据完整性验证
必须在物理读取时(NO_BUFFERING)验证 MD5:
```
源数据 MD5: xxxxxx
物理读取 MD5: yyyyyy
不一致 → 数据损坏 → 已达到容量上限
```
## 已知风险与注意事项
1. **测试文件会占用 U 盘空间**,告知用户并确认后再开始
2. **不要删除测试文件**,除非用户明确要求
3. **写入速度慢**的 U 盘,每轮测试耗时较长(512MB 约 50-100 秒),注意超时控制
4. **FILE_FLAG_NO_BUFFERING 需要管理员权限**,部分环境可能无法使用
5. **VID/PID 为 VendorCo 的品牌**高度疑似扩容盘,VendorCo 是山寨厂商的通用标识
6. 序列号为纯数字无规律、容量非 2 的幂次(如 125GB 而非 128GB),也是扩容盘典型特征
Lv.3 优质创作者
Lv.3 优质创作者
Lv.4 核心创作者
Lv.3 优质创作者