analyzing-windows-lnk-files-for-artifacts

解析 Windows LNK 快捷方式文件,提取目标路径、时间戳、卷信息和机器标识符,用于取证时间线重建。

9 stars

Best use case

analyzing-windows-lnk-files-for-artifacts is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

解析 Windows LNK 快捷方式文件,提取目标路径、时间戳、卷信息和机器标识符,用于取证时间线重建。

Teams using analyzing-windows-lnk-files-for-artifacts should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/analyzing-windows-lnk-files-for-artifacts/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/analyzing-windows-lnk-files-for-artifacts/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/analyzing-windows-lnk-files-for-artifacts/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How analyzing-windows-lnk-files-for-artifacts Compares

Feature / Agentanalyzing-windows-lnk-files-for-artifactsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

解析 Windows LNK 快捷方式文件,提取目标路径、时间戳、卷信息和机器标识符,用于取证时间线重建。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 分析 Windows LNK 文件取证痕迹

## 适用场景
- 从 Windows 快捷方式文件重建用户文件访问历史时
- 追踪已访问的文件、网络共享和可移动介质时
- 调查中需证明用户打开了特定文档时
- 将文件访问与其他时间线取证痕迹关联时
- 识别远程系统或 USB 设备上已访问路径时

## 前置条件
- 从取证镜像获取 LNK 文件(Recent、Desktop、Quick Launch)
- 用于分析的 LECmd(Eric Zimmerman)、python-lnk 或 LnkParser
- 了解 LNK 文件结构(Shell Link Binary 格式)
- 了解 Windows 系统上 LNK 文件的位置
- 已安装分析工具的取证工作站

## 工作流程

### 步骤 1:从取证镜像收集 LNK 文件

```bash
# 以只读方式挂载取证镜像
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence

mkdir -p /cases/case-2024-001/lnk/{recent,desktop,startup,custom}

# 复制 Recent 目录下的 LNK 文件(主要来源)
cp /mnt/evidence/Users/*/AppData/Roaming/Microsoft/Windows/Recent/*.lnk \
   /cases/case-2024-001/lnk/recent/ 2>/dev/null

# 复制自动目标文件(Jump Lists)
cp /mnt/evidence/Users/*/AppData/Roaming/Microsoft/Windows/Recent/AutomaticDestinations/*.automaticDestinations-ms \
   /cases/case-2024-001/lnk/recent/ 2>/dev/null

# 复制自定义目标文件(固定的 Jump List 项目)
cp /mnt/evidence/Users/*/AppData/Roaming/Microsoft/Windows/Recent/CustomDestinations/*.customDestinations-ms \
   /cases/case-2024-001/lnk/custom/ 2>/dev/null

# 复制桌面快捷方式
cp /mnt/evidence/Users/*/Desktop/*.lnk /cases/case-2024-001/lnk/desktop/ 2>/dev/null

# 复制 Startup 文件夹快捷方式(持久化)
cp /mnt/evidence/Users/*/AppData/Roaming/Microsoft/Windows/Start\ Menu/Programs/Startup/*.lnk \
   /cases/case-2024-001/lnk/startup/ 2>/dev/null
cp "/mnt/evidence/ProgramData/Microsoft/Windows/Start Menu/Programs/Startup"/*.lnk \
   /cases/case-2024-001/lnk/startup/ 2>/dev/null

# 查找系统中所有 LNK 文件
find /mnt/evidence/ -name "*.lnk" -type f 2>/dev/null > /cases/case-2024-001/lnk/all_lnk_locations.txt

# 统计并哈希
ls /cases/case-2024-001/lnk/recent/ | wc -l
sha256sum /cases/case-2024-001/lnk/recent/*.lnk > /cases/case-2024-001/lnk/lnk_hashes.txt 2>/dev/null
```

### 步骤 2:使用 LECmd 解析 LNK 文件

```bash
# 使用 Eric Zimmerman 的 LECmd(Windows 或通过 Mono)
# 处理目录中所有 LNK 文件
LECmd.exe -d "C:\cases\lnk\recent\" --csv "C:\cases\analysis\" --csvf lnk_analysis.csv

# 以详细输出模式处理单个 LNK 文件
LECmd.exe -f "C:\cases\lnk\recent\document.pdf.lnk"

# 处理 Jump List 文件
JLECmd.exe -d "C:\cases\lnk\recent\" --csv "C:\cases\analysis\" --csvf jumplist_analysis.csv

# 输出包含:
# - 源文件路径
# - 目标路径(被访问的文件)
# - 目标创建、修改、访问时间戳
# - LNK 创建和修改时间戳
# - 工作目录
# - 命令行参数
# - 卷序列号和标签
# - 驱动器类型(Fixed、Removable、Network)
# - 机器 ID(NetBIOS 名称)
# - MAC 地址(来自 tracker 数据库)
# - 目标文件大小
```

### 步骤 3:使用 Python 解析 LNK 文件

```bash
pip install LnkParse3

python3 << 'PYEOF'
import LnkParse3
import os, json, csv
from datetime import datetime

lnk_dir = '/cases/case-2024-001/lnk/recent/'
results = []

for filename in sorted(os.listdir(lnk_dir)):
    if not filename.lower().endswith('.lnk'):
        continue

    filepath = os.path.join(lnk_dir, filename)
    try:
        with open(filepath, 'rb') as f:
            lnk = LnkParse3.lnk_file(f)
            info = lnk.get_json()

            parsed = {
                'lnk_file': filename,
                'target_path': '',
                'working_dir': '',
                'arguments': '',
                'target_created': '',
                'target_modified': '',
                'target_accessed': '',
                'file_size': '',
                'drive_type': '',
                'volume_serial': '',
                'volume_label': '',
                'machine_id': '',
                'mac_address': '',
            }

            # 提取头部时间戳
            header = info.get('header', {})
            parsed['target_created'] = str(header.get('creation_time', ''))
            parsed['target_modified'] = str(header.get('modified_time', ''))
            parsed['target_accessed'] = str(header.get('accessed_time', ''))
            parsed['file_size'] = str(header.get('file_size', ''))

            # 提取链接信息
            link_info = info.get('link_info', {})
            if link_info:
                local_path = link_info.get('local_base_path', '')
                network_path = link_info.get('common_network_relative_link', {}).get('net_name', '')
                parsed['target_path'] = local_path or network_path

                vol_info = link_info.get('volume_id', {})
                if vol_info:
                    parsed['drive_type'] = str(vol_info.get('drive_type', ''))
                    parsed['volume_serial'] = str(vol_info.get('drive_serial_number', ''))
                    parsed['volume_label'] = str(vol_info.get('volume_label', ''))

            # 提取字符串数据
            string_data = info.get('string_data', {})
            parsed['working_dir'] = str(string_data.get('working_dir', ''))
            parsed['arguments'] = str(string_data.get('command_line_arguments', ''))

            # 提取 tracker 数据(机器 ID 和 MAC)
            extra = info.get('extra', {})
            tracker = extra.get('DISTRIBUTED_LINK_TRACKER_BLOCK', {})
            if tracker:
                parsed['machine_id'] = str(tracker.get('machine_id', ''))
                parsed['mac_address'] = str(tracker.get('mac_address', ''))

            results.append(parsed)

            # 打印摘要
            print(f"\n{filename}")
            print(f"  Target: {parsed['target_path']}")
            print(f"  Modified: {parsed['target_modified']}")
            print(f"  Drive: {parsed['drive_type']} (Serial: {parsed['volume_serial']})")
            if parsed['machine_id']:
                print(f"  Machine: {parsed['machine_id']}")

    except Exception as e:
        print(f"  Error parsing {filename}: {e}")

# 将结果写入 CSV
with open('/cases/case-2024-001/analysis/lnk_analysis.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=results[0].keys() if results else [])
    writer.writeheader()
    writer.writerows(results)

print(f"\n\nTotal LNK files parsed: {len(results)}")
PYEOF
```

### 步骤 4:分析取证价值

```bash
# 识别从可移动介质访问的文件
python3 << 'PYEOF'
import csv

with open('/cases/case-2024-001/analysis/lnk_analysis.csv') as f:
    reader = csv.DictReader(f)

    print("=== FILES ACCESSED FROM REMOVABLE MEDIA ===\n")
    removable = []
    network = []

    for row in reader:
        if 'DRIVE_REMOVABLE' in row.get('drive_type', '').upper() or \
           'removable' in row.get('drive_type', '').lower():
            removable.append(row)
            print(f"  {row['target_modified']} | {row['target_path']} | Vol: {row['volume_serial']}")

        if 'network' in row.get('drive_type', '').lower() or \
           row.get('target_path', '').startswith('\\\\'):
            network.append(row)

    print(f"\n=== FILES ACCESSED FROM NETWORK SHARES ===\n")
    for row in network:
        print(f"  {row['target_modified']} | {row['target_path']}")

    print(f"\nRemovable media files: {len(removable)}")
    print(f"Network share files: {len(network)}")

    # 检查唯一机器(tracker 数据)
    machines = set()
    for row in [*removable, *network]:
        if row.get('machine_id'):
            machines.add(row['machine_id'])
    if machines:
        print(f"\nMachine IDs found: {machines}")
PYEOF

# 检查 Startup 文件夹 LNK 文件以发现持久化
echo "=== STARTUP FOLDER SHORTCUTS (PERSISTENCE) ===" > /cases/case-2024-001/analysis/startup_persistence.txt
for lnk in /cases/case-2024-001/lnk/startup/*.lnk; do
    python3 -c "
import LnkParse3
with open('$lnk', 'rb') as f:
    lnk = LnkParse3.lnk_file(f)
    info = lnk.get_json()
    target = info.get('link_info', {}).get('local_base_path', 'Unknown')
    args = info.get('string_data', {}).get('command_line_arguments', '')
    print(f'  $(basename $lnk): {target} {args}')
" >> /cases/case-2024-001/analysis/startup_persistence.txt 2>/dev/null
done
```

## 核心概念

| 概念 | 描述 |
|---------|-------------|
| Shell Link(.lnk) | Windows 快捷方式文件格式,包含目标路径、时间戳和元数据 |
| 目标时间戳 | 快捷方式所指文件的创建、修改和访问时间 |
| 卷序列号 | 目标文件所在驱动器卷的唯一标识符 |
| 机器 ID | 由分布式链接跟踪(Distributed Link Tracking)服务嵌入的 NetBIOS 名称 |
| MAC 地址 | 创建 LNK 文件的机器上的网络适配器 MAC |
| Jump Lists | 每个应用程序的最近和固定文件列表(包含嵌入的 LNK 数据) |
| 自动目标(Automatic Destinations) | 系统管理的最近打开文件 Jump List 条目 |
| 自定义目标(Custom Destinations) | 用户固定的 Jump List 项目,手动删除前一直保留 |

## 工具与系统

| 工具 | 用途 |
|------|---------|
| LECmd | Eric Zimmerman 命令行 LNK 文件解析器,支持 CSV/JSON 输出 |
| JLECmd | Eric Zimmerman Jump List 解析器 |
| LnkParse3 | 用于编程化 LNK 文件分析的 Python 库 |
| lnk_parser | 备用 Python LNK 解析工具 |
| Autopsy | 带 LNK 文件分析模块的取证平台 |
| KAPE | 自动化 LNK 和 Jump List 取证痕迹采集 |
| Plaso | 带 LNK 文件解析器的时间线工具,用于创建超级时间线 |
| LNK Explorer | 用于交互式 LNK 文件检查的 GUI 工具 |

## 常见场景

**场景 1:通过 USB 驱动器数据外泄(Data Exfiltration)**
分析 Recent 文件夹 LNK 文件中指向可移动驱动器的目标,将卷序列号与 USBSTOR 注册表条目关联,建立从 USB 设备访问的文件列表,确认哪些文档是从可移动驱动器打开的,与文件复制时间戳关联。

**场景 2:通过 Startup 快捷方式恶意软件持久化**
检查 Startup 文件夹 LNK 文件的恶意目标,检查目标路径和参数中是否有编码命令或可疑可执行文件,验证目标文件是否存在并检查它,将创建时间戳与初始入侵时间关联。

**场景 3:网络共享访问调查**
筛选具有网络路径(UNC 目标)的 LNK 文件,识别哪些网络共享被访问及访问时间,将机器 ID 与已知企业系统关联,检查是否在正常职责范围外访问了敏感文件服务器,为合规调查构建访问时间线。

**场景 4:法律诉讼的文档访问时间线**
提取所有 Recent 文件夹 LNK 文件,构建用户访问文档的时间顺序列表,识别与案件相关的特定文件,展示目标时间戳说明文件被打开的时间,与邮件和通信时间线关联。

## 输出格式

```
LNK File Analysis Summary:
  User Profile: suspect_user
  Total LNK Files: 234 (Recent: 198, Desktop: 23, Startup: 5, Other: 8)

  File Access Statistics:
    Local drive (C:):    156 files
    Removable media:     23 files (3 unique volume serials)
    Network shares:      15 files (\\server01, \\fileserver)
    Other drives:        4 files

  Machine IDs Found: DESKTOP-ABC123, LAPTOP-XYZ789
  MAC Addresses: AA:BB:CC:DD:EE:FF, 11:22:33:44:55:66

  Removable Media Access:
    Volume Serial 1234-ABCD:
      2024-01-15 14:32 - E:\Confidential\financial_report.xlsx
      2024-01-15 14:45 - E:\Confidential\customer_database.csv
      2024-01-15 15:00 - E:\Projects\source_code.zip

  Startup Persistence:
    updater.lnk -> C:\ProgramData\svc\updater.exe (SUSPICIOUS)
    OneDrive.lnk -> C:\Users\...\OneDrive.exe (Legitimate)

  Timeline: /cases/case-2024-001/analysis/lnk_analysis.csv
```

Related Skills

recovering-deleted-files-with-photorec

9
from killvxk/cybersecurity-skills-zh

使用 PhotoRec 基于文件签名的数据雕刻(File Carving)引擎,从磁盘镜像和存储介质中恢复已删除文件,无论文件系统是否损坏。

performing-windows-artifact-analysis-with-eric-zimmerman-tools

9
from killvxk/cybersecurity-skills-zh

使用 Eric Zimmerman 的开源 EZ Tools 套件(包括 KAPE、MFTECmd、PECmd、LECmd、JLECmd 和 Timeline Explorer)执行全面的 Windows 取证制品分析,解析注册表 hive、预取文件、事件日志和文件系统元数据。

investigating-ransomware-attack-artifacts

9
from killvxk/cybersecurity-skills-zh

识别、收集和分析勒索软件攻击制品,以确定变种、初始访问向量、加密范围和恢复选项。

implementing-code-signing-for-artifacts

9
from killvxk/cybersecurity-skills-zh

本技能涵盖为构建产物实施代码签名,以确保软件供应链中的完整性和真实性。 内容包括使用 GPG、Sigstore 和平台专用签名工具对二进制文件、软件包和容器进行签名, 建立信任链,以及在部署管道中验证签名。

hunting-for-persistence-mechanisms-in-windows

9
from killvxk/cybersecurity-skills-zh

系统性地狩猎 Windows 终端中的攻击者持久化机制,涵盖注册表、服务、启动文件夹和 WMI 事件订阅。

hardening-windows-endpoint-with-cis-benchmark

9
from killvxk/cybersecurity-skills-zh

使用 CIS(互联网安全中心)Benchmark 建议对 Windows 端点进行加固, 以减少攻击面、执行安全基线并满足合规要求。适用于部署新 Windows 工作站或服务器、 修复审计发现或为组织建立全面安全基线的场景。适用于涉及 Windows 加固、 CIS Benchmark、GPO 安全基线或端点配置合规的请求。

extracting-windows-event-logs-artifacts

9
from killvxk/cybersecurity-skills-zh

使用 Chainsaw、Hayabusa 和 EvtxECmd 提取、解析和分析 Windows 事件日志(EVTX),以检测横向移动、持久化和权限提升。

extracting-memory-artifacts-with-rekall

9
from killvxk/cybersecurity-skills-zh

使用 Rekall 内存取证框架分析内存转储,检测进程空洞化(process hollowing)、通过 VAD 异常注入的代码、隐藏进程和 rootkit。应用 pslist、psscan、vadinfo、malfind 和 dlllist 等插件从 Windows 内存镜像中提取取证工件。适用于应急响应内存分析场景。

extracting-browser-history-artifacts

9
from killvxk/cybersecurity-skills-zh

从 Chrome、Firefox 和 Edge 中提取并分析浏览器历史记录、Cookie、缓存、下载记录和书签,以获取用户网络活动的取证证据。

deploying-ransomware-canary-files

9
from killvxk/cybersecurity-skills-zh

使用 Python watchdog 库在关键目录中部署并监控勒索软件诱饵文件(Canary File),实现实时文件系统事件检测。 将策略性命名的诱饵文件(模拟高价值目标,如财务记录、凭据、数据库导出)放置在勒索软件通常优先枚举的 目录中,监控对诱饵文件的任何读取、修改、重命名或删除操作,并在检测到交互时通过 Email、Slack Webhook 或 Syslog 触发即时告警,在完整加密开始前提供早期预警。

configuring-windows-event-logging-for-detection

9
from killvxk/cybersecurity-skills-zh

配置 Windows 事件日志与高级审计策略,以生成高质量安全事件用于威胁检测和取证调查。 适用于为登录事件、进程创建、权限使用和对象访问启用审计策略,以支撑 SIEM 检测规则的场景。

configuring-windows-defender-advanced-settings

9
from killvxk/cybersecurity-skills-zh

配置 Microsoft Defender for Endpoint(MDE)高级防护设置,包括攻击面缩减规则、受控文件夹访问、 网络保护和漏洞利用防护。适用于在默认 Defender 设置基础上加固 Windows 端点、部署企业级端点防护 或满足高级恶意软件防御合规要求的场景。