Windows快捷方式文件格式解析

大家知道通過IShellLink接口可以得到快捷方式的各種屬性。具體怎麼做,網上有很多文章,這裏就不介紹了。現在主要是分析一下快捷方式文件的格式,並且自己寫一個解析程序。

爲了方便大家理解,解說完每個段後附上一個快捷方式對應部分的事例數據並附內容解說。這裏以Windows Media Player在桌面上的快捷方式爲例。

一、文件的整體結構

 

二、文件頭

文件頭結構,參照下面表格:

Offset  Size/Type  Description
0h 1 dword 值常爲0000004CH,爲字符"L"
4h 16 bytes GUID
14h 1 dword Flags,用來標識快捷方式文件中有哪些可選屬性,後面有表單獨解釋每一位的意義。
18h 1 dword 目標文件屬性,後面解釋。
1ch 1 qword 文件創建時間
24h 1 qword 文件修改時間
2ch 1 qword 文件最後一次訪問時間
34h 1 dword 目標文件長度
38h 1 dword 自定義圖標個數,
3ch 1 dword 目標文件執行時窗口顯示方式:
1、 正常顯示
2、 最小化
3、 最大化
40h 1 dword 熱鍵
44h 2 dword 暫時還不清楚用途值常爲0

① 偏移14h開始的標誌標示有哪些可選屬性,見下表:

Bit 所在位爲1時表示
0 有shell item id list
1 指向文件或文件夾,如果此位爲0表示指向其他。
2 存在描述字符串
3 存在相對路徑
4 存在工作路徑
5 存在命令行參數
6 存在自定義圖標

② 偏移18h開始的目標文件屬性: 

Bit 所在位爲1時表示
0 快捷方式所指目標文件有隻讀屬性
1 快捷方式所指目標文件有隱藏屬性
2 快捷方式所指目標文件是系統文件
3 快捷方式所指目標是卷標
4 快捷方式所指目標是文件夾
5 快捷方式所指目標文件上次存檔後被改變過
6 快捷方式所指目標文件被加密
7 快捷方式所指目標文件屬性爲一般
8 快捷方式所指目標文件爲臨時
9 快捷方式所指目標文件爲稀疏文件(sparse file)
10 快捷方式所指目標文件有重分析點數據(reparse point)
11 快捷方式所指目標文件被壓縮
12 快捷方式所指目標文件脫機

例:

01.偏移       數據             解釋
02.0000    4c 00 00 00       字符"L"
03.0004    01 14 02 00       快捷方式的GUID。值固定
04.00 00 00 00
05.C0 00 00 00
06.00 00 00 46
07.0014    8F 00 00 00      flags。對照表可知
08.有shell item id list
09.目標是文件
10.存在描述字符串
11.存在相對路徑
12.0018    20 00 00 00      文件屬性,具體內容可以查上面的屬性說明表
13.001C    40 51 0A 0C      文件創建時間
14.AD CB C4 01
15.0024    C4 D8 A5 91     文件修改時間
16.AD CB C4 01
17.002C    00 33 16 74       文件最後一次訪問時間
18.F6 C7 C3 01
19.0034    00 20 01 00       文件長度
20.0038    00 00 00 00       自定義圖標個數
21.003C    01 00 00 00       打開時窗口爲normal狀態
22.0040    00 00 00 00       熱鍵
23.0044    00 00 00 00       暫時還不清楚用途值常爲0
24.00 00 00 00

三、Shell item ID list段

當文件頭中○1的第0位置位時纔有。第一個unsigned short integer表示item ID list段的總長度。後面緊跟着SHITEMID結構。SHITEMID的定義如下:

1.typedef struct _SHITEMID {
2.USHORT cb;
3.BYTE   abID[0];
4.} SHITEMID, * LPSHITEMID;

cb保存SHITEMID結構的大小。abID是可變長度的對象標識。具體都是什麼含義沒看明白,可以參閱MSDN。因爲item ID list段的開始爲這個段的總長度,所以在讀取的時候可以把此段跳過不做處理!!:)

例:(文件頭段的flags標誌顯示存在shell item id list段)

01.偏移       數據             解釋
02.004C    9c 00            item ID list總長度(下一段的起始地址爲004E+009C=00EA)
03.004E    14 00           第一個item ID的長度
04.0050    1F 50 E0 4F      第一個item ID標示內容
05.D0 20 EA 3A
06.69 10 A2 D8
07.08 00 2B 30
08.30 9D
09.0062    19 00             第二個item ID的長度
10.0064    23 43 3A 5C       第二個item ID標示內容
11.00 00 00 00
12.00 00 00 00
13.00 00 00 00
14.00 00 00 00
15.00 F1 93
16.007B    25 00
17.007D    31 00 00 00
18.00 00 70 31
19.47 3B 31 00
20.50 72 6F 67
21.72 61 6D 20
22.46 69 6C 65
23.73 00 50 52
24.4F 47 52 41
25.7E 31 00
26.00A0    2C 00
27.00A2    31 00 00 00
28.00 00 70 31
29.47 3B 10 00
30.57 69 6E 64
31.6F 77 73 20
32.4D 65 64 69
33.61 20 50 6C
34.61 79 65 72
35.00 57 49 4E
36.44 4F 57 7E
37.32 00
38.00CC    1C 00
39.00CE    32 00 00 20
40.01 00 95 2F
41.A1 99 20 00
42.77 6D 70 6C
43.61 79 65 72
44.2E 65 78 65
45.00 00
46.00E8    00 00                 item ID list段結束

四、文件位置信息段

開始的一個long integer表示此段的總長度,當文件頭中○1的第1位沒有置位時表示既不是文件也不是文件夾,所以這個信息沒有意義,所以總長度爲0。先讓我們看一下這個段的頭:

Offset  Size/Type  Description
0h 1 dword 此段的總長度
4h 1 dword 頭結構長度,固定爲1ch
8h 1 dword Flags指示文件在哪些卷有效,這裏只用到低兩位,第一位置位表示本地卷有效,反之無效。第二位置位表示網絡卷有效,反之無效。
ch 1 dword 本地卷信息表的偏移(固定1ch)
10h 1 dword 本地路徑信息的偏移
14h 1 dword 網絡卷信息表的偏移
18h 1 dword 附加信息的偏移

如果文件在本地卷,那麼文件名爲:本地路徑信息+附加信息

如果文件在網絡卷,那麼文件名爲:網絡卷信息中的共享名+附加信息

緊跟在段頭後面的是本地卷信息表(段內偏移爲1ch),結構如下:

Offset  Size/Type  Description
0h 1 dword 本地卷信息表的長度
4h 1 dword 卷類型:
0 Unknown
1 No root directory
2 Removable (Floppy, Zip, etc..)
3 Fixed (Hard disk)
4 Remote (Network drive)
5 CD-ROM
6 Ram drive (Shortcuts to stuff on a ram drive, now that''s smart...)
8h 1 dword 卷序列號
ch 1 dword 固定長度部分的大小,固定爲10h
10h 可變長度  卷標籤

然後是本地路徑信息串段內偏移決定於10h的值。

再往後就是網絡卷信息表段內偏移決定於14h的值。結構如下:

Offset  Size/Type  Description
0h 1 dword 網絡卷信息表的長度
4h 1 dword 固定爲2h
8h 1 dword 固定長度部分的大小,固定爲14h
ch 1 dword 固定爲0h
10h 1 dword 固定爲20000h
14h 可變長度 網絡共享名

最後是附加信息串段內偏移決定於18h的值例:

01.偏移       數據             解釋
02.段頭
03.00EA    67 00 00 00     文件位置信息段總長度
04.00EE    1C 00 00 00     段頭長度,固定爲1ch
05.00F2    01 00 00 00     本地卷
06.00F6    1C 00 00 00     本地卷信息表的段內偏移
07.00FA    33 00 00 00     本地路徑信息的偏移
08.00FE    00 00 00 00     網絡卷信息表的偏移
09.0102    66 00 00 00     附加信息的偏移

本地卷信息表

1.0106    17 00 00 00     表長度
2.010A    03 00 00 00     Fixed (Hard disk)
3.010E    AD C9 B2 F0     卷序列號
4.0112    10 00 00 00     固定爲10h
5.0116    73 79 73 74     卷標"system"
6.65 6D 00

本地路徑信息串

01.011D    43 3A 5C 50  C:\Program Files\Windows Media Player\wmplayer.exe
02.72 6F 67 72
03.61 6D 20 46
04.69 6C 65 73
05.5C 57 69 6E
06.64 6F 77 73
07.20 4D 65 64
08.69 61 20 50
09.6C 61 79 65
10.72 5C 77 6D
11.70 6C 61 79
12.65 72 2E 65
13.78 65 00

網絡卷信息表 因爲段頭裏flags指示僅爲本地卷,並且網絡卷信息表的偏移值爲零。所以不存在網絡卷信息表。

|

附加信息串

1.0150    00

五、描述字符段

當文件頭中○1的第2位置位時纔有。開始的一個unsigned short int表示描述字符串的長度(描述字符爲Unicode字符,所以字節數需乘以2,可以使用API函數WideCharToMultiByte將其轉換成ANSI字符)。後面爲內容。例:

01.偏移       數據             解釋
02.0151    20 00         描述字符長度
03.0153    AD 64 3E 65
04.70 65 57 5B
05.92 5A 53 4F
06.0C FF 05 53
07.EC 62 F3 97
08.50 4E 01 30
09.C6 89 91 98
10.01 30 43 00
11.44 00 20 00
12.8C 54 20 00
13.49 00 6E 00
14.74 00 65 00
15.72 00 6E 00
16.65 00 74 00
17.20 00 35 75
18.F0 53 02 30

轉換成ANSI字符爲"播放數字媒體,包括音樂、視頻、CD 和 Internet 電臺。

六、相對路徑段

當文件頭中○1的第3位置位時纔有。同描述字符段一樣開始的一個unsigned short int表示相對路徑字符串的長度。後面爲內容。例:

01.偏移       數據             解釋
02.0193    38 00         相對路徑字符長度
03.0195    2E 00 2E 00
04.5C 00 2E 00
05.2E 00 5C 00
06.2E 00 2E 00
07.5C 00 50 00
08.72 00 6F 00
09.67 00 72 00
10.61 00 6D 00
11.20 00 46 00
12.69 00 6C 00
13.65 00 73 00
14.5C 00 57 00
15.69 00 6E 00
16.64 00 6F 00
17.77 00 73 00
18.20 00 4D 00
19.65 00 64 00
20.69 00 61 00
21.20 00 50 00
22.6C 00 61 00
23.79 00 65 00
24.72 00 5C 00
25.77 00 6D 00
26.70 00 6C 00
27.61 00 79 00
28.65 00 72 00
29.2E 00 65 00
30.78 00 65 00

轉換成ANSI字符爲"..\..\..\Program Files\Windows Media Player\wmplayer.exe"

七、工作目錄段 同上。

例:因爲文件頭中○1flags的第四位沒有置位,所以此段不存在

八、 命令行段 同上。

例:因爲文件頭中○1flags的第五位沒有置位,所以此段不存在

九、圖標文件段 同上。

例:因爲文件頭中○1flags的第六位沒有置位,所以此段不存在

十、 附加信息段 具體信息不清楚!!!!!

以上很多資料來自網上,並不是微軟文檔,所以難免有理解錯誤的地方,請包含。所附代碼只是爲了跟蹤顯示,沒有輸出,嘿嘿,自己改改看吧!!:)有興趣可以自己寫一個類,分析快捷方式的所有信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章