mimikatz高版本windows适配改造
字数 1953 2025-11-07 08:41:54
Mimikatz 高版本 Windows 适配改造教学文档
1. 问题背景
1.1 现状描述
- Mimikatz 在 Windows 11 24H2 版本中无法正常提取凭据
- 错误信息显示:
ERROR kuhl_m_sekurlsa_acquireLSA ; Logon list- Hash 传递利用时报错:
ERROR kuhl_m_sekurlsa_pth_luid ; memory handle is not KULL_M_MEMORY_TYPE_PROCESS
1.2 影响范围
- 主要影响 Windows 11 24H2 及以上版本
- 23H2 及以下版本仍可正常使用
- 问题与 PPL、Credential Guard、VBS 等安全机制无关
2. 技术原理分析
2.1 Mimikatz 凭据提取机制
Mimikatz 通过以下步骤提取凭据:
- 在
lsasrv.dll中定位两个关键全局变量:LogonSessionList:登录会话链表LogonSessionListCount:登录会话数量
- 遍历
LogonSessionList链表获取凭据信息
2.2 Windows 24H2 的变化
- 内存寻址方式从 RIP 相对寻址改为使用 R13 寄存器
- 相关结构体发生偏移变化:
KIWI_MSV1_0_LIST结构体布局改变MSV1_0_PRIMARY_CREDENTIAL结构体发生变化
3. 解决方案实现
3.1 参考项目分析
pypykatz 项目成功解析了 24H2 的 dump 文件,关键修改包括:
template.first_entry_offset_correction = 34
3.2 寻址方式适配
3.2.1 旧版本寻址(RIP 相对寻址)
目标地址 = 当前地址 + 指令长度 + 偏移量
3.2.2 新版本寻址(R13 寄存器)
- 需要找到 R13 寄存器的赋值来源
- 在赋值点基础上添加偏移量计算目标地址
3.3 结构体定义修改
3.3.1 KIWI_MSV1_0_LIST 结构体更新
需要根据 pypykatz 项目的实现更新结构体定义:
// 更新后的结构体定义示例
typedef struct _KIWI_MSV1_0_LIST_24H2 {
// 新的字段布局
ULONG_PTR Flink;
ULONG_PTR Blink;
// 其他字段...
// 注意 UserName 等字段的偏移发生变化
} KIWI_MSV1_0_LIST_24H2, *PKIWI_MSV1_0_LIST_24H2;
3.3.2 MSV1_0_PRIMARY_CREDENTIAL 结构体更新
凭据相关结构体也需要相应调整:
// 更新后的主凭据结构体
typedef struct _MSV1_0_PRIMARY_CREDENTIAL_24H2 {
// 新的字段定义
// 注意加密凭据的存储位置变化
} MSV1_0_PRIMARY_CREDENTIAL_24H2, *PMSV1_0_PRIMARY_CREDENTIAL_24H2;
3.4 版本检测逻辑
添加 Windows 版本检测机制:
// 版本检测示例
BOOL IsWindows24H2OrLater() {
OSVERSIONINFOEX osvi;
DWORDLONG dwlConditionMask = 0;
// 设置版本检测条件
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 10;
osvi.dwMinorVersion = 0;
osvi.dwBuildNumber = 26000; // 24H2 构建号
VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
return VerifyVersionInfo(&osvi, VER_BUILDNUMBER, dwlConditionMask);
}
3.5 签名与偏移量更新
3.5.1 提取新签名
- 分析 24H2 版本的
lsasrv.dll - 定位
LogonSessionList和LogonSessionListCount的新签名 - 计算正确的偏移量
3.5.2 偏移量计算示例
// 针对不同版本使用不同的偏移量
if (IsWindows24H2OrLater()) {
signatureOffset = NEW_24H2_OFFSET;
structureType = KIWI_STRUCTURE_24H2;
} else {
signatureOffset = LEGACY_OFFSET;
structureType = KIWI_STRUCTURE_LEGACY;
}
4. 实现步骤详解
4.1 第一步:分析 pypykatz 实现
- 研究 pypykatz 项目中 24H2 支持的实现
- 重点关注
first_entry_offset_correction参数 - 理解 R13 寄存器的处理逻辑
4.2 第二步:定位合适的计算点
在 Mimikatz 代码中寻找:
- 仍然使用 RIP 相对寻址的代码段
- 可以绕过 R13 寄存器复杂计算的位置
4.3 第三步:更新结构体定义
- 添加 24H2 专用结构体定义
- 保持向后兼容性
- 确保内存对齐正确
4.4 第四步:添加版本选择逻辑
- 实现版本检测函数
- 在运行时动态选择正确的结构体和偏移量
- 处理版本间的不兼容性
4.5 第五步:测试验证
- 在 24H2 环境测试提取功能
- 验证凭据注入功能(如 hash 传递)
- 确保不影响旧版本支持
5. 关键注意事项
5.1 兼容性保证
- 必须保持对旧版本 Windows 的完整支持
- 使用条件编译或运行时检测避免破坏现有功能
5.2 加解密方法
- 幸运的是,24H2 没有改变凭据的加解密方法
- 主要修改集中在结构体布局和内存寻址
5.3 调试技巧
- 使用 UserName 字段作为调试参考点
- 对比 pypykatz 的解析结果验证正确性
- 注意链表结构的完整性验证
6. 编译与部署
6.1 编译要求
- 更新头文件包含新的结构体定义
- 确保版本检测逻辑正确实现
- 测试所有功能模块的兼容性
6.2 测试方案
- 在 Windows 11 24H2 环境测试提取功能
- 验证凭据注入和 hash 传递功能
- 在低版本 Windows 确认回归测试通过
7. 总结
通过分析 Windows 24H2 的内存寻址变化和结构体布局调整,成功适配了 Mimikatz 工具。关键改进包括:
- 寻址方式适配:处理从 RIP 到 R13 寄存器的变化
- 结构体更新:根据新版本调整关键数据结构定义
- 版本智能检测:运行时自动选择正确的处理逻辑
- 向后兼容:确保不影响旧版本系统的支持
此解决方案使得 Mimikatz 能够在 Windows 11 24H2 及以上版本中正常提取和操作凭据,同时保持了工具的原有功能和兼容性。