1. Lnk格式解析
微软原文链接:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/16cb4ca1-9339-4d0c-a68d-bf1d6cc0f943
微软文件手册:https://docs.microsoft.com/en-us/openspecs/windows_protocols/MS-WINPROTLP/e36c976a-6263-42a8-b119-7a3cc41ddd2a
shell link:Link的二进制文件格式的结构
.LNK 文件格式 |
1. SHELL_LINK_HEADER 包含标识信息,时间戳和标志,这些标志指定了可选结构的存在 |
2. LINKTARGET_IDLIST 指定链接的目标 此结构的存在由ShellLinkHeader中的HasLinkTargetIDList 位指定。 |
3. LINKINFO 该结构指定解析链接目标所需的信息。由ShellLinkHeader中的HasLinkInfo 位指定。 |
4. STRING_DATA 零个或多个可选的StringData 结构,用于传递用户界面和路径标识信息。这些结构的存在由ShellLinkHeader中的位指定。 |
5. EXTRA_DATA 零个或多个ExtraData 结构 |
1.1 文件头
字段 | 偏移 | 尺寸/类型 | 描述 |
HeaderSize | 0h | 4字节 | 值常为0000004CH,为字符”L” |
LinkCLSID | 4h | 16 字节 | 甲类标识符(CLSID)该值必须为00021401-0000-0000-C000-000000000046 |
LinkFlags | 14h | 4字节 | Flags,该结构指定有关Shell链接的信息以及该结构的可选部分的存在 |
FileAttributes | 18h | 4字节 | 目标文件属性 |
CreationTime | 1ch | 8字节 | 文件创建时间 |
AccessTime | 24h | 8字节 | 文件修改时间 |
WriteTime | 2ch | 8字节 | 文件最后一次访问时间 |
FileSize | 34h | 4字节 | 目标文件长度 |
IconIndex | 38h | 4字节 | 自定义图标个数, |
ShowCommand | 3ch | 4字节 | 目标文件执行时窗口显示方式: 1、SW_SHOWNORMAL 0x00000001 正常显示 2、SW_SHOWMAXIMIZED 0x00000003 最小化 3、SW_SHOWMINNOACTIVE 0x00000007 最大化 |
HotKey | 40h | 2字节 | 热键 |
Reserved1/2/3 | 42h | 10字节 | 必须为0 |
LinkFlags可选属性,见下表:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A A | 0 | 0 | 0 | 0 | 0 |
值 | 描述 |
A HasLinkTargetIDList | 项目ID列表(IDList)。如果该位置1,则LinkTargetIDList 结构,必须遵循ShellLinkHeader定义。如果未设置此位,则不得存在此结构。 |
B HasLinkInfo | 链接信息。如果该位置1,则必须存在LinkInfo结构。如果未设置此位,则不得存在此结构。 |
C HasName | 名称字符串。如果该位置1,则必须存在NAME_STRING StringData结构。如果未设置此位,则不得存在此结构。 |
D HasRelativePath | 相对路径字符串。如果该位置1,则必须存在RELATIVE_PATH StringData结构。如果未设置此位,则不得存在此结构 |
E HasWorkingDir | 工作目录字符串。如果该位置1,则必须存在WORKING_DIR StringData结构。如果未设置此位,则不得存在此结构。 |
F HasArguments | 命令行参数。如果该位置1,则必须存在COMMAND_LINE_ARGUMENTS StringData结构。如果未设置此位,则不得存在此结构。 |
G HasIconLocation | 图标位置字符串。如果该位置1,则必须存在ICON_LOCATION StringData结构。如果未设置此位,则不得存在此结构。 |
H IsUnicode | Unicode编码的字符串,应设置。如果设置了该位,则StringData节包含Unicode编码的字符串;否则,字符串为0。否则,它包含使用系统默认代码页编码的字符串。 |
I ForceNoLinkInfo | LinkInfo结构 |
J HasExpString | EnvironmentVariableDataBlock |
K RunInSeparateProcess | 作为16位应用程序的链接目标启动时,该目标在单独的虚拟机中运行 |
L Unused1 | 未定义的位,忽略 |
M HasDarwinID | Darwin Data Block |
N RunAsUser | 当激活链接的目标时,该应用程序将以其他用户身份运行 |
O HasExpIcon | 图标环境数据块 |
P NoPidlAlias | 当将项的路径解析为IDList时,文件系统位置在shell名称空间中表示。 |
Q Unused2 | 未定义的位,忽略 |
R RunWithShimLayer | Shim Data Block |
S ForceNoLinkTrack | 跟踪数据块 |
T EnableTargetMetadata | 当设置了链接目标时,shell链接尝试收集目标属性并将它们存储在PropertyStoreDataBlock中。 |
U DisableLinkPathTracking | EnvironmentVariableDataBlock |
V DisableKnownFolderTracking | 当加载shell链接时,SpecialFolderDataBlock)和KnownFolderDataBlock被忽略。如果设置了这个位,那么在保存shell链接时不应该保存这些额外的数据块。 |
W DisableKnownFolderAlias | 如果链接有一个KnownFolderDataBlock,当链接加载时翻译目标IDList时,应该使用已知文件夹IDList的无别名形式。 |
X AllowLinkToLink | 创建引用另一个链接的链接是启用的。否则,不允许将链接指定为目标IDList。 |
Y UnaliasOnSave | 当保存目标IDList位于已知文件夹下的链接时,应该使用该已知文件夹的无别名形式或目标IDList。 |
Z PreferEnvironmentPath | 不应该存储目标IDList;相反,应该使用EnvironmentVariableDataBlock中指定的路径来引用目标。 |
AA KeepLocalIDListForUNCTarget | 当目标是引用本地机器上某个位置的UNC名称时,应该存储PropertyStoreDataBlock中的本地路径IDList,以便在本地机器上加载链接时可以使用它。 |
FileAttributesFlags可选属性如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
值 | 描述 |
A FILE_ATTRIBUTE_READONLY | 该文件或目录是只读的。对于文件,如果设置了此位,则应用程序可以读取文件,但不能对其进行写入或删除。对于目录,如果设置了此位,则应用程序无法删除该目录。 |
B FILE_ATTRIBUTE_HIDDEN | 文件或目录被隐藏。如果设置此位,则文件或文件夹不包含在普通目录列表中。 |
C FILE_ATTRIBUTE_SYSTEM | 该文件或目录是操作系统的一部分,或仅由操作系统使用。 |
D Reserved1 | 0 |
E FILE_ATTRIBUTE_DIRECTORY | 链接目标是目录而不是文件。 |
F FILE_ATTRIBUTE_ARCHIVE | 该文件或目录是一个存档文件。应用程序使用此标志来标记文件以进行备份或删除。 |
G Reserved2 | 0 |
H FILE_ATTRIBUTE_NORMAL | 文件或目录未设置其他标志。如果该位为1,则必须清除该结构中的所有其他位。 |
I FILE_ATTRIBUTE_TEMPORARY | 该文件正在用于临时存储。 |
J FILE_ATTRIBUTE_SPARSE_FILE | 该文件是稀疏文件(sparse file) |
K FILE_ATTRIBUTE_REPARSE_POINT | 文件或目录具有关联的重新解析点。 |
L FILE_ATTRIBUTE_COMPRESSED | 文件或目录已压缩。对于文件,这意味着文件中的所有数据都已压缩。对于目录,这意味着压缩是新创建的文件和子目录的默认设置。 |
M FILE_ATTRIBUTE_OFFLINE | 该文件的数据不是立即可用的。 |
N FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | 该文件的内容需要索引。 |
O FILE_ATTRIBUTE_ENCRYPTED | 文件或目录已加密。对于文件,这意味着文件中的所有数据都已加密。对于目录,这意味着加密是新创建的文件和子目录的默认设置。 |
文件属性另一种简介对应:
Bit | 所在位为1时表示 |
0 | 快捷方式所指目标文件有只读属性 |
1 | 快捷方式所指目标文件有隐藏属性 |
2 | 快捷方式所指目标文件是系统文件 |
3 | 快捷方式所指目标是卷标 |
4 | 快捷方式所指目标是文件夹 |
5 | 快捷方式所指目标文件上次存档后被改变过 |
6 | 快捷方式所指目标文件被加密 |
7 | 快捷方式所指目标文件属性为一般 |
8 | 快捷方式所指目标文件为临时 |
9 | 快捷方式所指目标文件为稀疏文件(sparse file) |
10 | 快捷方式所指目标文件有重分析点数据(reparse point) |
11 | 快捷方式所指目标文件被压缩 |
12 | 快捷方式所指目标文件脱机 |
例如:
偏移 数据 解释
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。二进制是1000 1111
对照表可知
有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
1.2 LinkTargetIDList
LinkTargetIDList结构指定链接的目标。这个可选结构的存在ShellLinkHeader的指定HasLinkTargetIDList 位
0-15 IDListSize(2个字节):IDList字段的大小(以字节为单位)。
16-31 IDList(变量) 存储的IDList 结构,其中包含项目IDList。
1.2.1 IDList
ItemIDList(变量):零个或多个ItemID结构的数组
TerminalID:(2个字节):一个16位无符号整数,指示项目ID的结尾。该值必须为零。
1.2.2 ItemID
ItemID是IDList结构中的元素。存储在给定ItemID中的数据由与先前ItemID在目标名称空间中的位置相对应的源定义。该数据唯一标识名称空间中该部分中的项目。
可以很多个
0-15 ItemIDSize(2个字节):一个16位无符号整数,以字节为单位指定ItemID结构(包括ItemIDSize字段)的大小。
16-31 Data(变量): Shell数据源定义的数据,用于指定项目。
1.3 文件位置信息段 LinkInfo
LinkInfo结构指定解析链接目标所必需的信息。这包括有关目标存储所在的卷的信息,映射的驱动器号以及路径的通用命名约定(UNC)形式。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
LinkInfoSize (4个字节):一个32位无符号整数,指定LinkInfo结构的大小(以字节为单位)。
在此结构中指定的所有偏移量都必须小于该值,并且在此结构中包含的所有字符串必须在此大小定义的范围内。 |
|||||||||||||||||||||||||||||||
LinkInfoHeaderSize (4个字节):一个32位无符号整数,指定LinkInfo 标头部分的大小(以字节为单位),
该大小由LinkInfoSize,LinkInfoHeaderSize, LinkInfoFlags, VolumeIDOffset,LocalBasePathOffset, CommonNetworkRelativeLinkOffset, CommonPathSuffixOffset字段 以及包括LocalBasePathOffsetUnicode 和CommonPathSuffixOffsetUnicode字段。 |
|||||||||||||||||||||||||||||||
LinkInfoFlags (4个字节):用于指定在此结构中是否存在VolumeID,LocalBasePath,
LocalBasePathUnicode和CommonNetworkRelativeLink字段的标志。 |
|||||||||||||||||||||||||||||||
VolumeIDOffset (4个字节):一个32位无符号整数,指定VolumeID字段的位置。
如果 设置了VolumeIDAndLocalBasePath标志,则此值是距LinkInfo结构的开始的偏移量(以字节为单位)。否则,该值必须为零。 |
|||||||||||||||||||||||||||||||
LocalBasePathOffset (4个字节):一个32位无符号整数,指定LocalBasePath字段的位置。
如果设置了VolumeIDAndLocalBasePath标志,则此值是距LinkInfo结构的开始的偏移量(以字节为单位)。否则,该值必须为零。 |
|||||||||||||||||||||||||||||||
CommonNetworkRelativeLinkOffset (4个字节):一个32位无符号整数,
用于指定CommonNetworkRelativeLink 字段的位置。 如果设置了CommonNetworkRelativeLinkAndPathSuffix标志, 则此值是从LinkInfo结构的开始的偏移量(以字节为单位)。否则,该值必须为零。 |
|||||||||||||||||||||||||||||||
CommonPathSuffixOffset (4个字节):一个32位无符号整数,
用于指定CommonPathSuffix 字段的位置。此值是距LinkInfo结构的开始的偏移量(以字节为单位)。 |
|||||||||||||||||||||||||||||||
LocalBasePathOffsetUnicode (optional) (4个字节):一个可选的32位无符号整数,
用于指定LocalBasePathUnicode 字段的位置。如果设置了VolumeIDAndLocalBasePath标志, 则此值是距LinkInfo结构的开始的偏移量(以字节为单位)。否则,该值必须为零。仅当 LinkInfoHeaderSize 字段的值大于或等于0x00000024时,此字段才可以存在。 |
|||||||||||||||||||||||||||||||
CommonPathSuffixOffsetUnicode (optional) (4个字节):一个可选的32位无符号整数,
用于指定CommonPathSuffixUnicode 字段的位置。此值是距LinkInfo结构的开始的偏移量(以字节为单位)。 仅当LinkInfoHeaderSize 字段的值大于或等于0x00000024时,此字段才可以存在。 |
|||||||||||||||||||||||||||||||
VolumeID (variable) 可选的VolumeID 结构,指定有关创建链接时链接目标所在的卷的信息。
如果设置了VolumeIDAndLocalBasePath标志,则此字段存在。 |
|||||||||||||||||||||||||||||||
… | |||||||||||||||||||||||||||||||
LocalBasePath (variable) 一个可选的,以NULL终止的字符串,由系统默认代码页定义,
该字符串用于通过将字符串附加到CommonPathSuffix字段中来构造链接项或链接目标的完整路径。 如果 设置了VolumeIDAndLocalBasePath标志,则此字段存在。 |
|||||||||||||||||||||||||||||||
… | |||||||||||||||||||||||||||||||
CommonNetworkRelativeLink (variable) 可选的CommonNetworkRelativeLink 结构,
用于指定有关存储链接目标的网络位置的信息。 |
|||||||||||||||||||||||||||||||
… | |||||||||||||||||||||||||||||||
CommonPathSuffix (variable) 一个由NULL终止的字符串,由系统默认代码页定义,
用于通过将其附加到LocalBasePath字段中的字符串来构造链接项或链接目标的完整路径。 |
|||||||||||||||||||||||||||||||
… | |||||||||||||||||||||||||||||||
LocalBasePathUnicode (variable) 一个可选的,以NULL结尾的Unicode字符串,
用于通过将字符串附加到CommonPathSuffixUnicode字段中来构造链接项或链接目标的完整路径。 仅当设置了VolumeIDAndLocalBasePath标志并且LinkInfoHeaderSize字段的值大于或等于0x00000024时,此字段才可以存在。 |
|||||||||||||||||||||||||||||||
… | |||||||||||||||||||||||||||||||
CommonPathSuffixUnicode (variable) 一个可选的,以NULL结尾的Unicode字符串,
用于通过将其附加到LocalBasePathUnicode 字段中的字符串来构造链接项或链接目标的完整路径。 仅当LinkInfoHeaderSize 字段的值大于或等于0x00000024时,此字段才可以存在。 |
|||||||||||||||||||||||||||||||
… |
1.3.1 VolumeID
VolumeID结构指定有关创建链接时链接目标所在的卷的信息
VolumeIDSize(4个字节):一个32位无符号整数,以字节为单位指定此结构的大小。该值必须大于0x00000010。在此结构中指定的所有偏移量都必须小于该值,并且在此结构中包含的所有字符串必须在此大小定义的范围内。
DriveType(4个字节):一个32位无符号整数,指定存储链接目标的驱动器的类型。
DriveSerialNumber(4个字节):一个32位无符号整数,指定存储链接目标的卷的驱动器序列号。
VolumeLabelOffset(4个字节):一个32位无符号整数,指定一个字符串的位置,该字符串包含存储链接目标的驱动器的卷标。此值是从VolumeID结构的开始到以NULL终止的字符串(由系统默认代码页定义)的偏移量(以字节为单位)。卷标签字符串位于此结构的“ 数据”字段中。如果该字段的值为0x00000014,则必须将其忽略,并且必须使用VolumeLabelOffsetUnicode字段的值来定位卷标签字符串。
VolumeLabelOffsetUnicode(4字节):一个可选的32位无符号整数,它指定一个字符串的位置,该字符串包含存储链接目标的驱动器的卷标。此值是从VolumeID结构的开始到NULL终止的Unicode字符串的偏移量(以字节为单位)。卷标签字符串位于此结构的“ 数据”字段中。如果VolumeLabelOffset字段的值不为0x00000014,则该字段不得存在。相反, 必须使用VolumeLabelOffset字段的值来定位卷标签字符串。
Data (variable): 一种数据缓冲区,包含驱动器的卷标,它是由系统默认代码页或Unicode字符(由前面的字段指定)定义的字符串。
1.3.2 CommonNetworkRelativeLink
CommonNetworkRelativeLink结构指定有关存储链接目标的网络位置的信息,包括映射的驱动器号和UNC路径前缀。
CommonNetworkRelativeLinkSize(4个字节):一个32位无符号整数,指定CommonNetworkRelativeLink结构的大小(以字节为单位)。该值必须大于或等于0x00000014。在此结构中指定的所有偏移量都必须小于该值,并且在此结构中包含的所有字符串必须在此大小定义的范围内。
CommonNetworkRelativeLinkFlags(4个字节):用于指定DeviceNameOffset和NetProviderType 字段的内容的标志。
NetNameOffset(4个字节):一个32位无符号整数,用于指定NetName字段的位置。此值是从CommonNetworkRelativeLink结构开始的偏移量(以字节为单位)。
DeviceNameOffset(4个字节):一个32位无符号整数,指定DeviceName字段的位置。如果 设置了ValidDevice标志,则此值是从CommonNetworkRelativeLink结构开始处的偏移量(以字节为单位)。否则,该值必须为零。
NetworkProviderType(4个字节):一个32位无符号整数,用于指定网络提供商的类型。
NetNameOffsetUnicode(4个字节):一个可选的32位无符号整数,用于指定NetNameUnicode 字段的位置。此值是从CommonNetworkRelativeLink结构开始的偏移量(以字节为单位)。如果NetNameOffset字段的值大于0x00000014,则该字段必须存在。否则,该字段不得存在。
DeviceNameOffsetUnicode(4个字节):一个可选的32位无符号整数,用于指定DeviceNameUnicode 字段的位置。此值是从CommonNetworkRelativeLink结构开始的偏移量(以字节为单位)。如果NetNameOffset字段的值大于0x00000014,则该字段必须存在。否则,该字段不得存在。
NetName(变量):一个以NULL终止的字符串,由系统默认代码页定义,该字符串指定服务器共享路径。例如“ \\服务器\共享”。
DeviceName(变量):一个以NULL终止的字符串,由系统默认代码页定义,用于指定设备;例如,驱动器号“ D:”。
NetNameUnicode(变量):一个可选的,以NULL结尾的Unicode字符串,它是NetName字符串的Unicode版本。如果NetNameOffset字段的值大于0x00000014,则该字段必须存在。否则,该字段不得存在。
DeviceNameUnicode(变量):一个可选的,以NULL结尾的Unicode字符串,它是DeviceName 字符串的Unicode版本。如果NetNameOffset 字段的值大于0x00000014,则该字段必须存在。否则,该字段不得存在。
另一种解释如下:
如果文件在本地卷,那么文件名为:本地路径信息+附加信息
如果文件在网络卷,那么文件名为:网络卷信息中的共享名+附加信息
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的值 例如:
偏移 数据 解释
段头
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 Files/Windows Media Player/wmplayer.exe
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.4 StringData
StringData是指传达用户界面和路径标识信息的一组结构。这些可选结构的存在由ShellLinkHeader 中的LinkFlags控制。
符合以下规则:
NAME_STRING:一种可选结构,用于指定对快捷方式的描述,该快捷方式的描述将显示给最终用户以标识shell链接的用途。如果设置了HasName标志,则必须存在此结构。
RELATIVE_PATH:一个可选结构,用于指定链接目标相对于包含外壳链接的文件的位置。指定时,在解析链接时应使用该字符串。如果设置了HasRelativePath标志,则必须存在此结构。
WORKING_DIR:一个可选结构,用于指定激活链接目标时要使用的工作目录的文件系统路径。如果设置了HasWorkingDir标志,则必须存在此结构。
COMMAND_LINE_ARGUMENTS:一种可选结构,用于存储在激活链接目标时指定的命令行参数。如果设置了HasArguments标志,则必须存在此结构。
ICON_LOCATION:一个可选结构,用于指定在图标视图中显示外壳程序链接项时要使用的图标的位置。如果设置了HasIconLocation标志,则必须存在此结构。
具有以下结构:
CountCharacters (2 bytes)::一个16位无符号整数,它指定由系统默认代码页定义的字符数或在“ 字符串”字段中找到的Unicode字符数。零值表示一个空字符串。
String (variable):由系统默认代码页定义的可选字符集,或由CountCharacters字段指定长度的Unicode字符串。该字符串不得以NULL结尾
1.4.1 EnvironmentVariableDataBlock
LinkFlags中HasExpString设为1,文件包含EnvironmentVariableDataBlock:
BlockSize(4 bytes):该字段值必须为0x0314
BlockSignature (4 bytes):该字段值必须为0xA0000001
TargetAnsi (260 bytes):指定环境变量路径(ANSI字符串)
TargetUnicode(520 bytes):指定环境变量路径(UNICODE字符串)
1.5 描述字符段
开始的一个unsigned short int表示描述字符串的长度(描述字符为Unicode字符,所以字节数需乘以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.6 相对路径段
同描述字符段一样开始的一个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 Files/Windows Media Player/wmplayer.exe”
1.7 工作目录段
1.8 命令行段
1.9 图标文件段
1.10 ExtraData
ExtraData是指传达有关链接目标的其他信息的一组结构。这些可选结构可以出现在附加的数据段中 ,该数据段附加到基本Shell链接二进制文件格式中。
1.11 具体实例
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0000 | 4C | 00 | 00 | 00 | 01 | 14 | 02 | 00 | 00 | 00 | 00 | 00 | C0 | 00 | 00 | 00 |
0010 | 00 | 00 | 00 | 46 | 9B | 00 | 08 | 00 | 20 | 00 | 00 | 00 | D0 | E9 | EE | F2 |
0020 | 15 | 15 | C9 | 01 | D0 | E9 | EE | F2 | 15 | 15 | C9 | 01 | D0 | E9 | EE | F2 |
0030 | 15 | 15 | C9 | 01 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 01 | 00 | 00 | 00 |
0040 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | BD | 00 | 14 | 00 |
0050 | 1F | 50 | E0 | 4F | D0 | 20 | EA | 3A | 69 | 10 | A2 | D8 | 08 | 00 | 2B | 30 |
0060 | 30 | 9D | 19 | 00 | 2F | 43 | 3A | 5C | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
0070 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 46 | 00 | 31 | 00 | 00 |
0080 | 00 | 00 | 00 | 2C | 39 | 69 | A3 | 10 | 00 | 74 | 65 | 73 | 74 | 00 | 00 | 32 |
0090 | 00 | 07 | 00 | 04 | 00 | EF | BE | 2C | 39 | 65 | A3 | 2C | 39 | 69 | A3 | 26 |
00A0 | 00 | 00 | 00 | 03 | 1E | 00 | 00 | 00 | 00 | F5 | 1E | 00 | 00 | 00 | 00 | 00 |
00B0 | 00 | 00 | 00 | 00 | 00 | 74 | 00 | 65 | 00 | 73 | 00 | 74 | 00 | 00 | 00 | 14 |
00C0 | 00 | 48 | 00 | 32 | 00 | 00 | 00 | 00 | 00 | 2C | 39 | 69 | A3 | 20 | 00 | 61 |
00D0 | 2E | 74 | 78 | 74 | 00 | 34 | 00 | 07 | 00 | 04 | 00 | EF | BE | 2C | 39 | 69 |
00E0 | A3 | 2C | 39 | 69 | A3 | 26 | 00 | 00 | 00 | 2D | 6E | 00 | 00 | 00 | 00 | 96 |
00F0 | 01 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 61 | 00 | 2E | 00 | 74 |
0100 | 00 | 78 | 00 | 74 | 00 | 00 | 00 | 14 | 00 | 00 | 00 | 3C | 00 | 00 | 00 | 1C |
0110 | 00 | 00 | 00 | 01 | 00 | 00 | 00 | 1C | 00 | 00 | 00 | 2D | 00 | 00 | 00 | 00 |
0120 | 00 | 00 | 00 | 3B | 00 | 00 | 00 | 11 | 00 | 00 | 00 | 03 | 00 | 00 | 00 | 81 |
0130 | 8A | 7A | 30 | 10 | 00 | 00 | 00 | 00 | 43 | 3A | 5C | 74 | 65 | 73 | 74 | 5C |
0140 | 61 | 2E | 74 | 78 | 74 | 00 | 00 | 07 | 00 | 2E | 00 | 5C | 00 | 61 | 00 | 2E |
0150 | 00 | 74 | 00 | 78 | 00 | 74 | 00 | 07 | 00 | 43 | 00 | 3A | 00 | 5C | 00 | 74 |
0160 | 00 | 65 | 00 | 73 | 00 | 74 | 00 | 60 | 00 | 00 | 00 | 03 | 00 | 00 | A0 | 58 |
0170 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 63 | 68 | 72 | 69 | 73 | 2D | 78 | 70 | 73 |
0180 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 40 | 78 | C7 | 94 | 47 | FA | C7 | 46 | B3 |
0190 | 56 | 5C | 2D | C6 | B6 | D1 | 15 | EC | 46 | CD | 7B | 22 | 7F | DD | 11 | 94 |
01A0 | 99 | 00 | 13 | 72 | 16 | 87 | 4A | 40 | 78 | C7 | 94 | 47 | FA | C7 | 46 | B3 |
01B0 | 56 | 5C | 2D | C6 | B6 | D1 | 15 | EC | 46 | CD | 7B | 22 | 7F | DD | 11 | 94 |
01C0 | 99 | 00 | 13 | 72 | 16 | 87 | 4A | 00 | 00 | 00 | 00 |
HeaderSize: (4 bytes, offset 0x0000), 固定为0x0000004C
LinkCLSID: (16 bytes, offset 0x0004), 固定为00021401-0000-0000-C000-000000000046.
LinkFlags: (4 bytes, offset 0x0014), 0x0008009B 设置了 LinkFlags:
- HasLinkTargetIDList
- HasLinkInfo
- HasRelativePath
- HasWorkingDir
- IsUnicode
- EnableTargetMetadata
FileAttributes: (4 bytes, offset 0x0018), 0x00000020, 表示设置了 FileAttributesFlags :
- FILE_ATTRIBUTE_ARCHIVE
CreationTime: (8 bytes, offset 0x001C) FILETIME(文件创建时间) :9/12/08, 8:27:17PM.
AccessTime: (8 bytes, offset 0x0024) FILETIME(文件访问时间) 9/12/08, 8:27:17PM.
WriteTime: (8 bytes, offset 0x002C) FILETIME (文件修改时间)9/12/08, 8:27:17PM.
FileSize(文件尺寸): (4 bytes, offset 0x0034), 0x00000000.
IconIndex(图标索引): (4 bytes, offset 0x0038), 0x00000000.
ShowCommand(命令行): (4 bytes, offset 0x003C), SW_SHOWNORMAL(1).
Hotkey(热键): (2 bytes, offset 0x0040), 0x0000.
Reserved: (2 bytes, offset 0x0042), 0x0000.
Reserved2: (4 bytes, offset 0x0044), 0 x00000000.
Reserved3: (4 bytes, offset 0x0048), 0 x00000000.
因为HasLinkTargetIDList 被设置, LinkTargetIDList结构(section 2.2) 如下:
- IDListSize: (2 bytes, offset 0x004C), 0x00BD, IDList大小.
- IDList: (189 bytes, offset 0x004E) IDList 结构 (section 2.2.1)如下:
- ItemIDList: (187 bytes, offset 0x004E), ItemID 结构如下:
- ItemIDSize: (2 bytes, offset 0x004E), 0x0014
- Data: (12 bytes, offset 0x0050), <18 bytes of data> [computer]
- ItemIDSize: (2 bytes, offset 0x0062), 0x0019
- Data: (23 bytes, offset 0x0064), <23 bytes of data> [c:]
- ItemIDSize: (2 bytes, offset 0x007B), 0x0046
- Data: (68 bytes, offset 0x007D), <68 bytes of data> [test]
- ItemIDSize: (2 bytes, offset 0x00C1), 0x0048
- Data: (68 bytes, offset 0x00C3), <70 bytes of data> [a.txt]
- TerminalID: (2 bytes, offset 0x0109), 0x0000 表示 IDList末尾.
- ItemIDList: (187 bytes, offset 0x004E), ItemID 结构如下:
因为 HasLinkInfo 被设置, a LinkInfo 结构 (section 2.3) 如下:
- LinkInfoSize: (4 bytes, offset 0x010B), 0x0000003C
- LinkInfoHeaderSize: (4 bytes, offset 0x010F), 0x0000001C 如LinkInfo结构定义中所指定.
- LinkInfoFlags: (4 bytes, offset 0x0113), 0x00000001 VolumeIDAndLocalBasePath 被设置.
- VolumeIDOffset: (4 bytes, offset 0x0117), 0x0000001C, 引用偏移量 0x0127.
- LocalBasePathOffset: (4 bytes, offset 0x011B), 0x0000002D, 引用字符串 “C:\test\a.txt”.
- CommonNetworkRelativeLinkOffset: (4 bytes, offset 0x011F), 0x00000000表示不存在 CommonNetworkRelativeLink .
- CommonPathSuffixOffset: (4 bytes, offset 0x0123), 0x0000003B, 引用偏移量 0x00000146, 字符串 “” (empty string).
- VolumeID: (17 bytes, offset 0x0127), 因为 VolumeIDAndLocalBasePath 被设置, 因此遵循 VolumeID 结构:
- VolumeIDSize: (4 bytes, offset 0x0127), 0x00000011 表示VolumeID 结构的大小.
- DriveType: (4 bytes, offset 0x012B), DRIVE_FIXED(3).
- DriveSerialNumber: (4 bytes, offset 0x012F), 0x307A8A81.
- VolumeLabelOffset: (4 bytes, offset 0x0133), 0x00000010, 指示未指定“卷标偏移量Unicode”,并引用存储卷标的偏移量0x0137。
- Data: (1 byte, offset 0x0137), “” 空字符串.
- LocalBasePath: (14 bytes, offset 0x0138), 因为 设置了VolumeIDAndLocalBasePath,所以存在字符串 “c:\test\a.txt” is present.
- CommonPathSuffix: (1 byte, offset 0x0146), “” 空字符串.
由于设置了HasRelativePath,因此RELATIVE_PATH StringData 结构如下:
- CountCharacters: (2 bytes, offset 0x0147), 0x0007 Unicode 字符.
- String (14 bytes, offset 0x0149), the Unicode string: “.\a.txt”.
因为HasWorkingDir被设置,WORKING_DIR StringData是结构如下:
- CountCharacters: (2 bytes, offset 0x0157), 0x0007 Unicode 字符.
- String (14 bytes, offset 0x0159), Unicode字符串: “c:\test”.
Extra data section: (100 bytes, offset 0x0167), ExtraData 结构如下:
- ExtraDataBlock (96 bytes, offset 0x0167), the TrackerDataBlock structure (section 2.5.10) follows:
- BlockSize: (4 bytes, offset 0x0167), 0x00000060
- BlockSignature: (4 bytes, offset 0x016B), 0xA000003, 用于标识TrackerDataBlock结构
- Length: (4 bytes, offset 0x016F), 0x00000058, 此额外数据块所需的最小大小.
- Version: (4 bytes, offset 0x0173), 0x00000000, 所需的版本.
- MachineID: (16 bytes, offset 0x0177), the character string “chris-xps”, 填充为0.
- Droid: (32 bytes, offset 0x0187), 2 GUID 值
- DroidBirth: (32 bytes, offset 0x01A7), 2 GUID 值.
- TerminalBlock: (4 bytes, offset 0x01C7), 0x00000000 表示额外数据节的结尾
2.分析工具
源码下载:
https://github.com/EricZimmerman/LECmd
解码包含在快捷方式文件中的所有可用信息