通过进程ID得到进程名

柔情只为你懂 2022-09-24 05:22 508阅读 0赞

在内核中,通过进程ID,得到进程名称,有多种方法。

我使用了两种方法,第一种是使用ZwOpeProcess得到句柄

然后ObReferenceObjectByHandle函数得到PEPROCESS结构,然后

char *ProcessName = (char*)EProcess + 0x174;

第二种方法是得到PEPROCESS结构之后,使用PsGetProcessImageFileName函数得到进程名。

具体代码如下:

[cpp] view plain copy

  1. #include
  2. #include
  3. UCHAR* PsGetProcessImageFileName(PEPROCESS Process);
  4. NTSTATUS Unload(IN PDRIVER_OBJECT DriverObject)
  5. {
  6. DbgPrint(“驱动已经卸载/n”);
  7. }
  8. void GetProcessName(ULONG dwPid)
  9. {
  10. HANDLE ProcessHandle;
  11. NTSTATUS status;
  12. OBJECT_ATTRIBUTES ObjectAttributes;
  13. CLIENT_ID myCid;
  14. PEPROCESS EProcess;
  15. InitializeObjectAttributes(&ObjectAttributes,0,0,0,0);
  16. myCid.UniqueProcess = (HANDLE)dwPid;
  17. myCid.UniqueThread = 0;
  18. //打开进程,获取句柄
  19. status = ZwOpenProcess (&ProcessHandle,PROCESS_ALL_ACCESS,&ObjectAttributes,&myCid);
  20. if (!NT_SUCCESS(status))
  21. {
  22. DbgPrint(“打开进程出错/n”);
  23. return;
  24. }
  25. //得到EPROCESS,结构中取进程名
  26. status = ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA,0,KernelMode,&EProcess, 0);
  27. if (status == STATUS_SUCCESS)
  28. {
  29. char *ProcessName = (char*)EProcess + 0x174;
  30. char *PsName = PsGetProcessImageFileName(EProcess);
  31. DbgPrint(“ProcessName is %s/n”,ProcessName);
  32. DbgPrint(“PsName is %s/n”,PsName);
  33. ZwClose(ProcessHandle);
  34. }
  35. else
  36. {
  37. DbgPrint(“Get ProcessName error”);
  38. }
  39. }
  40. NTSTATUS
  41. DriverEntry(
  42. IN PDRIVER_OBJECT DriverObject,
  43. IN PUNICODE_STRING RegistryPath
  44. )
  45. {
  46. DbgPrint(“驱动已经加载了/n”);
  47. GetProcessName(2044);
  48. DriverObject->DriverUnload = Unload;
  49. return STATUS_SUCCESS;
  50. }

发表评论

表情:
评论列表 (有 0 条评论,508人围观)

还没有评论,来说两句吧...

相关阅读

    相关 通过进程ID获取基地址

    下面代码是通过进程ID来获取进程的[基地址][Link 1],创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址