首页
社区
课程
招聘
有没有办法获得ssdt的调用来源?
发表于: 2023-3-31 14:42 8177

有没有办法获得ssdt的调用来源?

2023-3-31 14:42
8177

我用 RtlWalkFrameChain 获得的是不对的..有啥方法可以直接索引到调用来的驱动吗?
_ReturnAddress() 获得的情况和上面的差不多
索引到的基本上都是 nt!KiStartSystemThread -> ... ``nt!KiSystemServiceCopyEnd

 

比如我再 A 驱动里面调用 ZwOpenProcess B驱动搞了个INLINE HOOK (OpenProcess)
有没有办法来获得来源是A驱动的 ZwOpenProcess 的地址堆栈?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
mb_nbakwvoe
为你点赞~
2023-4-7 13:00
最新回复 (12)
雪    币: 203
活跃值: (1274)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
2

说实话比较无语,没有调用来源那系统代码怎么正确返回?
那肯定是传了返回地址啊,这不是理所当然的东西吗?

都搞内核了,你不会跑来问我怎么传的参数吧。

最后于 2023-4-3 17:22 被palkiver编辑 ,原因:
2023-4-3 17:18
0
雪    币: 3637
活跃值: (4643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
用的什么hook啊  
2023-4-3 17:58
0
雪    币: 3032
活跃值: (2650)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

要获得SSDT调用的来源,可以使用内核模块监视SSDT表的方式。以下是一个示例C代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <ntddk.h>
#include <windef.h>
 
#define S_CODE _cdecl
 
// 定义 SSDT 枚举类型
typedef NTSTATUS(S_CODE* t_NtQuerySystemInformation)(
    ULONG systemInformationClass,
    PVOID systemInformation,
    ULONG systemInformationLength,
    PULONG returnLength);
 
// 定义结构体
typedef struct _SYSTEM_SERVICE_TABLE
{
    PVOID* ServiceTable;
    PULONG CounterTable;
    ULONG ServiceLimit;
    PVOID ArgumentTable;
}SYSTEM_SERVICE_TABLE, * PSYSTEM_SERVICE_TABLE;
 
// 定义全局变量
t_NtQuerySystemInformation NtQuerySystemInformation = NULL;
PSYSTEM_SERVICE_TABLE KeServiceDescriptorTable = NULL;
 
// 声明函数,用于遍历 SSDT 表
VOID EnumSSDT()
{
    PSYSTEM_SERVICE_TABLE SST = KeServiceDescriptorTable;
    KIRQL irql;
    ULONG index;
    PULONG ptr;
    PVOID funptr;
 
    // 禁止中断
    irql = KeRaiseIrqlToDpcLevel();
 
    // 遍历 SSDT 表
    for (index = 0; index < SST->ServiceLimit; index++)
    {
        ptr = (PULONG)& SST->CounterTable[index];
        funptr = (PVOID)ptr[index];
        DbgPrint("SSDT[%d]: %p\n", index, funptr);
    }
 
    // 恢复中断
    KeLowerIrql(irql);
}
 
// 实现 DriverEntry 函数
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT pDriverObject, _In_ PUNICODE_STRING pRegistryPath)
{
    NTSTATUS status;
    ULONG ReturnLength;
    ULONG i;
 
    DbgPrint("DriverEntry start\n");
 
    // 获取 NtQuerySystemInformation 函数地址
    NtQuerySystemInformation = (t_NtQuerySystemInformation)MmGetSystemRoutineAddress(
        &RTL_CONSTANT_STRING("NtQuerySystemInformation"));
    if (!NtQuerySystemInformation)
    {
        DbgPrint("Failed to get system routine address\n");
        return STATUS_UNSUCCESSFUL;
    }
 
    // 调用 NtQuerySystemInformation 获取 SSDDT 表地址
    status = NtQuerySystemInformation(SystemModuleInformation, NULL, 0, &ReturnLength);
    if (status != STATUS_INFO_LENGTH_MISMATCH)
    {
        DbgPrint("Failed to get system module information\n");
        return status;
    }
 
    // 分配内存
    PVOID buffer = ExAllocatePoolWithTag(NonPagedPool, ReturnLength, 'NG');
 
    // 获取 SSDDT 表地址
    status = NtQuerySystemInformation(SystemModuleInformation, buffer, ReturnLength, &ReturnLength);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("failed to get system module information, status = %x\n", status);
        return status;
    }
 
    // 遍历模块列表,查找 ntoskrnl.exe
    PRTL_PROCESS_MODULES pModules = (PRTL_PROCESS_MODULES)buffer;
    PRTL_PROCESS_MODULE_INFORMATION pModule = &(pModules->Modules[0]);
    KeServiceDescriptorTable = (PSYSTEM_SERVICE_TABLE)(DWORD_PTR)
        ((PCHAR)pModule->ImageBase + pModule->ExportDirectory->AddressOfNames);
 
    // 输出 SSDT 表中所有函数的地址
    EnumSSDT();
 
    DbgPrint("DriverEntry end\n");
 
    return STATUS_SUCCESS;
}



以上代码中,我们使用 NtQuerySystemInformation 函数获取了 SSDDT 表的地址,并遍历了其中所有的函数。你可以根据具体需求来修改该代码,在合适的时机调用遍历 SSDT 表的函数,即可获取 SSDT 调用来源信息。


2023-4-4 11:20
0
雪    币: 2623
活跃值: (1985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
palkiver ~cut~

非常抱歉可能是我表述的不够清楚…
您这给我说醒了,谢谢~


最后于 2023-4-4 14:29 被maxwudi编辑 ,原因:
2023-4-4 13:43
0
雪    币: 2623
活跃值: (1985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
caocaofff 要获得SSDT调用的来源,可以使用内核模块监视SSDT表的方式。以下是一个示例C代码:#include&nbsp;&lt;ntddk.h&gt; #include&n ...
GPT吗..
2023-4-4 13:43
0
雪    币: 2623
活跃值: (1985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
iamasbcx 用的什么hook啊
就是普通的hook,inline 直接改地址,过pg后
2023-4-4 13:44
0
雪    币: 3637
活跃值: (4643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
maxwudi 就是普通的hook,inline 直接改地址,过pg后
有github地址吗
2023-4-5 08:02
0
雪    币: 2623
活跃值: (1985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
iamasbcx 有github地址吗
https://github.com/ashyerv/kernel_inline_hook
不保熟
2023-4-5 13:43
0
雪    币: 3637
活跃值: (4643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
其实我想要过PG得、。。
2023-4-6 19:29
0
雪    币: 2623
活跃值: (1985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
iamasbcx 其实我想要过PG得、。。
shark ,github上就有。
2023-4-7 00:36
0
雪    币: 2127
活跃值: (5280)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
RtlLookupFunctionEntry RtlVirtualUnwind
2023-4-7 10:24
0
雪    币: 2623
活跃值: (1985)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
R0g RtlLookupFunctionEntry RtlVirtualUnwind
感谢!
2023-4-7 15:58
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册