驱动通信挖掘
字数 1335 2025-08-29 08:30:18

驱动通信挖掘与利用技术详解


一、核心思路

驱动通信的核心在于通过可控的三环(用户态)调用触发零环(内核态)回调函数,利用.data段指针交换或函数参数传递实现数据交互。关键点包括:

  1. 定位通信入口:优先搜索NT/ZW开头的函数(直接暴露给用户态),或通过逆向分析找到可从三环调用的函数。
  2. 分析函数参数:确认参数是否可控(如指针、回调函数地址等)。
  3. 构造通信结构:根据目标函数原型设计通信协议(如输入/输出缓冲区)。

二、具体挖掘流程

1. 定位潜在通信函数
  • IDA搜索技巧
    • 全局搜索qword_offset_等指针,分析其交叉引用。
    • 搜索stub__guard_*相关函数,检查是否与三环调用链关联。
    • 优先筛选NT/ZW前缀函数(如NtQueryXxx),因其天然支持用户态调用。
2. 分析目标函数
  • 关键特征
    • 函数内部存在.data段指针交换(如HalDispatchTable表中的函数)。
    • 参数中包含用户态可控的指针或回调函数(如NtConvertBetweenAuxiliaryCounterAndPerformanceCountera3参数可写回数据)。
    • 函数调用路径可从三环触发(需验证堆栈回溯)。
3. 挂钩与通信
  • 示例1:Hook HalDispatchTable函数

    • 目标函数NtConvertBetweenAuxiliaryCounterAndPerformanceCounter
      • 参数a3为输出指针,用户态传入地址后可接收内核数据。
      • 参数a4可选,可用于传递附加控制码。
    • 步骤
      1. 通过特征码定位.data指针(如off_140424078[0])。
      2. Hook目标函数,替换为自定义回调。
      3. 用户态调用原函数触发通信。
      // 用户态测试代码
      NTSTATUS status = NtConvertBetweenAuxiliaryCounterAndPerformanceCounter(
          nullptr, 0, &outputPtr, optionalCtrlCode);
      
  • 示例2:NtQueryIntervalProfile

    • 限制:参数仅使用低32位,无法直接传递地址,但可作为控制码。
    • 利用方式:将低32位作为操作码,内核根据值执行不同逻辑。
      // 内核侧处理
      if (userCtrlCode == 0x1) { /* 执行操作A */ }
      
  • 示例3:NtSetCompositionSurfaceAnalogExclusive(Win32k.sys)

    • 特殊性:需挂靠到winlogon.exe等会话进程。
    • 特征码定位
      targetAddr = searchCode("win32k.sys", ".text", "4c8b15****e9****", 0, 0x6F00);
      

三、关键注意事项

  1. 参数验证

    • 确保目标函数参数未被内核严格过滤(如指针地址范围检查)。
    • 输出参数需可写(如NtQueryAuxiliaryCounterFrequencya1OUT参数,但可能受限于共享内存)。
  2. 版本适配

    • 不同Windows版本函数偏移可能变化,需动态调整特征码或硬编码偏移。
  3. 安全防护绕过

    • 部分函数受KCFGPatchGuard保护,需绕过校验机制。

四、通信结构设计模板

// 通信协议示例(基于HalDispatchTable)
typedef struct _COMM_STRUCT {
    ULONG OpCode;           // 操作码
    PVOID InputBuffer;      // 输入数据指针
    SIZE_T InputSize;       // 输入大小
    PVOID OutputBuffer;     // 输出数据指针
    SIZE_T OutputSize;      // 输出大小
} COMM_STRUCT;

// 内核侧处理逻辑
NTSTATUS HookedFunction(PVOID param1, PVOID param2, COMM_STRUCT* pComm) {
    if (pComm->OpCode == OP_READ) {
        RtlCopyMemory(pComm->OutputBuffer, kernelData, pComm->OutputSize);
    }
    return STATUS_SUCCESS;
}

五、扩展利用场景

  • 权限提升:通过篡改回调函数执行特权操作(如关闭DSE)。
  • 数据窃取:利用输出参数泄露内核内存(如ntoskrnl基址)。
  • 持久化:替换全局回调指针实现无驱动驻留。

总结:驱动通信挖掘的核心在于逆向分析+可控参数利用,需结合版本特性灵活调整攻击链。建议通过动态调试(WinDbg)验证函数行为,确保稳定性。

驱动通信挖掘与利用技术详解 一、核心思路 驱动通信的核心在于 通过可控的三环(用户态)调用触发零环(内核态)回调函数 ,利用.data段指针交换或函数参数传递实现数据交互。关键点包括: 定位通信入口 :优先搜索 NT/ZW 开头的函数(直接暴露给用户态),或通过逆向分析找到可从三环调用的函数。 分析函数参数 :确认参数是否可控(如指针、回调函数地址等)。 构造通信结构 :根据目标函数原型设计通信协议(如输入/输出缓冲区)。 二、具体挖掘流程 1. 定位潜在通信函数 IDA搜索技巧 : 全局搜索 qword_ 、 offset_ 等指针,分析其交叉引用。 搜索 stub_ 或 _guard_* 相关函数,检查是否与三环调用链关联。 优先筛选 NT/ZW 前缀函数(如 NtQueryXxx ),因其天然支持用户态调用。 2. 分析目标函数 关键特征 : 函数内部存在 .data 段指针交换(如 HalDispatchTable 表中的函数)。 参数中包含用户态可控的指针或回调函数(如 NtConvertBetweenAuxiliaryCounterAndPerformanceCounter 的 a3 参数可写回数据)。 函数调用路径可从三环触发(需验证堆栈回溯)。 3. 挂钩与通信 示例1:Hook HalDispatchTable 函数 目标函数 : NtConvertBetweenAuxiliaryCounterAndPerformanceCounter 参数 a3 为输出指针,用户态传入地址后可接收内核数据。 参数 a4 可选,可用于传递附加控制码。 步骤 : 通过特征码定位 .data 指针(如 off_140424078[0] )。 Hook目标函数,替换为自定义回调。 用户态调用原函数触发通信。 示例2: NtQueryIntervalProfile 限制 :参数仅使用低32位,无法直接传递地址,但可作为控制码。 利用方式 :将低32位作为操作码,内核根据值执行不同逻辑。 示例3: NtSetCompositionSurfaceAnalogExclusive (Win32k.sys) 特殊性 :需挂靠到 winlogon.exe 等会话进程。 特征码定位 : 三、关键注意事项 参数验证 : 确保目标函数参数未被内核严格过滤(如指针地址范围检查)。 输出参数需可写(如 NtQueryAuxiliaryCounterFrequency 的 a1 为 OUT 参数,但可能受限于共享内存)。 版本适配 : 不同Windows版本函数偏移可能变化,需动态调整特征码或硬编码偏移。 安全防护绕过 : 部分函数受 KCFG 或 PatchGuard 保护,需绕过校验机制。 四、通信结构设计模板 五、扩展利用场景 权限提升 :通过篡改回调函数执行特权操作(如关闭DSE)。 数据窃取 :利用输出参数泄露内核内存(如 ntoskrnl 基址)。 持久化 :替换全局回调指针实现无驱动驻留。 总结 :驱动通信挖掘的核心在于 逆向分析+可控参数利用 ,需结合版本特性灵活调整攻击链。建议通过动态调试(WinDbg)验证函数行为,确保稳定性。