简而言之:只需将文件移至
C:\$Recycle.Bin\SID\$R{name}
* (对于C驱动器),并创建一个相关的二进制文件($I{name}
),其中包含有关“已删除”文件/文件夹的元信息。* 其中SID是您的操作系统安装标识符,看起来像:
S-1-5-21-1234567890-1234567890-1234567890-1001
。
但是在研究后我有两个问题:
- 删除日期转换为64位值的算法是什么?
- 垃圾箱中的文件名是否是随机生成的还是有一些逻辑?
信息文件结构如下(根据我的研究):
const buffer = new Uint8Array([
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Header
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Size // 65535 (bytes)
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xd7, 0x01, // Deletion date (64-bit value)
0x0b, 0x00, 0x00, 0x00, // Path string length // `11`
0x43, 0x00, 0x3a, 0x00, // File path + \0 // `C:\1\1.txt` // `C:\\1\\1.txt\0`
0x5c, 0x00, 0x31, 0x00, 0x5c, 0x00, 0x31, 0x00,
0x2e, 0x00, 0x74, 0x00, 0x78, 0x00, 0x74, 0x00,
0x00, 0x00
]);
文件头(始终相同),以字节为单位的文件大小(仅在文件资源管理器中可见),64位删除日期值,路径字符串长度和UTF-16编码的以null结尾的路径字符串。
唯一有问题的部分是日期。它是如何编码的?
例如:
00 00 00 00 00 29 d7 01
代表2021年4月4日03:10
00 00 00 00 01 29 d7 01
代表2021年4月4日03:17
00 00 00 00 00 30 d7 01
代表2021年4月13日00:57
(前四个十六进制数只是为了方便而写的00
。)
例如:00 00 00 00 00 29 d7 01
字节表示为132619794007457792
,但是new Date(132619794007457792/100000)
表示的是2012.01.10 12:19:00
。
我需要将00 00 00 00 00 29 d7 01
字节转换为2021.04.04 03:10
。
C:\$Recycle.Bin\SID\
中的“已删除”文件名称以$R
+ [A-Z0-9]{7}
+ 可选的.{扩展名}
开头。
例如:$RL6JQMF.txt
。
以及相关的元数据文件:$IL6JQMF.txt
,它只以$I
开头。
这个命名有逻辑还是随机生成的?
实际上,例如,它可以同时使用$R___
+ $I___
和$R123456789 abc
+ $I123456789 abc
。因此,我认为它只是随机生成的。
只需要$R
/$I
。扩展名仅用于在文件资源管理器中显示相应的图标。
0x01
开头,并且该结构体没有路径长度字段。 - AntonK