前言
先祝大家国庆快乐!
近期需要获取到,已经移入回收站的文件的原始路径,对这方面进行了一些研究。
研究过程参考了参考资料[1]的内容,补充其未提到的中文乱码的解决办法。
回收站里的存的是什么
众所周知,回收站像是一个特殊的文件夹。但是特别的在于,表面看上去他的文件名是可以重复的,这也意味着他有一套独特的逻辑去存储文件。
当一个文件被删除之后,Windows 将会自动将其重命名之后再放到一个自己维护的一个文件夹结构里去(即X:$Recycle.Bin)
因此,在 Windows Explorer 下看起来是同名的文件,在回收站的文件系统中实际存储的文件名不重复。
摘自参考资料[1]
我们进入这个目录,不论是cmd还是explorer,都发现他是一个空白的目录
实际上,window会创建一个隐藏的目录,用SID作为名称,里面存放着回收站文件的数据,我们可以用whoami /user
指令拿到SID。
我们在$Recycle.Bin
下执行cd 上面拿到的SID
即可进入这个隐藏目录,并通过dir
拿到所有文件的信息。
这样做的原因是为了进行权限控制,来避免一个普通用户(非管理员)可以查看、读取或删除其它用户的回收站文件。摘自参考资料[1]
如上图,我们会发现,有多组以$I
和$R
开头的同名文件
每当删除一个文件进入回收站,都会生成两个文件,分别$I
和$R
开头。
$R 开头的文件中存储着文件的实际内容,而$I 前缀的文件存储着这个文件在被你丢进回收站之前的文件名,路径,时间等信息。尽管没有办法证实,但是你可以猜测R代表 Recycled,而 I 代表 Information。摘自参考资料[1]
信息还原
我们先使用命令将目标的$I
文件拷贝出来,使用hexdump打开,内容如下
(这是一个文件名为新的空白文件,对应上上图的$I934H4F文件)
依稀能看到后面的内容就是文件路径,但是中文似乎并没有直接支持。
如果目标文件不可能是英文文件名,其实到现在已经可以结束研究了,在浏览器中FileReader都可以直接读取这个文件,经过处理后就可以拿到原始路径:
但是对于中文,我们需要一些其他的办法。
兼容中文
经过观察,很容易发现,它是由两个字节表示一个字符,包括英文
因为英文不需要占满两个字节,所以有一个是00
照这个思路向下寻找一个两字节且不是00的组合,很容易发现
此处有一个B065
,而65B0
正是新字的16进制ASCII码值,由此我们可以推断出回收站以小端存储的,我们只需要两两交换再拼接,即可得到正确的16进制ASCII。
(从上面的00其实也可以初见端倪,笔者愚钝未能提前发现)
基于上面的思路,简单的写一段node:
运行代码,输出如下:
再试一个word文件:(也就是上面的$IPMD0NG.doc
)
其在回收站的属性如下图
可以发现中文兼容良好
关于源文件的修改时间、大小等信息可参照参考资料【1】,这里不再赘述。
参考资料
[1] https://www.zhihu.com/question/272210371/answer/367326483
广告
我是掘金用户2921546326657
给个关注好不好 T_T
https://juejin.cn/user/4336943126822024