Mimikatz 的检测机制与免杀技术分析及 PE 文件结构解析
字数 4863 2025-09-01 11:25:54

Mimikatz 检测机制与免杀技术及 PE 文件结构深度解析

前言

Mimikatz 是一款功能强大的安全工具,广泛用于渗透测试和安全研究中。本文将从检测机制、免杀技术和 PE 文件结构三个维度进行全面剖析,为安全研究人员提供深入的技术参考。

一、Mimikatz 检测机制分析

1. 静态查杀机制

静态查杀主要基于 hash 和特征码两种方式:

1.1 基于哈希的检测

沙箱检测流程:

  1. 读取文件二进制数据:将待分析文件(EXE/DLL/脚本等)完整加载到内存
  2. 计算多种哈希值
    • 通用哈希:MD5、SHA-1、SHA-256(匹配已知恶意文件库)
    • 模糊哈希:SSDEEP、TLSH(关联相似文件,如病毒变种)
    • PE特定哈希:Imphash(针对PE文件导入表哈希,识别行为相似的恶意程序)
  3. 存储哈希值:与文件元数据关联,作为后续分析基础

1.2 基于特征码的检测

文件分块方式

  • 固定大小分块(如512字节、1KB)
  • 动态规则分块(按PE文件的节区、代码段/数据段划分)

特征提取

  1. 特征码:块中具有唯一性的字节序列
  2. 字符串:敏感字符串(如"cmd.exe"、"病毒"、"加密")
  3. 指令序列:反汇编后的API调用或操作序列

分块匹配策略

  • 单个块匹配强恶意特征→直接判定恶意
  • 多个块匹配弱恶意特征→权重累加判定威胁等级

2. 动态查杀机制

动态查杀基于API监控和沙箱执行:

2.1 API Hook 技术

  • 用户态Hook:对ntdll的关键API进行hook
  • 内核回调:在内核中注册回调函数监控行为

Hook实现原理

  1. 拦截目标API调用(如user32.dll!MessageBoxA)
  2. 修改指令JUMP到监控DLL
  3. 分析后决定:放行、查杀或沙箱检测

2.2 Mimikatz 主要调用API

功能模块 主要调用API/函数
DPAPI CryptUnprotectData, CryptProtectData
进程/Token操作 OpenProcess, OpenProcessToken, GetTokenInformation
注册表/文件操作 RegOpenKeyEx, CreateFileW
Kerberos AcquireCredentialsHandle, LsaLogonUser
内存/注入操作 VirtualAlloc, WriteProcessMemory, NtReadVirtualMemory
控制台操作 SetConsoleTitle, SetConsoleCtrlHandler

API调用层次

上层API

  • 用户账户与凭据管理:LogonUserW, GetUserNameW
  • 加密与数据保护:CryptProtectData, CryptUnprotectData
  • Windows服务/进程操作:CreateProcessW, OpenProcess
  • 注册表操作:RegOpenKeyExW, RegQueryValueExW
  • 文件操作:CreateFileW, ReadFile, WriteFile

中层API

  • LSA API:LsaOpenPolicy, LsaRetrievePrivateData
  • SSPI:AcquireCredentialsHandle, InitializeSecurityContext
  • DPAPI:CryptProtectData, CryptUnprotectData
  • SCM API:OpenSCManager, OpenService, StartService

底层API

  • NT系统调用:NtQuerySystemInformation, NtReadVirtualMemory
  • LSA API:LsaLogonUser, LsaUnprotectMemory
  • Token操作:OpenProcessToken, DuplicateToken
  • 内存操作:ReadProcessMemory, WriteProcessMemory

2.3 API调用流程示例

  1. mimikatz.exe(用户态,Ring 3)调用ReadProcessMemory()
  2. ReadProcessMemory()调用NtReadVirtualMemory()(Ntdll.dll)
  3. NtReadVirtualMemory()通过syscall进入内核态
  4. 内核态(Ring 0)由KiSystemCall64处理系统调用
  5. Windows内核执行实际内存读取操作并返回结果

Hook技术分类

  1. Inline API hooking(内联API钩子)
  2. 导入地址表(IAT)钩子
  3. SSDT钩子(Windows内核)

3. 启发式检测

多数杀软采用基于权重的启发式检测:

检测规则

  • 程序在沙盒/模拟器环境中运行
  • 操作端口和通讯的函数调用
  • 将自身加载到启动项中
  • 畸形区块等异常特征

分层特征匹配策略

  • 100M程序匹配1个强特征或3个中特征或10个低特征→不同级别响应

沙箱分析关注点

  • martian_process(异常进程)
  • 孤儿进程
  • 调用的Windows系统程序
  • 关联程序分析

二、Mimikatz 免杀技术

1. 静态免杀技术

基本方法

  1. 修改程序描述信息并加密
  2. 使用Resource Hacker删除信息、更换图标
  3. 加壳处理(如VMProtect)
  4. 修改壳的默认消息字符串

效果评估

  • 可过defender和360
  • 火绒可能仍会拦截

数字签名盗用

  1. 修改注册表:
    HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData
    
    • {603BCC1F-4B59-4E08-B724-D2C6297EF351}→Windows Defender相关
    • {C689AAB8-8E78-11D0-8C47-00C04FC295EE}→Authenticode SIP

免杀效果实验

  • 初始检测率:微步1/24,virustotal 11/71
  • 5天后检测率:微步9/24,virustotal 19/71

2. 动态免杀技术

对抗沙箱分析

  • 检测沙箱环境特征
  • 延迟执行关键操作
  • 环境感知触发

API调用混淆

  • 动态加载API(GetProcAddress+LoadLibrary)
  • 间接系统调用
  • API调用链混淆

三、PE文件结构解析

1. PE基础结构

PE文件组成

  1. DOS头
  2. PE头
  3. 节表
  4. 节区数据(.data/.rdata/.text等)

关键标识

  • 前两个字节:5A4D("MZ")→可执行文件标识

2. DOS头结构

关键字段

  • e_magic:PE文件标识("MZ")
  • e_lfanew:PE头相对于文件首的偏移量(最重要字段)

大小:40H(64字节)

3. PE头结构

组成

  1. PE签名:4字节"PE\0\0"(0x50450000)
  2. 文件头(IMAGE_FILE_HEADER):20字节
    • CPU架构
    • 节区数量等
  3. 可选头(IMAGE_OPTIONAL_HEADER):
    • PE32:224字节
    • PE32+:240字节
    • 包含入口点、映像基址、数据目录等

关键字段差异

字段 32位大小 64位大小 说明
ImageBase 4字节 8字节 首选加载地址
SizeOfStackReserve 4字节 8字节 保留的栈大小
SizeOfStackCommit 4字节 8字节 初始提交的栈大小
SizeOfHeapReserve 4字节 8字节 保留的堆大小
SizeOfHeapCommit 4字节 8字节 初始提交的堆大小

Magic值

  • 32位PE:0x10B
  • 64位PE:0x20B

4. 导入表与导出表

对比分析

对比项 导入表(Import Table) 导出表(Export Table)
功能 记录程序运行时需要调用的外部函数 记录DLL中可供其他程序调用的函数
所属文件 EXE或DLL(依赖其他DLL时) 仅DLL(或少数特殊EXE)
示例场景 mimikatz.exe调用advapi32.dll!RegOpenKey kernel32.dll导出CreateFileW供其他程序使用

4.1 导入表分析

功能

  • 记录程序依赖的外部函数
  • Windows加载器根据导入表加载所需DLL并补全函数地址

Mimikatz导入表特点

  • 原始Mimikatz:完整列出所有依赖DLL(advapi32.dll、kernel32.dll、ntdll.dll)及API
  • VMProtect保护后:
    • 部分API被隐藏或动态解析
    • 关键API可能不直接显示在导入表中
    • 通过GetProcAddress+LoadLibrary动态加载

分析意义

  • 通过导入表DLL及函数可推断程序功能
  • 如cryptdll.dll表明可能涉及加密操作

4.2 导出表分析

功能

  • 定义可供其他模块调用的函数/变量
  • 支持动态链接(LoadLibrary+GetProcAddress)

Mimilib.dll导出表示例

  • mimikatz:与主程序通信接口
  • Msv1_0SubAuthenticationFilter:Windows认证回调
  • PasswordChangeNotify:密码变更通知钩子

安全意义

  • 可被注入到lsass.exe进程
  • 参与NTLM/Kerberos认证流程
  • 实现凭据抓取和篡改

四、Mimikatz检测规则建议

  1. 静态检测规则

    • 关键字符串特征:"mimikatz"、"sekurlsa"、"kerberos"
    • 特定API组合:CryptUnprotectData + OpenProcessToken
    • 异常节区特征
  2. 动态检测规则

    • 敏感API调用序列监控
    • LSA进程内存读取行为
    • 异常凭证访问模式
  3. 启发式规则

    • 多阶段行为评分
    • 环境敏感度检测
    • 异常进程树分析

五、总结

本文系统分析了Mimikatz的检测机制、免杀技术和PE文件结构,为安全研究人员提供了全面的技术参考。理解这些底层原理对于开发防御措施和进行安全研究都具有重要意义。随着安全技术的不断发展,攻防对抗也将持续升级,需要不断更新知识体系和技术手段。

Mimikatz 检测机制与免杀技术及 PE 文件结构深度解析 前言 Mimikatz 是一款功能强大的安全工具,广泛用于渗透测试和安全研究中。本文将从检测机制、免杀技术和 PE 文件结构三个维度进行全面剖析,为安全研究人员提供深入的技术参考。 一、Mimikatz 检测机制分析 1. 静态查杀机制 静态查杀主要基于 hash 和特征码两种方式: 1.1 基于哈希的检测 沙箱检测流程: 读取文件二进制数据 :将待分析文件(EXE/DLL/脚本等)完整加载到内存 计算多种哈希值 : 通用哈希:MD5、SHA-1、SHA-256(匹配已知恶意文件库) 模糊哈希:SSDEEP、TLSH(关联相似文件,如病毒变种) PE特定哈希:Imphash(针对PE文件导入表哈希,识别行为相似的恶意程序) 存储哈希值 :与文件元数据关联,作为后续分析基础 1.2 基于特征码的检测 文件分块方式 : 固定大小分块(如512字节、1KB) 动态规则分块(按PE文件的节区、代码段/数据段划分) 特征提取 : 特征码:块中具有唯一性的字节序列 字符串:敏感字符串(如"cmd.exe"、"病毒"、"加密") 指令序列:反汇编后的API调用或操作序列 分块匹配策略 : 单个块匹配强恶意特征→直接判定恶意 多个块匹配弱恶意特征→权重累加判定威胁等级 2. 动态查杀机制 动态查杀基于API监控和沙箱执行: 2.1 API Hook 技术 用户态Hook :对ntdll的关键API进行hook 内核回调 :在内核中注册回调函数监控行为 Hook实现原理 : 拦截目标API调用(如user32.dll !MessageBoxA) 修改指令JUMP到监控DLL 分析后决定:放行、查杀或沙箱检测 2.2 Mimikatz 主要调用API | 功能模块 | 主要调用API/函数 | |-------------------|------------------------------------------| | DPAPI | CryptUnprotectData, CryptProtectData | | 进程/Token操作 | OpenProcess, OpenProcessToken, GetTokenInformation | | 注册表/文件操作 | RegOpenKeyEx, CreateFileW | | Kerberos | AcquireCredentialsHandle, LsaLogonUser | | 内存/注入操作 | VirtualAlloc, WriteProcessMemory, NtReadVirtualMemory | | 控制台操作 | SetConsoleTitle, SetConsoleCtrlHandler | API调用层次 : 上层API : 用户账户与凭据管理:LogonUserW, GetUserNameW 加密与数据保护:CryptProtectData, CryptUnprotectData Windows服务/进程操作:CreateProcessW, OpenProcess 注册表操作:RegOpenKeyExW, RegQueryValueExW 文件操作:CreateFileW, ReadFile, WriteFile 中层API : LSA API:LsaOpenPolicy, LsaRetrievePrivateData SSPI:AcquireCredentialsHandle, InitializeSecurityContext DPAPI:CryptProtectData, CryptUnprotectData SCM API:OpenSCManager, OpenService, StartService 底层API : NT系统调用:NtQuerySystemInformation, NtReadVirtualMemory LSA API:LsaLogonUser, LsaUnprotectMemory Token操作:OpenProcessToken, DuplicateToken 内存操作:ReadProcessMemory, WriteProcessMemory 2.3 API调用流程示例 mimikatz.exe(用户态,Ring 3)调用ReadProcessMemory() ReadProcessMemory()调用NtReadVirtualMemory()(Ntdll.dll) NtReadVirtualMemory()通过syscall进入内核态 内核态(Ring 0)由KiSystemCall64处理系统调用 Windows内核执行实际内存读取操作并返回结果 Hook技术分类 : Inline API hooking(内联API钩子) 导入地址表(IAT)钩子 SSDT钩子(Windows内核) 3. 启发式检测 多数杀软采用基于权重的启发式检测: 检测规则 : 程序在沙盒/模拟器环境中运行 操作端口和通讯的函数调用 将自身加载到启动项中 畸形区块等异常特征 分层特征匹配策略 : 100M程序匹配1个强特征或3个中特征或10个低特征→不同级别响应 沙箱分析关注点 : martian_ process(异常进程) 孤儿进程 调用的Windows系统程序 关联程序分析 二、Mimikatz 免杀技术 1. 静态免杀技术 基本方法 : 修改程序描述信息并加密 使用Resource Hacker删除信息、更换图标 加壳处理(如VMProtect) 修改壳的默认消息字符串 效果评估 : 可过defender和360 火绒可能仍会拦截 数字签名盗用 : 修改注册表: {603BCC1F-4B59-4E08-B724-D2C6297EF351}→Windows Defender相关 {C689AAB8-8E78-11D0-8C47-00C04FC295EE}→Authenticode SIP 免杀效果实验 : 初始检测率:微步1/24,virustotal 11/71 5天后检测率:微步9/24,virustotal 19/71 2. 动态免杀技术 对抗沙箱分析 : 检测沙箱环境特征 延迟执行关键操作 环境感知触发 API调用混淆 : 动态加载API(GetProcAddress+LoadLibrary) 间接系统调用 API调用链混淆 三、PE文件结构解析 1. PE基础结构 PE文件组成 : DOS头 PE头 节表 节区数据(.data/.rdata/.text等) 关键标识 : 前两个字节:5A4D("MZ")→可执行文件标识 2. DOS头结构 关键字段 : e_ magic:PE文件标识("MZ") e_ lfanew:PE头相对于文件首的偏移量(最重要字段) 大小 :40H(64字节) 3. PE头结构 组成 : PE签名:4字节"PE\0\0"(0x50450000) 文件头(IMAGE_ FILE_ HEADER):20字节 CPU架构 节区数量等 可选头(IMAGE_ OPTIONAL_ HEADER): PE32:224字节 PE32+:240字节 包含入口点、映像基址、数据目录等 关键字段差异 : | 字段 | 32位大小 | 64位大小 | 说明 | |-------------------|----------|----------|-----------------------| | ImageBase | 4字节 | 8字节 | 首选加载地址 | | SizeOfStackReserve| 4字节 | 8字节 | 保留的栈大小 | | SizeOfStackCommit | 4字节 | 8字节 | 初始提交的栈大小 | | SizeOfHeapReserve | 4字节 | 8字节 | 保留的堆大小 | | SizeOfHeapCommit | 4字节 | 8字节 | 初始提交的堆大小 | Magic值 : 32位PE:0x10B 64位PE:0x20B 4. 导入表与导出表 对比分析 : | 对比项 | 导入表(Import Table) | 导出表(Export Table) | |---------------|------------------------------------------|------------------------------------------| | 功能 | 记录程序运行时需要调用的外部函数 | 记录DLL中可供其他程序调用的函数 | | 所属文件 | EXE或DLL(依赖其他DLL时) | 仅DLL(或少数特殊EXE) | | 示例场景 | mimikatz.exe调用advapi32.dll !RegOpenKey | kernel32.dll导出CreateFileW供其他程序使用 | 4.1 导入表分析 功能 : 记录程序依赖的外部函数 Windows加载器根据导入表加载所需DLL并补全函数地址 Mimikatz导入表特点 : 原始Mimikatz:完整列出所有依赖DLL(advapi32.dll、kernel32.dll、ntdll.dll)及API VMProtect保护后: 部分API被隐藏或动态解析 关键API可能不直接显示在导入表中 通过GetProcAddress+LoadLibrary动态加载 分析意义 : 通过导入表DLL及函数可推断程序功能 如cryptdll.dll表明可能涉及加密操作 4.2 导出表分析 功能 : 定义可供其他模块调用的函数/变量 支持动态链接(LoadLibrary+GetProcAddress) Mimilib.dll导出表示例 : mimikatz:与主程序通信接口 Msv1_ 0SubAuthenticationFilter:Windows认证回调 PasswordChangeNotify:密码变更通知钩子 安全意义 : 可被注入到lsass.exe进程 参与NTLM/Kerberos认证流程 实现凭据抓取和篡改 四、Mimikatz检测规则建议 静态检测规则 : 关键字符串特征:"mimikatz"、"sekurlsa"、"kerberos" 特定API组合:CryptUnprotectData + OpenProcessToken 异常节区特征 动态检测规则 : 敏感API调用序列监控 LSA进程内存读取行为 异常凭证访问模式 启发式规则 : 多阶段行为评分 环境敏感度检测 异常进程树分析 五、总结 本文系统分析了Mimikatz的检测机制、免杀技术和PE文件结构,为安全研究人员提供了全面的技术参考。理解这些底层原理对于开发防御措施和进行安全研究都具有重要意义。随着安全技术的不断发展,攻防对抗也将持续升级,需要不断更新知识体系和技术手段。