驱动通信挖掘
字数 1335 2025-08-29 08:30:18
驱动通信挖掘与利用技术详解
一、核心思路
驱动通信的核心在于通过可控的三环(用户态)调用触发零环(内核态)回调函数,利用.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目标函数,替换为自定义回调。
- 用户态调用原函数触发通信。
// 用户态测试代码 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);
- 特殊性:需挂靠到
三、关键注意事项
-
参数验证:
- 确保目标函数参数未被内核严格过滤(如指针地址范围检查)。
- 输出参数需可写(如
NtQueryAuxiliaryCounterFrequency的a1为OUT参数,但可能受限于共享内存)。
-
版本适配:
- 不同Windows版本函数偏移可能变化,需动态调整特征码或硬编码偏移。
-
安全防护绕过:
- 部分函数受
KCFG或PatchGuard保护,需绕过校验机制。
- 部分函数受
四、通信结构设计模板
// 通信协议示例(基于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)验证函数行为,确保稳定性。