钩子SSDT.其他驱动程序使用我的函数



如何在其上下文中获取驱动程序名称或驱动程序路径?我的意思是,当我的驱动程序不使用 syscall 并且我挂上它时,我需要获取此驱动程序的名称。对于用户进程,没有问题:

PUNICODE_STRING myname;
SeLocateProcessImageName(PsGetCurrentProcess(), &myname);

但是,如果外星驱动程序使用挂钩系统调用,则其PID为4。而且我不能得到上面这样的名字... 这是完整的钩子代码:

NTSTATUS
HookNtTerminateProcess(
HANDLE hProcess,
NTSTATUS ExitStatus
)
{
NTSTATUS statuscod;
if (hProcess == NULL || hProcess == (HANDLE)-1 || hProcess<2) {
return fnNtTerminateProcess(hProcess, ExitStatus);
}
if (PsGetCurrentProcessId() == 4)
{
???????????????????????????
}
PUNICODE_STRING name;
getPathByProcessHandle(hProcess, &name);
PUNICODE_STRING myname;
SeLocateProcessImageName(PsGetCurrentProcess(), &myname);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "n-------------------------------------------n");
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "KILL TO PROCESS WITH HANDLE %dn", hProcess);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "WHO: %Sn", myname->Buffer);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "TARGET: %Sn", name->Buffer);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "PID is %dn", PsGetCurrentProcessId());
NTSTATUS status;
if (wcsstr(name->Buffer, L"Windows\protecteddir\myapp.exe") == NULL) {
return fnNtTerminateProcess(hProcess, ExitStatus);
}
sendEvent(0, PsGetCurrentProcessId());
return STATUS_ACCESS_DENIED;
}

驱动程序利用系统进程,其进程 ID 通常为 0x04。驱动程序作为命名节映射到内存中,然后由线程执行。它们不是单独的进程,当您无法通过进程信息唯一标识它们的名称时,可以看出,因为它只是系统进程的一部分。

这些是识别调用方与我知道的哪个驱动程序相关的一些可能性。对于所有情况,如果进程 ID 是系统进程 (0x04( 或上一个KPROCESSOR_MODE不是用户模式:

1( 跟踪系统服务例程钩子中捕获的当前线程的调用堆栈,查看调用方的地址范围并确定范围内的地址属于哪个内存部分。该部分的对象属性将指定名称,例如"驱动程序.sys"。这将是发起调用的基本驱动程序的名称

2( 使用 ZwQueryInformationThread 并将 ThreadQuerySetWin32StartAddress 作为 ThreadInformationClass 的参数传递,这将告诉您线程从哪里开始执行,然后确定基执行地址在哪个命名内存段。这将存储在内存部分的OBJECT_ATTRIBUTES中。这还将解析调用源自的基本驱动程序的名称。

3( 如果这是为了确保只有您的线程正常执行系统服务例程钩子,那么更改线程的 ETHREAD/KTHREAD 结构中未使用/保留的字段以唯一标识它,并且除了所有其他线程。

这些是一些解决方案,但唯一定位和标识系统进程中的线程应该有效。

最新更新