首页
社区
课程
招聘
[原创]简述常规的 " 驱动 .data 通信 " 如何利用/查找
发表于: 2025-1-23 21:40 13256

[原创]简述常规的 " 驱动 .data 通信 " 如何利用/查找

2025-1-23 21:40
13256

在 Windows 系统中,本文将探讨一种更为隐蔽的方法,通过利用 .data 段的特性进行钩子通信,以绕过反作弊检测。

寻找目标 API:

首先,需要在内核模块中找到一个可以通过用户模式调用的 API。这些 API 通常是 Nt 或 Zw 开头的函数,它们被用户模式的 DLL(例如 win32u.dll)导出。

常见的候选模块包括 ntoskrnl.exe、win32k.sys、win32kbase.sys 等。

win32k.sys 的特殊性: win32k.sys 是一个特殊的内核驱动程序,它在会话空间中加载,这意味着它的内存映射方式与其他内核模块不同。它被映射到 GUI 进程(例如资源管理器或 Winlogon),因此只能由 GUI 进程的线程访问。

定位 .DATA 段中的函数指针:

反汇编分析目标模块 (如 win32k.sys) , 找到要 hook 的目标函数,以及在 .data 段中指向这个函数的指针。

这些指针通常被定义为全局变量或静态变量,可以通过反汇编或调试工具找到。

附加到 GUI 进程:

由于 win32k.sys 的特殊性,它的内存映射仅在 GUI 进程中可用,为了修改 .data 段的函数指针, 需要使用 KeStackAttachProcess 函数,将驱动程序附加到 GUI 进程的上下文中(例如资源管理器或者 Winlogon)。

通过附加到 GUI 进程的上下文, 驱动程序可以获得 GUI 进程的页面目录,从而可以修改 win32k.sys 的 .data 段中的函数指针。

修改 .data 段的函数指针:

在 GUI 进程的上下文中,通过目标进程的虚拟地址找到需要修改的指针地址, 修改 .data 段中的函数指针,让它指向你的自定义函数。

自定义函数可以执行恶意代码或者将控制权转移到另一个地方。

恢复原始指针:

在自定义函数执行完毕后,可以选择将函数指针恢复为原始值,这样可以避免对程序的正常运行造成影响。

先找到win32k.sys模块地址

图片描述
上图为win32k.sys函数
图片描述
上图为win32u.dll其中的函数
这正是我们符合要求的一个函数 (当然这种函数还有很多很多...)
图片描述
利用挂靠到一个GUI进程 比如 explorer.exe 替换对应的qword_677A8也就是data_ptr,里面存的就是NtUserQueryDisplayConfig函数原本的地址

为了挂接 .data 函数指针,我们必须使用 InterlockedExchangePointer。这是一个原子函数,即一个不能被调度器中断的函数。我们为
什么需要它呢?这是一个全局指针,很可能被多个线程访问。我们必须进行同步操作以避免错误。

IDA中Win32k.sys的a1就是通信传递数据的关键,只要3环传入一个结构体 0环接后处理 即可完成一个通信.
Ring3中只需要调用"NtUserQueryDisplayConfig(a1的数据结构体)" 即可.

PVOID get_sys_module(UNICODE_STRING& name) {
    if (PsLoadedModuleList != NULL) {
        for (PLIST_ENTRY pListEntry = PsLoadedModuleList->Flink; pListEntry != PsLoadedModuleList; pListEntry = pListEntry->Flink) {
            auto pEntry = CONTAINING_RECORD(pListEntry, _KLDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
            if (wcsstr(pEntry->FullDllName.Buffer, name.Buffer) != NULL) {
               // LOG("[+]Driver Entry Found: 0x%llx\n", (ULONG64)pEntry);
                return pEntry->DllBase;
            }
        }
    }
    return NULL;
}
PVOID get_sys_module(UNICODE_STRING& name) {
    if (PsLoadedModuleList != NULL) {
        for (PLIST_ENTRY pListEntry = PsLoadedModuleList->Flink; pListEntry != PsLoadedModuleList; pListEntry = pListEntry->Flink) {
            auto pEntry = CONTAINING_RECORD(pListEntry, _KLDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
            if (wcsstr(pEntry->FullDllName.Buffer, name.Buffer) != NULL) {
               // LOG("[+]Driver Entry Found: 0x%llx\n", (ULONG64)pEntry);
                return pEntry->DllBase;
            }
        }
    }
    return NULL;
}
KeStackAttachProcess((PRKPROCESS)gui_process, &state);
 
original_qword = (fQword)InterlockedExchangePointer((PVOID*)data_ptr, (PVOID)NtUserQueryDisplayConfig_hk);
 
KeUnstackDetachProcess(&state);

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2025-1-29 21:34 被S极客编辑 ,原因:
收藏
免费 116
支持
分享
最新回复 (91)
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
好思路
2025-1-24 00:41
0
雪    币: 148
活跃值: (582)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢
2025-1-24 10:11
0
雪    币: 78
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
2025-1-24 11:15
0
雪    币: 1051
活跃值: (3593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
tql
2025-1-24 11:36
0
雪    币: 1110
活跃值: (2044)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好思路
2025-1-24 11:37
0
雪    币: 2274
活跃值: (5448)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
牛逼牛逼
2025-1-24 12:20
0
雪    币: 0
活跃值: (478)
能力值: ( LV8,RANK:125 )
在线值:
发帖
回帖
粉丝
8
看看
2025-1-24 14:43
0
雪    币: 3187
活跃值: (3702)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
9
mark
2025-1-24 15:26
0
雪    币: 12
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
mark
2025-1-24 15:31
0
雪    币: 415
活跃值: (350)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
mark
2025-1-24 16:02
0
雪    币: 5387
活跃值: (5452)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
12
mark
2025-1-24 16:06
0
雪    币: 8874
活跃值: (4213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark
2025-1-24 16:50
1
雪    币: 55
活跃值: (914)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
Mark
2025-1-24 20:21
0
雪    币: 2055
活跃值: (511)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
1
2025-1-25 05:53
0
雪    币: 221
活跃值: (2731)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
好思路
2025-1-25 20:46
0
雪    币: 4064
活跃值: (4397)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
感谢分享。
2025-1-26 15:24
0
雪    币: 115
活跃值: (1190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
兼容性不好 且会触发PG 
2025-1-26 15:45
0
雪    币: 246
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
mark
2025-1-27 00:29
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
ty
2025-1-29 13:03
0
雪    币: 213
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
我来看看!!
2025-2-7 09:53
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
!nnnnm
2025-2-13 15:59
0
雪    币: 1344
活跃值: (4203)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
23
学习一下
2025-2-13 16:14
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
好思路
2025-2-15 08:08
0
雪    币: 1555
活跃值: (4665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
Deice 兼容性不好 且会触发PG
不会pg,只是有的函数在低版本win10会消失,而且这姿势会拉闸
2025-2-15 09:23
0
游客
登录 | 注册 方可回帖
返回