使用 PsLookupProcessByProcessId 获取进程 PID
Get Process PID With PsLookupProcessByProcessId
#include<Ntifs.h>
#include <ntddk.h>
#include <WinDef.h>
void SampleUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
DbgPrint("Sample driver Unload called\n");
}
extern "C"
NTSTATUS
DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = SampleUnload;
DbgPrint("Sample driver Load called\n");
PEPROCESS EP = NULL;
if (PsLookupProcessByProcessId(::PsGetCurrentProcessId(), &EP) == STATUS_INVALID_PARAMETER) {
DbgPrint("Can't get the eprocess");
}
else {
DbgPrint("Its working");
}
LPBYTE pUpi = ((LPBYTE)EP) + 0x440;
PVOID UniqueProcessId = *((PVOID*)pUpi);
DbgPrint("Test Test Test!");
DbgPrint((CHAR*)UniqueProcessId);
return STATUS_SUCCESS;
}
大家好,
我正在尝试打印出驱动程序的 pid 作为练习。
当我启动驱动程序时,他正在工作,但在第 30 行中他没有打印任何内容,而在其他所有行中他都打印了!
我想使用 EPROCESS 打印出进程的 pid。
有人可以帮我吗?
but in the 30 line he doesn't print anything
你试试这么说
DbgPrint((CHAR*)UniqueProcessId);
不打印任何内容。
DbgPrint
接受指向格式 string 的指针以在第一个参数中打印。但是 (CHAR*)UniqueProcessId
不是字符串,即使您将它转换为 (CHAR*)
。如果 UniqueProcessId
有效值 - 它很小,通常小于 0x10000
,并且对该位置的内存访问(DbgPrint
将尝试读取此“字符串”)必须导致 exception/bsod。但是因为使用 EPROCESS
的硬编码偏移量 (0x440) 总是错误的——你读的不是进程 UniqueProcessId 而是一些随机数据,这在您的情况下,不小心指向了有效内存。打印的有效代码必须像
DbgPrint("UniqueProcessId=%p\n",UniqueProcessId);
还有你在这一行之前的所有代码,没有意义并且包含严重错误
#include<Ntifs.h>
#include <ntddk.h>
#include <WinDef.h>
void SampleUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
DbgPrint("Sample driver Unload called\n");
}
extern "C"
NTSTATUS
DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = SampleUnload;
DbgPrint("Sample driver Load called\n");
PEPROCESS EP = NULL;
if (PsLookupProcessByProcessId(::PsGetCurrentProcessId(), &EP) == STATUS_INVALID_PARAMETER) {
DbgPrint("Can't get the eprocess");
}
else {
DbgPrint("Its working");
}
LPBYTE pUpi = ((LPBYTE)EP) + 0x440;
PVOID UniqueProcessId = *((PVOID*)pUpi);
DbgPrint("Test Test Test!");
DbgPrint((CHAR*)UniqueProcessId);
return STATUS_SUCCESS;
}
大家好, 我正在尝试打印出驱动程序的 pid 作为练习。 当我启动驱动程序时,他正在工作,但在第 30 行中他没有打印任何内容,而在其他所有行中他都打印了! 我想使用 EPROCESS 打印出进程的 pid。
有人可以帮我吗?
but in the 30 line he doesn't print anything
你试试这么说
DbgPrint((CHAR*)UniqueProcessId);
不打印任何内容。
DbgPrint
接受指向格式 string 的指针以在第一个参数中打印。但是 (CHAR*)UniqueProcessId
不是字符串,即使您将它转换为 (CHAR*)
。如果 UniqueProcessId
有效值 - 它很小,通常小于 0x10000
,并且对该位置的内存访问(DbgPrint
将尝试读取此“字符串”)必须导致 exception/bsod。但是因为使用 EPROCESS
的硬编码偏移量 (0x440) 总是错误的——你读的不是进程 UniqueProcessId 而是一些随机数据,这在您的情况下,不小心指向了有效内存。打印的有效代码必须像
DbgPrint("UniqueProcessId=%p\n",UniqueProcessId);
还有你在这一行之前的所有代码,没有意义并且包含严重错误