Featured image of post windows系统回收站的文件在哪里?

windows系统回收站的文件在哪里?

找到那些已删除到回收站的文件。

    在windows下,当我们删除了一个文件至回收站后,那么它实际去哪里了呢?当然是去回收站….. 废话….

Where ?

首先,我在桌面新建了一个文件R.txt,而后删除之到回收站。接下来,让我们看看它移动去哪里了。

管理员权限打开cmd.exe,试着按照以下步骤敲敲:

  1. cd C:\$RECYCLE.BIN

  2. 继续 cd, 然后TabTab(或许不止2次), 然后会有类似一个这样的目录S-1-5-21-295736274-4050683623-1903285775-1001windows的安全标识符 SID。当然,如果你的主机有多个用户的话,显然会有多个SID.

  3. 不过,可以通过whoami /all 查看之.

  4. DIR命令展示一下列表,类似如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    
    2022/09/03  14:11                80 $I5P1J1G.txt
    2020/09/04  21:13    <DIR>          $R0Y3S9Z
    2022/08/29  22:34                20 $R5P1J1G.txt
    2021/07/22  21:39    <DIR>          $RAGSQIS
    2020/06/13  19:18    <DIR>          $RIMKTRB
    2020/06/05  22:54    <DIR>          $RJJH8LK
    2022/08/14  15:24    <DIR>          $RO3MVMY
    2022/08/14  15:15    <DIR>          $RVYVD5U
    

如上,仅仅通过看,似乎无法解开这些看似规律又像乱码的文件。不过,上面有两个txt后缀的文件在时间上和我们的删除时机几乎吻合,很难让人不猜测它们之间的是否存在相关性。不如,我们随便cat一下看看里面是个什么玩意。

1
2
3
4
5
> type $I5P1J1G.txt
餧.u椿?C:\Users\HP\Desktop\R.txt
> type $R5P1J1G.txt
this is a test file.
>

???这不是我们之前删除的文件嘛!以及C:\Users\HP\Desktop\R.txt原路径嘛!

get it, 我们找到它了!

$RXX$IXX

Recycle Bin has 2 major formats, which can be roughly divided as “before Vista” and “after Vista”.

引用 Rifiuti2 对此文件结构的相关介绍,具体如下。

INFO2 file

虽然广为人知的是 INFO2 文件,但实际上它在 Windows 95 和 NT 4.0 中被命名为 INFO。 此隐藏文件包含所有已删除项目的相关元信息。 它的位置随文件系统的不同而不同(以C盘为例):

  • 对于FAT16/32文件系统,它们位于C:\RECYCLED

  • 对于NTFS文件系统,它们位于C:\RECYCLER\<sid>

从 Windows 98 开始,有关永久清除项目或恢复项目的元数据将保存在 INFO2 中。

有关这种旧格式的研究信息已广为流传 1,但它们通常仅涵盖 Windows XP/2003,这与早期的 Windows(95、98、ME 等)略有不同。

关于INFO2的格式,转参考https://abelcheung.github.io/rifiuti2/assets/Forensics_Recycle_Bin.pdf

$Recycle.bin folder

对于这种格式,回收站文件夹位于 C:$Recycle.bin<sid>(以 C 盘为例)。 回收文件的删除信息不存储在单个文件中。

相反,每个回收文件都有自己的附带索引文件,名称非常相似。例如,上述中我们删除的txt文件,其信息是对应的即$R文件和$I文件是一一对应的:

删除的文件索引
$R5P1J1G.txt$I5P1J1G.txt

How to Parse ?

使用 hexdump.exe 分别查看一下两个信息文件,很显然R文件就是源文件的一个拷贝。所以,更值得我们关心的是I文件内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> hexdump.exe -C $I5P1J1G.txt
000000  02 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00  ................
000010  e0 60 69 f6 5b bf d8 01 1a 00 00 00 43 00 3a 00  .`i.[.......C.:.
000020  5c 00 55 00 73 00 65 00 72 00 73 00 5c 00 48 00  \.U.s.e.r.s.\.H.
000030  50 00 5c 00 44 00 65 00 73 00 6b 00 74 00 6f 00  P.\.D.e.s.k.t.o.
000040  70 00 5c 00 52 00 2e 00 74 00 78 00 74 00 00 00  p.\.R...t.x.t...

> hexdump.exe -C $R5P1J1G.txt
000000  74 68 69 73 20 69 73 20 61 20 74 65 73 74 20 66  this is a test f
000010  69 6c 65 2e                                      ile.

很显然,如上,对于源文件的路径实际上已经很清晰了,只需要稍微再调整一下,便可得到原路径。因此,为了更准确的得到与源文件有关的信息,需要结合一下Rifiuti2源码剖析一下。

1
2
3
4
5
6
7
#define VERSION_OFFSET               0x0
#define FILESIZE_OFFSET              0x8
#define FILETIME_OFFSET              0x10
#define VERSION1_FILENAME_OFFSET     0x18
#define VERSION2_FILENAME_OFFSET     0x1C

#define VERSION1_FILE_SIZE           ((VERSION1_FILENAME_OFFSET) + (WIN_PATH_MAX) * 2)

源文件大小起始偏移为0x8,长度为long long(小端)):

1
14 00 00 00 00 00 00 00

即文件大小为0x1480bits

文件的删除时间为long long共64位(小端):

1
e0 60 69 f6 5b bf d8 01

01d8 bf5b f669 60e0 ,十进制为133,066,590,704,460,000,单位为100ns. 转换为UTC:

$(133066590704460000 - 116444736000000000LL) / (10000000) = 1662185470$

时间戳转一下日期 2022-09-03 14:11:10,即得到文件的删除时间。

文件名的起始偏移0x1C,因此得到文件名:

1
2
3
4
00001C  43 00 3a 00                                      C.:.
000020  5c 00 55 00 73 00 65 00 72 00 73 00 5c 00 48 00  \.U.s.e.r.s.\.H.
000030  50 00 5c 00 44 00 65 00 73 00 6b 00 74 00 6f 00  P.\.D.e.s.k.t.o.
000040  70 00 5c 00 52 00 2e 00 74 00 78 00 74 00        p.\.R...t.x.t.

又,windows的编码方式为unicode(准确的说法应该是UTF-16LE).所以,一个字符的表示共16位,比如C的编码为0043。此处的演示均为英文字符,因此很容易就能转为ANSI字符。但是,当路径含有中文或其他字符时,情况又不一样了,上述的16位编码仅仅表示一个字符的码位存储,比如字的码位为4e2d0100 1110 0010 1101.当以UTF-8的格式编码时,根据以下规则,那么:

1
2
3
4
5
6
7
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+---------------------------------------------
0000 0000-0000 007F |                             0xxxxxxx
0000 0080-0000 07FF |                    110xxxxx 10xxxxxx
0000 0800-0000 FFFF |           1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF |  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0800 < 4e2d < FFFF落在第三行的规则,即

1
2
3
4
    0100   111000  101101
1110xxxx 10xxxxxx 10xxxxxx
11100100 10111000 10101101
    0xE4     0xB8     0xAD

因此,在代码(UTF-8编码)的里的存储值为E4B8AD。由此,可以得到源文件的路径为:

1
C:\Users\HP\Desktop\R.txt

Tools

Rifiuti2 :是一个用于分析 Windows 回收站 INFO2 文件的工具。 Rifiuti2可以提取文件的删除时间、原路径和大小以及被删除的文件是否已被永久删除。

https://github.com/abelcheung/rifiuti2

Refs

In-depth knowledge about recycle bin

哦吼是一首歌。
Built with Hugo
Theme Stack designed by Jimmy