• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

恶意代码技术理论:恶意脚本-LNK分析

恶意脚本 云涯 3年前 (2021-06-15) 1918次浏览

 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 标头部分的大小(以字节为单位),

该大小由LinkInfoSizeLinkInfoHeaderSize, LinkInfoFlags

VolumeIDOffsetLocalBasePathOffset

CommonNetworkRelativeLinkOffset, CommonPathSuffixOffset字段

以及包括LocalBasePathOffsetUnicode 和CommonPathSuffixOffsetUnicode字段。

LinkInfoFlags  (4个字节):用于指定在此结构中是否存在VolumeIDLocalBasePath

LocalBasePathUnicodeCommonNetworkRelativeLink字段的标志。

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个字节):用于指定DeviceNameOffsetNetProviderType 字段的内容的标志。

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末尾.

 

因为 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

解码包含在快捷方式文件中的所有可用信息


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:恶意代码技术理论:恶意脚本-LNK分析
喜欢 (0)