能力值:
( LV9,RANK:195 )
|
-
-
2 楼
说实话比较无语,没有调用来源那系统代码怎么正确返回? 那肯定是传了返回地址啊,这不是理所当然的东西吗? 都搞内核了,你不会跑来问我怎么传的参数吧。
最后于 2023-4-3 17:22
被palkiver编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
用的什么hook啊
|
能力值:
( 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 调用来源信息。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
palkiver ~cut~ 非常抱歉可能是我表述的不够清楚… 您这给我说醒了,谢谢~
最后于 2023-4-4 14:29
被maxwudi编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
caocaofff
要获得SSDT调用的来源,可以使用内核模块监视SSDT表的方式。以下是一个示例C代码:#include <ntddk.h>
#include&n ...
GPT吗..
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
iamasbcx
用的什么hook啊
就是普通的hook,inline 直接改地址,过pg后
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
maxwudi
就是普通的hook,inline 直接改地址,过pg后
有github地址吗
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
iamasbcx
有github地址吗
https://github.com/ashyerv/kernel_inline_hook 不保熟
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
其实我想要过PG得、。。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
|
能力值:
( LV6,RANK:90 )
|
-
-
12 楼
RtlLookupFunctionEntry RtlVirtualUnwind
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
R0g
RtlLookupFunctionEntry RtlVirtualUnwind
感谢!
|
|
|