admin管理员组

文章数量:1531656

2024年1月23日发(作者:)

捷方式文件的格 式,并且自己写一个解析程序。

大家知道通过IShellLink接口可以得到快捷方式的各种属性。具体怎么做,网上有很多文章,这里为了方便大家理解,解说完每个段后附上一个快捷方式对应部分的事例数据并附内容解说。这里以快捷方式为例。

一、文件的整体结构

.LNK 文件格式

1. 文件头

2. Shell Item Id List 段

3. 文件位置信息段

4. 描述字符段

5. 相对路径段

6. 工作目录段

7. 命令行段

8. 图标文件段

9. 附加信息段

二、文件头

文件头结构,参照下面表格:

Offset

0h

4h

①14h

②18h

1ch

24h

2ch

34h

38h

Size/Type

1 dword

16 bytes

1 dword

1 dword

1 qword

1 qword

1 qword

1 dword

1 dword

值常为0000004CH,为字符"L"

GUID

Description

Flags,用来标识快捷方式文件中有哪些可选属性,后面有表单独解释每一位目标文件属性,后面解释。

文件创建时间

文件修改时间

文件最后一次访问时间

目标文件长度

自定义图标个数,

目标文件执行时窗口显示方式:

3ch 1 dword

1、 正常显示

2、 最小化

3、 最大化

40h

44h

1 dword

2 dword

热键

暂时还不清楚用途值常为0

① 偏移14h开始的标志标示有哪些可选属性,见下表:

Bit

0

1

2

3

4

5

6

有shell item id list

所在位为1时表示

指向文件或文件夹,如果此位为0表示指向其他。

存在描述字符串

存在相对路径

存在工作路径

存在命令行参数

存在自定义图标

② 偏移18h开始的目标文件属性:

Bit

0

1

2

3

4

5

6

7

8

9

10

11

12

例:

快捷方式所指目标文件有只读属性

快捷方式所指目标文件有隐藏属性

快捷方式所指目标文件是系统文件

快捷方式所指目标是卷标

快捷方式所指目标是文件夹

快捷方式所指目标文件上次存档后被改变过

快捷方式所指目标文件被加密

快捷方式所指目标文件属性为一般

快捷方式所指目标文件为临时

所在位为1时表示

快捷方式所指目标文件为稀疏文件(sparse file)

快捷方式所指目标文件有重分析点数据(reparse point)

快捷方式所指目标文件被压缩

快捷方式所指目标文件脱机

偏移 数据 解释

0000 4c 00 00 00 字符"L"

0004 01 14 02 00 快捷方式的GUID。值固定

00 00 00 00

C0 00 00 00

00 00 00 46

0014 8F 00 00 00 flags。对照表可知

有shell item id list

目标是文件

存在描述字符串

存在相对路径

0018 20 00 00 00 文件属性,具体内容可以查上面的属性说明表

001C 40 51 0A 0C 文件创建时间

AD CB C4 01

0024 C4 D8 A5 91 文件修改时间

AD CB C4 01

002C 00 33 16 74 文件最后一次访问时间

F6 C7 C3 01

0034 00 20 01 00 文件长度

0038 00 00 00 00 自定义图标个数

003C 01 00 00 00 打开时窗口为normal状态

0040 00 00 00 00 热键

0044 00 00 00 00 暂时还不清楚用途值常为0

00 00 00 00

三、Shell item ID list段

当文件头中○1的第0位置位时才有。第一个unsigned short integer表示item ID list段的总长TEMID的定义如下:

typedef struct _SHITEMID {

USHORT cb;

BYTE abID[0];

} SHITEMID, * LPSHITEMID;

cb保存SHITEMID结构的大小。abID是可变长度的对象标识。具体都是什么含义没看明白,可以始为这个段的总长度,所以在读取的时候可以把此段跳过不做处理!!:)

例:(文件头段的flags标志显示存在shell item id list段)

偏移 数据 解释

004C 9c 00 item ID list总长度(下一段的起始地址为004E+009C=00EA)

004E 14 00 第一个item ID的长度

0050 1F 50 E0 4F 第一个item ID标示内容

D0 20 EA 3A

69 10 A2 D8

08 00 2B 30

30 9D

0062 19 00 第二个item ID的长度

0064 23 43 3A 5C 第二个item ID标示内容

00 00 00 00

00 00 00 00

00 00 00 00

00 00 00 00

00 F1 93

007B 25 00

007D 31 00 00 00

00 00 70 31

47 3B 31 00

50 72 6F 67

72 61 6D 20

46 69 6C 65

73 00 50 52

4F 47 52 41

7E 31 00

00A0 2C 00

00A2 31 00 00 00

00 00 70 31

47 3B 10 00

57 69 6E 64

6F 77 73 20

4D 65 64 69

61 20 50 6C

61 79 65 72

00 57 49 4E

44 4F 57 7E

32 00

00CC 1C 00

00CE 32 00 00 20

01 00 95 2F

A1 99 20 00

77 6D 70 6C

61 79 65 72

2E 65 78 65

00 00

00E8 00 00 item ID list段结束

四、文件位置信息段

开始的一个long integer表示此段的总长度,当文件头中○1的第1位没有置位时表示既不是文件所以总长度为0。先让我们看一下 这个段的头:

Offset Size/Type Description

0h

4h

8h

ch

10h

14h

18h

1 dword

1 dword

1 dword

1 dword

1 dword

1 dword

1 dword

此段的总长度

头结构长度,固定为1ch

Flags指示文件在哪些卷有效,这里只用到低两位,第一位置位表示本地卷有效,反之无效。第二有效,反之无效。

本地卷信息表的偏移(固定1ch)

本地路径信息的偏移

网络卷信息表的偏移

附加信息的偏移

如果文件在本地卷,那么文件名为:本地路径信息+附加信息

如果文件在网络卷,那么文件名为:网络卷信息中的共享名+附加信息

紧 跟在段头后面的是本地卷信息表(段内偏移为1ch),结构如下:

Offset

0h

Size/Type

1 dword

本地卷信息表的长度

卷类型:

0 Unknown

1 No root directory

2 Removable (Floppy, Zip, etc..)

3 Fixed (Hard disk)

4 Remote (Network drive)

5 CD-ROM

Description

4h 1 dword

6 Ram drive (Shortcuts to stuff on a ram drive, now that'')

8h

ch

10h

1 dword

1 dword

可变长度

卷序列号

固定长度部分的大小,固定为10h

卷标签

然后是本地路径信息串段内偏移决定于10h的值。

再往后就是网络卷信息表段内偏移决定于14h的 值。结构如下:Offset

0h

4h

8h

ch

10h

Size/Type

1 dword

1 dword

1 dword

1 dword

1 dword

网络卷信息表的长度

固定为2h

固定长度部分的大小,固定为14h

固定为0h

固定为20000h

Description

14h

可变长度 网络共享名

最后是附加信息串段内偏移决定于18h的值 例:

偏移 数据 解释

段头

00EA 67 00 00 00 文件位置信息段总长度

00EE 1C 00 00 00 段头长度,固定为1ch

00F2 01 00 00 00 本地卷

00F6 1C 00 00 00 本地卷信息表的段内偏移

00FA 33 00 00 00 本地路径信息的偏移

00FE 00 00 00 00 网络卷信息表的偏移

0102 66 00 00 00 附加信息的偏移

本地卷信息表

0106 17 00 00 00 表长度

010A 03 00 00 00 Fixed (Hard disk)

010E AD C9 B2 F0 卷序列号

0112 10 00 00 00 固定为10h

0116 73 79 73 74 卷标"system"

65 6D 00

本地路径信息串

011D 43 3A 5C 50 C:Program FilesWindows Media

72 6F 67 72

61 6D 20 46

69 6C 65 73

5C 57 69 6E

64 6F 77 73

20 4D 65 64

69 61 20 50

6C 61 79 65

72 5C 77 6D

70 6C 61 79

65 72 2E 65

78 65 00

网络卷信息表 因为段头里flags指示仅为本地卷,并且网络卷信息表的偏移值为零。所以不存在|

附加信 息串

0150 00

五、描述字符段

当文件头中○1的第2位置位时才有。开始的一个unsigned short int表示描述字符串的长度(描乘以2,可以使用API函数WideCharToMultiByte将其转换成 ANSI字符)。后面为内容。例:

偏移 数据 解释

0151 20 00 描述字符长度

0153 AD 64 3E 65

70 65 57 5B

92 5A 53 4F

0C FF 05 53

EC 62 F3 97

50 4E 01 30

C6 89 91 98

01 30 43 00

44 00 20 00

8C 54 20 00

49 00 6E 00

74 00 65 00

72 00 6E 00

65 00 74 00

20 00 35 75

F0 53 02 30

转换成ANSI字符为"播放数字媒体,包括音乐、视频、CD 和 Internet 电台。

六、相对路径段

当文件头中○1的第3位置位时才有。同描述字符段一样开始的一个unsigned short int表示相对

偏移 数据 解释

0193 38 00 相对路径字符长度

0195 2E 00 2E 00

5C 00 2E 00

2E 00 5C 00

2E 00 2E 00

5C 00 50 00

72 00 6F 00

67 00 72 00

61 00 6D 00

20 00 46 00

69 00 6C 00

65 00 73 00

5C 00 57 00

69 00 6E 00

64 00 6F 00

77 00 73 00

20 00 4D 00

65 00 64 00

69 00 61 00

20 00 50 00

6C 00 61 00

79 00 65 00

72 00 5C 00

77 00 6D 00

70 00 6C 00

61 00 79 00

65 00 72 00

2E 00 65 00

78 00 65 00

转换成ANSI字符为"......Program FilesWindows Media "

七、工作目录段 同上。

例:因为文件头中○1flags的第四位没有置位,所以此段不存在

八、 命令行段 同上。

例:因为文件头中○1flags的第五位没有置位,所以此段不存在

九、图标文件段 同上。

例: 因为文件头中○1flags的第六位没有置位,所以此段不存在

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

本文标签: 文件目标快捷方式信息