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 通过以下步骤提取凭据:

  1. lsasrv.dll 中定位两个关键全局变量:
    • LogonSessionList:登录会话链表
    • LogonSessionListCount:登录会话数量
  2. 遍历 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 提取新签名

  1. 分析 24H2 版本的 lsasrv.dll
  2. 定位 LogonSessionListLogonSessionListCount 的新签名
  3. 计算正确的偏移量

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 第三步:更新结构体定义

  1. 添加 24H2 专用结构体定义
  2. 保持向后兼容性
  3. 确保内存对齐正确

4.4 第四步:添加版本选择逻辑

  1. 实现版本检测函数
  2. 在运行时动态选择正确的结构体和偏移量
  3. 处理版本间的不兼容性

4.5 第五步:测试验证

  1. 在 24H2 环境测试提取功能
  2. 验证凭据注入功能(如 hash 传递)
  3. 确保不影响旧版本支持

5. 关键注意事项

5.1 兼容性保证

  • 必须保持对旧版本 Windows 的完整支持
  • 使用条件编译或运行时检测避免破坏现有功能

5.2 加解密方法

  • 幸运的是,24H2 没有改变凭据的加解密方法
  • 主要修改集中在结构体布局和内存寻址

5.3 调试技巧

  • 使用 UserName 字段作为调试参考点
  • 对比 pypykatz 的解析结果验证正确性
  • 注意链表结构的完整性验证

6. 编译与部署

6.1 编译要求

  • 更新头文件包含新的结构体定义
  • 确保版本检测逻辑正确实现
  • 测试所有功能模块的兼容性

6.2 测试方案

  1. 在 Windows 11 24H2 环境测试提取功能
  2. 验证凭据注入和 hash 传递功能
  3. 在低版本 Windows 确认回归测试通过

7. 总结

通过分析 Windows 24H2 的内存寻址变化和结构体布局调整,成功适配了 Mimikatz 工具。关键改进包括:

  1. 寻址方式适配:处理从 RIP 到 R13 寄存器的变化
  2. 结构体更新:根据新版本调整关键数据结构定义
  3. 版本智能检测:运行时自动选择正确的处理逻辑
  4. 向后兼容:确保不影响旧版本系统的支持

此解决方案使得 Mimikatz 能够在 Windows 11 24H2 及以上版本中正常提取和操作凭据,同时保持了工具的原有功能和兼容性。

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 文件,关键修改包括: 3.2 寻址方式适配 3.2.1 旧版本寻址(RIP 相对寻址) 3.2.2 新版本寻址(R13 寄存器) 需要找到 R13 寄存器的赋值来源 在赋值点基础上添加偏移量计算目标地址 3.3 结构体定义修改 3.3.1 KIWI_ MSV1_ 0_ LIST 结构体更新 需要根据 pypykatz 项目的实现更新结构体定义: 3.3.2 MSV1_ 0_ PRIMARY_ CREDENTIAL 结构体更新 凭据相关结构体也需要相应调整: 3.4 版本检测逻辑 添加 Windows 版本检测机制: 3.5 签名与偏移量更新 3.5.1 提取新签名 分析 24H2 版本的 lsasrv.dll 定位 LogonSessionList 和 LogonSessionListCount 的新签名 计算正确的偏移量 3.5.2 偏移量计算示例 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 及以上版本中正常提取和操作凭据,同时保持了工具的原有功能和兼容性。