FAT32隐写在Window7及以后的系统中出现的问题
最近在做扇区读写及隐写数据自动加载执行Python程序的提高作业时,碰到了一个我暂时无法解决的问题 —— 用Python进行扇区写入时,一直报WriteFile错误5(拒绝访问);
实验环境
作业:通过 Python 的win32file库调用CreateFile/WriteFile等 API,实现:
- 监控U盘插入事件
- 直接读写U盘原始扇区
- 实现隐写数据的自动加载执行
环境:
- 主机系统:MacBook Air M3 与 Windows11 物理机
- 测试环境:Mac Parallel 模拟 Arm 版 Windows 11 虚拟机,Win VMware 模拟Win7虚拟机
- 辅助工具:WinHex
问题:WriteFile 错误 5
一开始,我想着用win32file.CreateFile打开U盘盘符(如\\.\E:),然后调用win32file.WriteFile尝试写入扇区数据。结果直接报错:
1 | 操作出错:(5,'WriteFile',’拒绝访问。’) |
查了下错误码,5 对应的就是ACCESS_DENIED,我觉得这应该是权限问题;
错误排查:从用户权限到系统内核限制
1. 尝试提升权
- 管理员模式运行:管理员+UAC关闭,启动脚本,没用;
2. MSDN 文档的关键提示
我开始STFW,直到我找到了这个14年前的帖子里面贴出了一份MSDN文档;Windows Vista之后,系统对已挂载(mounted)的卷有严格写入限制:
- 若卷已被文件系统挂载(如
FAT32/NTFS),直接写入扇区需满足:- 写入引导扇区或非文件系统空间
- 先通过
FSCTL_DISMOUNT_VOLUME卸载卷,使其脱离文件系统管理 - 卷为
RAW格式(无文件系统)
但是想到WinHex这类工具能正常读写扇区,我特意查了它的更新日志…
2007年WinHex针对Windows Vista做了改进:
WinHex 更新日志 2007-03:
“Under Windows Vista, writing sectors now internally unmounts the volume first …”
“在Windows Vista系统下,对于物理介质及分区的磁盘扇区写入,通过底层 API 实现了挂载状态管理。”推测其核心逻辑是:
- 若卷已挂载且含文件系统,除引导扇区外禁止写
- 需先锁卷
FSCTL_LOCK_VOLUME- 调用
FSCTL_DISMOUNT_VOLUME卸载卷
WinHex复现
- 用记事本打开·E:\a.txt
- 修改一下非引导扇区的数据 → WinHex →「Open Disk」→ 选择 E:
- 试图保存扇区 → 弹窗
Unable to lock the drive (32)
总结
用户模式进程不能直接操作已挂载的文件系统空间,必须通过卸载卷或操作 RAW 设备绕过文件系统保护
Windows为保护文件系统,对挂载卷加了「独占锁 ➜ 卸载」的门槛
成功锁+卸的前提是卷无人使用,WinHex / Python / 任何工具都必须遵守这条规则
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LEN's Web!