--- name: analyzing-lnk-file-and-jump-list-artifacts description: Analyze Windows LNK shortcut files and Jump List artifacts to establish evidence of file access, program execution, and user activity using LECmd, JLECmd, and manual binary parsing of the Shell Link Binary format. domain: cybersecurity subdomain: digital-forensics tags: - lnk-files - jump-lists - lecmd - jlecmd - windows-forensics - shell-link - user-activity - file-access - program-execution - recent-files version: '1.0' author: mahipal license: Apache-2.0 nist_csf: - RS.AN-01 - RS.AN-03 - DE.AE-02 - RS.MA-01 --- # Analyzing LNK File and Jump List Artifacts ## Overview Windows LNK (shortcut) files and Jump Lists are critical forensic artifacts that provide evidence of file access, program execution, and user behavior. LNK files are created automatically when a user opens a file through Windows Explorer or the Open/Save dialog, storing metadata about the target file including its original path, timestamps, volume serial number, NetBIOS name, and MAC address of the host system. Jump Lists, introduced in Windows 7, extend this by maintaining per-application lists of recently and frequently accessed files. These artifacts persist even after the target files are deleted, making them invaluable for establishing that a user accessed specific files at specific times. ## When to Use - When investigating security incidents that require analyzing lnk file and jump list artifacts - When building detection rules or threat hunting queries for this domain - When SOC analysts need structured procedures for this analysis type - When validating security monitoring coverage for related attack techniques ## Prerequisites - LECmd (Eric Zimmerman) for LNK file parsing - JLECmd (Eric Zimmerman) for Jump List parsing - Python 3.8+ with pylnk3 or LnkParse3 libraries - Forensic image or triage collection from Windows system - Timeline Explorer for CSV analysis ## LNK File Locations | Location | Description | |----------|-------------| | `%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\` | Recent files accessed | | `%USERPROFILE%\Desktop\` | User-created shortcuts | | `%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\` | Start Menu shortcuts | | `%USERPROFILE%\AppData\Roaming\Microsoft\Office\Recent\` | Office recent documents | ## LNK File Structure ### Shell Link Header (76 bytes) | Offset | Size | Field | |--------|------|-------| | 0x00 | 4 | HeaderSize (always 0x0000004C) | | 0x04 | 16 | LinkCLSID (always 00021401-0000-0000-C000-000000000046) | | 0x14 | 4 | LinkFlags | | 0x18 | 4 | FileAttributes | | 0x1C | 8 | CreationTime (FILETIME) | | 0x24 | 8 | AccessTime (FILETIME) | | 0x2C | 8 | WriteTime (FILETIME) | | 0x34 | 4 | FileSize of target | | 0x38 | 4 | IconIndex | | 0x3C | 4 | ShowCommand | | 0x40 | 2 | HotKey | ### Key Forensic Fields in LNK Files - **Target file timestamps**: Creation, access, modification times of the referenced file - **Volume information**: Serial number, drive type, volume label - **Network share information**: UNC path, share name - **Machine identifiers**: NetBIOS name, MAC address (from TrackerDataBlock) - **Distributed Link Tracking**: Machine ID and object GUID ## Analysis with EZ Tools ### LECmd - LNK File Parser ```powershell # Parse all LNK files in Recent folder LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_analysis.csv # Parse a single LNK file with full details LECmd.exe -f "C:\Evidence\Users\suspect\Desktop\Confidential.docx.lnk" --json C:\Output # Parse LNK files with additional detail levels LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_all.csv --all ``` ### JLECmd - Jump List Parser ```powershell # Parse Automatic Jump Lists JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv # Parse Custom Jump Lists JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations" --csv C:\Output --csvf jumplists_custom.csv # Parse all jump lists with detailed output JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv --ld ``` ## Jump List Structure ### Automatic Destinations (automaticDestinations-ms) These are OLE Compound files (Structured Storage) identified by AppID hash in the filename: | AppID Hash | Application | |-----------|-------------| | 5f7b5f1e01b83767 | Windows Explorer Pinned/Frequent | | 1b4dd67f29cb1962 | Windows Explorer Recent | | 9b9cdc69c1c24e2b | Notepad | | a7bd71699cd38d1c | Notepad++ | | 12dc1ea8e34b5a6 | Microsoft Paint | | 7e4dca80246863e3 | Control Panel | | 1cf97c38a5881255 | Microsoft Edge | | f01b4d95cf55d32a | Windows Explorer | | 9d1f905ce5044aee | Microsoft Excel | | a4a5324453625195 | Microsoft Word | | d00655d2aa12ff6d | Microsoft PowerPoint | | bc03160ee1a59fc1 | Outlook | ### Custom Destinations (customDestinations-ms) Created when users pin items to application jump lists. These files contain sequential LNK entries. ## Python Analysis Script ```python import struct import os from datetime import datetime, timedelta FILETIME_EPOCH = datetime(1601, 1, 1) def filetime_to_datetime(filetime_bytes: bytes) -> datetime: """Convert Windows FILETIME (100-ns intervals since 1601) to datetime.""" ft = struct.unpack(" dict: """Parse the Shell Link header from an LNK file.""" with open(lnk_path, "rb") as f: header = f.read(76) header_size = struct.unpack("