Mimikatz 的检测机制与免杀技术分析及 PE 文件结构解析
字数 4863 2025-09-01 11:25:54
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
- 火绒可能仍会拦截
数字签名盗用:
- 修改注册表:
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文件组成:
- 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文件结构,为安全研究人员提供了全面的技术参考。理解这些底层原理对于开发防御措施和进行安全研究都具有重要意义。随着安全技术的不断发展,攻防对抗也将持续升级,需要不断更新知识体系和技术手段。