TaiwanHolyHigh - Windows Forensics - $MFT 基本實作
:::spoiler TOC [TOC] ::: :::info 以下引用若無特別說明皆來自於講師的上課簡報 :::
Background
- $MFT儲存的內容
- ==Status==: SO=22, LE=2,也就是目前此檔案的狀態,分為以下四種
-
0000
: Delete File -
0100
: File -
0200
: Delete Folder -
0300
: Folder
-
- ==$MFT Record==(File Identify/Location): SO=44, LE=4,也就是此檔案在record在$MFT的位置在哪邊
- ==Timestamp==
- Standard Info: SO=80, LE=32(Creat+Modified+$MFT Modified+Access),很容易就可以更改,如果要更改,可以參考New Filetime這個工具
- Filename: SO=184, LE=32(Creat+Modified+$MFT Modified+Access) 很難被更改(但還是可以更改)
- ==Resident / non-Resident File== 下一篇詳細說明
- ==Status==: SO=22, LE=2,也就是目前此檔案的狀態,分為以下四種
:::info 以下三個練習都是Resident File :::
Lab - Offset 43110400(d)
- $MFT長度一段就是1024 Bytes,我把結束的位址減掉開頭的位置就知道了,或是可以直接用HxD底下看長度(0x400)
1
2>>> 0x291D400-0x291D000 1024
- 從上圖也可以看到magical word就是
FILE0
$\to$46 49 4C 45 30
Overview(從上到下)
- Staus:
01 00
$\to$File -
04 00 00 00
是固定的 - $MFT Record:
74 A4
先轉換endian然後變十進位,在乘以1024就會是目前此檔案的開頭位址1
2
3
4>>> mft_record = '74 A4' >>> mft_record = int("".join(mft_record.split(' ')[::-1]), 16) >>> hex(mft_record * 1024) '0x291d000'
-
48 00 00 00 18 00 00 00
是固定的 - Standard Info Timestamp
此部分可以用之前的script換算
:::spoiler Script 過程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22>>> import datetime >>> def ad_timestamp(timestamp): ... if timestamp != 0: ... return datetime.datetime(1601, 1, 1) + datetime.timedelta(seconds=timestamp/10000000) ... return np.nan ... >>> create_time = '8D 6C AD E4 B5 BD CB 01' >>> create_time = int("".join(create_time.split(' ')[::-1]), 16) >>> ad_timestamp(create_time) datetime.datetime(2011, 1, 27, 0, 5, 23, 349211) >>> modify_time = '00 DE 13 B1 09 92 C9 01' >>> modify_time = int("".join(modify_time.split(' ')[::-1]), 16) >>> ad_timestamp(modify_time) datetime.datetime(2009, 2, 18, 20, 44, 28) >>> mft_modify = 'E7 CE AF E4 B5 BD CB 01' >>> mft_modify = int("".join(mft_modify.split(' ')[::-1]), 16) >>> ad_timestamp(mft_modify) datetime.datetime(2011, 1, 27, 0, 5, 23, 364836) >>> access_time = '00 DE 13 B1 09 92 C9 01' >>> access_time = int("".join(access_time.split(' ')[::-1]), 16) >>> ad_timestamp(access_time) datetime.datetime(2009, 2, 18, 20, 44, 28)
::: Create:
2011, 1, 27, 0, 5, 23, 349211
Modify:2009, 2, 18, 20, 44, 28
$MFT:2011, 1, 27, 0, 5, 23, 364836
Access:2009, 2, 18, 20, 44, 28
- Filename Timestamp
1
2
3
4>>> filename = '8D 6C AD E4 B5 BD CB 01' >>> filename = int("".join(filename.split(' ')[::-1]), 16) >>> ad_timestamp(filename) datetime.datetime(2011, 1, 27, 0, 5, 23, 349211)
Filename Timestamp都是
2011, 1, 27, 0, 5, 23, 349211
,和前面的create time相同
Lab - Offset 43208704(d)
- Staus:
01 00
$\to$File - $MFT Record:
D4 A4
1
2>>> hex(int("".join('d4 a4'.split(' ')[::-1]), 16) * 1024) '0x2935000'
- Standard Info Timestamp
1
2
3
4
5
6
7
8>>> create_time = 'E3 8D 30 E5 B5 BD CB 01' >>> create_time = int("".join(create_time.split(' ')[::-1]), 16) >>> ad_timestamp(create_time) datetime.datetime(2011, 1, 27, 0, 5, 24, 208586) >>> modify_time = '00 99 75 C2 57 7A C9 01' >>> modify_time = int("".join(modify_time.split(' ')[::-1]), 16) >>> ad_timestamp(modify_time) datetime.datetime(2009, 1, 19, 17, 2, 50)
Create Time = $MFT Modify Time =
2011, 1, 27, 0, 5, 24, 208586
Modify Time = Access Time =2009, 1, 19, 17, 2, 50
- Filename Timestamp
Filename Time = Create Time =
2011, 1, 27, 0, 5, 24, 208586
Lab - Offset 53550080(d)
- Staus:
01 00
$\to$File - $MFT Record:
47 CC
1
2>>> hex(int("".join('47 CC'.split(' ')[::-1]), 16) * 1024) '0x3311c00'
- Standard Info Timestamp
:::spoiler 運算過程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16>>> create_time = '1D 3F 6E F8 B3 C0 CB 01' >>> create_time = int("".join(create_time.split(' ')[::-1]), 16) >>> ad_timestamp(create_time) datetime.datetime(2011, 1, 30, 19, 29, 10, 984476) >>> modify_time = '00 6E A6 FC D2 E0 CA 01' >>> modify_time = int("".join(modify_time.split(' ')[::-1]), 16) >>> ad_timestamp(modify_time) datetime.datetime(2010, 4, 20, 21, 46, 52) >>> mft_modify = '77 A1 70 F8 B3 C0 CB 01' >>> mft_modify = int("".join(mft_modify.split(' ')[::-1]), 16) >>> ad_timestamp(mft_modify) datetime.datetime(2011, 1, 30, 19, 29, 11, 101) >>> access_time = '1D 3F 6E F8 B3 C0 CB 01' >>> access_time = int("".join(access_time.split(' ')[::-1]), 16) >>> ad_timestamp(access_time) datetime.datetime(2011, 1, 30, 19, 29, 10, 984476)
::: Create Time = Access Time =
2011, 1, 30, 19, 29, 10, 984476
Modify Time =2010, 4, 20, 21, 46, 52
$MFT Modify Time =2011, 1, 30, 19, 29, 11, 101
- Filename Timestamp
Create Time = $MFT Modify Time = Access Time =
2011, 1, 30, 19, 29, 10, 984476
Modify Time =2010, 4, 20, 21, 46, 52