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

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

2023-3-31 14:42
7954

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

 

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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (12)
雪    币: 203
活跃值: (1104)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
2

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

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

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

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

#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
雪    币: 2479
活跃值: (1660)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
palkiver ~cut~

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


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