通过进程ID得到进程名

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

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

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

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

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

 

具体代码如下:

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

你可能感兴趣的:(通过进程ID得到进程名)