【问题标题】:Get Process PID With PsLookupProcessByProcessId使用 PsLookupProcessByProcessId 获取进程 PID
【发布时间】:2021-08-08 09:06:56
【问题描述】:
#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。

有人可以帮帮我吗?

【问题讨论】:

  • ((LPBYTE)EP) + 0x440 应该做什么?
  • 我知道如何打印。我所有其他人的打印工作都很好。 ((LPBYTE)EP) + 0x440 是 PID 的地址。
  • UniqueProcessId == PsGetCurrentProcessId()EP== PsGetCurrentProcess 在您的情况下。所以不清楚你尝试做什么。如果PsLookupProcessByProcessId返回&gt;= 0,你也必须调用ObDereferenceObject(EP),如果api返回&lt; 0,你不能访问EP,但你根本不检查结果。
  • 使用 PsLookupProcessByProcessId 获取进程 PID - 但 PsLookupProcessByProcessId 将进程 PID 作为输入。所以你必须已经有了它才能使用这个 api。奇怪的名字。
  • DbgPrint((CHAR*)UniqueProcessId); 无论如何都会出错。奇怪的是没有蓝屏死机。 DbgPrint("pid=%p\n",UniqueProcessId); 必须是

标签: c++ winapi driver wdk


【解决方案1】:

但在第 30 行中,他没有打印任何内容

你试试说

DbgPrint((CHAR*)UniqueProcessId);

不打印任何东西。

DbgPrint 接受指向格式 string 的指针以在第一个参数中打印。但(CHAR*)UniqueProcessId 不是字符串,即使您将其转换为(CHAR*)。如果UniqueProcessId 有效值 - 它很小,通常小于0x10000,并且访问此位置的内存(DbgPrint 将尝试读取此“字符串”)必须导致异常/bsod。但是因为使用来自EPROCESS 的硬编码偏移量 (0x440) 总是错误的 - 你读取的不是进程 UniqueProcessId 而是一些随机数据,在你的情况下它们意外指向有效内存.打印的有效代码必须是这样的

DbgPrint("UniqueProcessId=%p\n",UniqueProcessId);

还有你在这一行之前的所有代码,没有意义并且包含严重错误

【讨论】:

  • 谢谢你成功了。另一个问题如何在我的驱动程序中使用函数 FindWindowA?因为ntddk.h中现在有这样的功能
  • @tantan FindWindowA 在驱动程序中不是个好主意。但是您可以尝试从 win32kfull.sys 拨打 NtUserFindWindowEx
  • 使用此功能需要包含哪些内容?
  • @tantan 什么都没有。你需要声明这个 api 本身。它没有记录。并在运行时从 win32kfull.sys 获取它的地址(如果没有找到 - 在 win32k.sys 中)
  • 非常感谢你,你是最棒的!那么,如果我有他的 pid,我该如何处理一个进程呢?我尝试使用 ZwOpenProcess,但它不喜欢用户模式下的 OpenProcess。
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2016-01-31
相关资源
最近更新 更多