L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

detecting-process-injection-techniques

detecting-process-injection-techniques

检测和分析恶意软件使用的进程注入技术,包括经典 DLL 注入、进程空洞化、APC 注入、线程劫持 和反射式加载。使用内存取证、API 监控和行为分析来识别注入痕迹。适用于进程注入检测、 代码注入分析、空洞化进程调查或内存威胁检测等请求场景。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: detecting-process-injection-techniques description: > 检测和分析恶意软件使用的进程注入技术,包括经典 DLL 注入、进程空洞化、APC 注入、线程劫持 和反射式加载。使用内存取证、API 监控和行为分析来识别注入痕迹。适用于进程注入检测、 代码注入分析、空洞化进程调查或内存威胁检测等请求场景。 domain: cybersecurity subdomain: malware-analysis tags: [malware, process-injection, detection, memory-forensics, defense-evasion] version: 1.0.0 author: mahipal license: Apache-2.0

检测进程注入技术

适用场景

  • EDR 告警显示可疑 API 调用序列(VirtualAllocEx + WriteProcessMemory + CreateRemoteThread)
  • 合法进程(explorer.exe、svchost.exe)出现意外的网络连接或文件操作
  • 内存取证发现本不应含有可执行代码的内存区域中存在可执行代码
  • 调查恶意软件藏匿在可信进程内部的就地取材(LOL)攻击
  • 为 EDR 或 SIEM 规则中的特定注入技术构建检测逻辑

不适用于标准 DLL 加载分析;注入意味着在未经目标进程配合的情况下将未授权代码植入该进程。

前置条件

  • Volatility 3,用于注入痕迹的内存取证分析
  • 配置了事件 ID 8(CreateRemoteThread)和 10(ProcessAccess)的 Sysmon
  • API Monitor 或 x64dbg,用于实时观察注入 API 调用
  • Process Hacker 或 Process Explorer,用于检查进程内存区域
  • 理解 Windows 内存管理(VirtualAlloc、VAD、页面保护)
  • 用于安全执行和监控恶意软件的隔离分析环境

工作流程

步骤 1:通过内存取证识别注入

使用 Volatility 检测进程内存中的注入代码:

# malfind:主要的注入检测插件
vol3 -f memory.dmp windows.malfind

# malfind 检测以下内容:
# - 具有 PAGE_EXECUTE_READWRITE(RWX)保护的内存区域
# - 非镜像 VAD 条目中的 PE 头(MZ 签名)
# - 未被磁盘文件支撑的可执行内存

# 按特定进程过滤
vol3 -f memory.dmp windows.malfind --pid 852

# 转储注入的内存区域以供分析
vol3 -f memory.dmp windows.malfind --dump

# 检查 VAD(虚拟地址描述符)树是否存在异常
vol3 -f memory.dmp windows.vadinfo --pid 852

# 检测空洞化进程(内存中的映像与磁盘不匹配)
vol3 -f memory.dmp windows.hollowfind

步骤 2:对注入技术进行分类

根据痕迹识别所使用的注入方法:

进程注入技术与检测痕迹:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 经典 DLL 注入
   API:OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread
   痕迹:目标进程中已加载的 DLL 在已知基线中不存在
   检测:dlllist 中的新 DLL 与磁盘哈希不符、CreateRemoteThread 事件

2. 进程空洞化(RunPE)
   API:CreateProcess(SUSPENDED) -> NtUnmapViewOfSection -> VirtualAllocEx ->
         WriteProcessMemory -> SetThreadContext -> ResumeThread
   痕迹:内存中的进程映像与磁盘文件不匹配
   检测:hollowfind 插件、PE 头与磁盘文件不一致

3. APC 注入
   API:OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> QueueUserAPC
   痕迹:可警觉线程中已排队的 APC 指向注入代码
   检测:线程起始地址超出已知模块范围

4. 线程劫持
   API:OpenProcess -> VirtualAllocEx -> WriteProcessMemory ->
         SuspendThread -> GetThreadContext -> SetThreadContext -> ResumeThread
   痕迹:线程指令指针被修改为指向注入代码
   检测:线程上下文被修改,EIP/RIP 超出模块边界

5. 反射式 DLL 注入
   API:VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread(指向反射式加载器)
   痕迹:DLL 已加载到内存但不在已加载模块列表中
   检测:malfind(非镜像内存中的 PE)、模块不在 ldrmodules 中

6. 进程幻影化(Process Doppelganging)
   API:NtCreateTransaction -> NtCreateFile(事务性)-> NtWriteFile ->
         NtCreateSection -> NtRollbackTransaction -> NtCreateProcessEx
   痕迹:进程由已回滚的事务性文件创建
   检测:磁盘上无对应文件的进程

7. AtomBombing
   API:GlobalAddAtom -> NtQueueApcThread(配合 GlobalGetAtomName)
   痕迹:代码存储在全局原子表中,APC 触发将其复制到目标进程
   检测:异常的原子表条目、APC 注入指标

步骤 3:通过 Sysmon 事件检测注入

分析 Sysmon 和 Windows 事件日志数据:

# Sysmon 事件 ID 8:CreateRemoteThread
# 检测一个进程在另一个进程中创建线程的行为
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
  /q:"*[System[EventID=8]]" /f:text /c:20

# Sysmon 事件 ID 10:ProcessAccess
# 检测对其他进程的可疑访问权限
# DesiredAccess 包含 PROCESS_VM_WRITE(0x0020)+ PROCESS_CREATE_THREAD(0x0002)
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
  /q:"*[System[EventID=10]]" /f:text /c:20

# Sysmon 事件 ID 1:进程创建
# 通过可疑的父子关系检测进程空洞化
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
  /q:"*[System[EventID=1]]" /f:text /c:20
# 解析 Sysmon 事件中的注入指标
import xml.etree.ElementTree as ET
import subprocess

# 查询 CreateRemoteThread 事件
result = subprocess.run(
    ["wevtutil", "qe", "Microsoft-Windows-Sysmon/Operational",
     "/q:*[System[EventID=8]]", "/f:xml", "/c:100"],
    capture_output=True, text=True
)

suspicious_injections = []
for event_xml in result.stdout.split("</Event>"):
    if not event_xml.strip():
        continue
    try:
        root = ET.fromstring(event_xml + "</Event>")
        ns = {"e": "http://schemas.microsoft.com/win/2004/08/events/event"}
        data = {}
        for d in root.findall(".//e:EventData/e:Data", ns):
            data[d.get("Name")] = d.text

        source = data.get("SourceImage", "")
        target = data.get("TargetImage", "")

        # 标记从异常来源注入系统进程的行为
        system_procs = ["svchost.exe", "explorer.exe", "lsass.exe", "winlogon.exe"]
        if any(p in target.lower() for p in system_procs):
            if not any(p in source.lower() for p in ["csrss.exe", "services.exe", "lsass.exe"]):
                print(f"[!] Suspicious injection: {source} -> {target}")
                suspicious_injections.append(data)
    except:
        pass

步骤 4:分析注入代码

检查注入的载荷以了解其目的:

# 从 Volatility malfind 转储注入代码
vol3 -f memory.dmp windows.malfind --pid 852 --dump

# 分析转储的区域
file malfind.*.dmp

# 如果包含 PE(MZ 头),作为独立可执行文件分析
python3 << 'PYEOF'
import pefile

# 尝试作为 PE 解析
try:
    pe = pefile.PE("malfind.852.0x400000.dmp")
    print("Injected PE detected!")
    print(f"  Architecture: {'x64' if pe.FILE_HEADER.Machine == 0x8664 else 'x86'}")
    print(f"  Imports:")
    if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
        for entry in pe.DIRECTORY_ENTRY_IMPORT:
            print(f"    {entry.dll.decode()}: {len(entry.imports)} functions")
except:
    print("Not a valid PE - likely shellcode")
    # 作为 Shellcode 分析
    with open("malfind.852.0x400000.dmp", "rb") as f:
        shellcode = f.read()
    print(f"  Size: {len(shellcode)} bytes")
    print(f"  First bytes: {shellcode[:32].hex()}")
PYEOF

# 反汇编 Shellcode
python3 -c "
from capstone import Cs, CS_ARCH_X86, CS_MODE_64
with open('malfind.852.0x400000.dmp', 'rb') as f:
    code = f.read()[:256]
md = Cs(CS_ARCH_X86, CS_MODE_64)
for insn in md.disasm(code, 0x400000):
    print(f'  0x{insn.address:X}: {insn.mnemonic} {insn.op_str}')
"

# 使用 YARA 扫描已知载荷
vol3 -f memory.dmp yarascan.YaraScan --pid 852 --yara-file malware_rules.yar

步骤 5:映射到 MITRE ATT&CK

在 ATT&CK 框架中对检测到的技术进行分类:

MITRE ATT&CK 进程注入子技术(T1055):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
T1055.001  动态链接库注入
T1055.002  可移植可执行文件注入
T1055.003  线程执行劫持
T1055.004  异步过程调用(APC)
T1055.005  线程本地存储
T1055.008  Ptrace 系统调用(Linux)
T1055.009  Proc 内存(/proc/pid/mem - Linux)
T1055.011  额外窗口内存注入
T1055.012  进程空洞化
T1055.013  进程幻影化
T1055.014  VDSO 劫持(Linux)
T1055.015  ListPlanting

步骤 6:创建检测签名

为已识别的技术构建检测规则:

# CreateRemoteThread 注入的 Sigma 规则
title: Suspicious CreateRemoteThread into System Process
logsource:
    product: windows
    service: sysmon
detection:
    selection:
        EventID: 8
        TargetImage|endswith:
            - '\svchost.exe'
            - '\explorer.exe'
            - '\lsass.exe'
    filter:
        SourceImage|endswith:
            - '\csrss.exe'
            - '\services.exe'
            - '\svchost.exe'
    condition: selection and not filter
level: high

核心概念

术语定义
进程注入在另一个进程的地址空间中执行代码的技术,通常用于规避检测并继承目标进程的信任级别
进程空洞化以挂起状态创建合法进程、取消映射其内存、写入恶意代码并恢复执行,以伪装成合法进程
反射式 DLL 注入在不使用 Windows 加载器的情况下将 DLL 加载到进程内存中,使 DLL 不出现在已加载模块列表中
APC 注入向目标进程中的线程排队异步过程调用,使其在线程进入可警觉状态时执行注入代码
VAD(虚拟地址描述符)描述进程内存区域的 Windows 内核结构;异常的 VAD 条目(RWX 权限、非镜像 PE)表明存在注入
CreateRemoteThread在另一个进程中创建线程的 Windows API;是经典 DLL 注入及许多其他注入技术的主要机制
PAGE_EXECUTE_READWRITE允许读、写和执行的内存保护标志;合法应用程序极少使用,是注入代码的常见指标

工具与系统

  • Volatility(malfind):内存取证插件,通过 VAD 分析和扫描非镜像内存中的 PE 头来检测注入代码
  • Sysmon:系统监控工具,提供详细的 Windows 事件日志,包括 CreateRemoteThread(EID 8)和 ProcessAccess(EID 10)
  • Process Hacker:高级进程管理工具,显示详细的内存区域、线程栈和注入模块
  • API Monitor:Windows 工具,用于监控和记录进程的 API 调用,便于实时观察注入序列
  • pe-sieve:扫描运行中进程以发现代码注入、钩挂和空洞化迹象的工具

常见场景

场景:调查空洞化的 svchost.exe 进程

背景:EDR 告警显示 svchost.exe 向外部 IP 发起 HTTPS 连接。svchost.exe 通常只与 Microsoft 服务通信,需要进行内存分析以确认进程空洞化。

方法:

  1. 捕获可疑 svchost.exe 进程的内存转储
  2. 运行 Volatility malfind 检测进程内存中注入的 PE
  3. 将内存中的映像基地址与磁盘上 svchost.exe 文件的哈希进行对比
  4. 检查进程父进程(应为 services.exe)和创建参数
  5. 从内存中转储空洞化的可执行文件并使用 Ghidra 分析
  6. 运行 netscan 确认空洞化进程的网络连接
  7. 使用 YARA 扫描转储代码以识别恶意软件家族

注意事项:

  • 不要假设所有 svchost.exe 实例完全相同(每个实例加载不同的服务 DLL)
  • 不要忘记检查父进程(空洞化进程通常父进程有误)
  • 不要仅依赖进程名称匹配(攻击者特意针对 svchost.exe,因为系统中预期存在多个实例)
  • 注意注入源进程可能已经终止

输出格式

进程注入分析报告
====================================
转储文件:      memory.dmp
分析工具:      Volatility 3.2 + Sysmon

检测到注入
目标进程:      svchost.exe(PID:852)
源进程:        malware.exe(PID:2184)[已终止]
技术:          进程空洞化(T1055.012)

证据
malfind 结果:
  PID 852(svchost.exe):
    地址:0x00400000
    大小:184,320 字节
    保护:PAGE_EXECUTE_READWRITE
    头:MZ(PE32 可执行文件)
    未被磁盘文件支撑

进程验证:
  预期映像:C:\Windows\System32\svchost.exe(SHA-256:aaa...)
  内存映像:未知 PE(SHA-256:bbb...)
  结果:不匹配 - 进程已被空洞化

Sysmon 事件:
  [4688] malware.exe(PID 2184)以挂起状态创建 svchost.exe(PID 852)
  [10]   malware.exe 以 PROCESS_VM_WRITE 权限访问 svchost.exe
  [8]    malware.exe 在 svchost.exe 中创建了远程线程

注入载荷分析
SHA-256:         bbb123def456...
YARA 匹配:       CobaltStrike_Beacon_x64
类型:            Cobalt Strike Beacon(HTTP)
C2:              hxxps://185.220.101[.]42/updates

MITRE ATT&CK
T1055.012  进程空洞化
T1071.001  Web 协议(HTTPS C2)
T1036.005  匹配合法名称(svchost.exe)
Skills enregistrées