获取进程ID,父进程ID,进程完整路径

摘要:
准备编写流程管理功能模块。今天下午,我首先编写了扫描,以获取本地机器上每个进程的路径,并获取每个进程图像的名称和进程的完整路径。0x01用户定义的结构_ PROCESS_ INFORMATION_{ULONGProcessID;ULONGParentProcessID;charImageNameData[MAX_PATH];charProcessFullPathData[MAX_PATH];};首先,将所需的每个成员变量定义为一个结构,包括四个成员变量:进程ID、父进程ID、映像名称和进程的完整路径。0x02进程ID、父进程ID、进程名称ProcessEntry32结构要列出所有进程,需要首先调用CreateToolHelp32Snapshot函数获取系统进程快照的句柄。该函数包含在标头中。

  准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径。

  要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://www.cnblogs.com/lsh123/p/8280575.html),不再复述。

0x01  自定义结构体

struct _PROCESS_INFORMATION_
{
	ULONG  ProcessID;
	ULONG  ParentProcessID;
	char   ImageNameData[MAX_PATH];
	char   ProcessFullPathData[MAX_PATH];
};

  首先定义好自己需要的各个成员变量为一个结构体,包括进程ID,父进程ID,映像名称,进程完整路径四个成员变量。

   

0x02  进程ID,父进程ID,进程名  ProcessEntry32结构体

    要列出所有进程,需要调用CreateToolHelp32Snapshot函数先得到系统进程快照的句柄,函数包含在<tlhelp32.h>头中。函数的具体参数如下:

HANDLE_WINAPI CreateToolHelp32Snapshot(  
                                       DWORD dwFlags,  
                                       DWORD th32ProcessID  
                                      );  

  参数含义:

  dwFlags:指定了获取系统进程快照的类型,获取进程相关信息应该填入参数 TH32CS_SNAPPROCESS 表示在快照中包含系统中所有的进程

  th32ProcessID:指向要获取进程快照的ID,获取系统内所有进程快照时是0

  函数调用:

  

	HANDLE   SnapshotHandle = NULL;
	PROCESSENTRY32  ProcessEntry32;
	ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);

	SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  

  如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。在得到系统进程快照句柄之后,需要调用Process32First函数查找系统进程快照中的第一个进程。函数参数如下:

BOOL Process32First(  
                    HANDLE hSnapshot,  
                    LPROCESSENTRY32 lppe  
                   );  

  再调用Process32Next函数列出系统中下一个进程,利用do while循环遍历出所有进程,Process32Next参数如下:

BOOL Process32Next(  
                    HANDLE hSnapshot,  
                    LPROCESSENTRY32 lppe  
                   );  

  两个函数的参数是一样的,其中hSnapshot是由CreateToolHelp32Snapshot函数返回的系统进程快照的句柄;而lppe是指向PROCESSENTRY32的结构体指针,进程的详细信息保存在结构体中。PROCESSENTRY32结构体定义:

typedef struct tagPROCESSENTRY32 {  
                                  DWORD dwSize;//结构大小  
                                  DWORD cntUsage;//此进程的引用计数  
                                  DWORD th32ProcessID;//进程ID  
                                  DWORD th32DefaultHeapID;//进程默认堆ID  
                                  DWORD th32ModuleID;//进程模块ID  
                                  DWORD cntThreads;//此进程开启的线程计数  
                                  DWORD th32ParentProcessID;//父进程ID  
                                  LONG pcPriClassBase;//线程优先权  
                                  DWORD dwFlags;//保留  
                                  char szExeFile[MAX_PATH];//进程名  
                                } PROCESSENTRY32;  

  可以看到PROCESSENTRY32结构体中我所需要的三个成员,进程ID,父进程ID,进程名。

  当上述两个函数列举到进程时返回TRUE,否则返回FALSE。当列举到一个进程时lppe参数就会返回进程的详细信息,所以用户就可以读取这些进程的信息,然后输出。

列举完后,需要调用CloseHandle函数关闭系统进程句柄。

		do
		{
			//打开进程并返回句柄
			ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
				FALSE, ProcessEntry32.th32ProcessID);   //打开目标进程  
														//		(ProcessEntry32.th32ProcessID !=4))
			if (ProcessHandle == NULL)// 权限太高 - 降低打开
			{
				ProcessHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
					FALSE, ProcessEntry32.th32ProcessID);   //打开目标进程

				if (ProcessHandle == NULL)
				{
					strcpy(ProcessFullPathData, "打开进程失败");

					goto Label1;

				}
			}
			//获得进程下的第一个模块
			HMODULE ModuleHandle = NULL;

			DWORD ReturnLength = GetModuleFileNameEx(ProcessHandle, ModuleHandle,
				ProcessFullPathData,
				sizeof(ProcessFullPathData));

			if (ReturnLength == 0)
			{
				RtlZeroMemory(ProcessFullPathData, MAX_PATH);

				QueryFullProcessImageName(ProcessHandle, 0, ProcessFullPathData, &ReturnLength);	// 更推荐使用这个函数
				if (ReturnLength == 0)
				{
					strcpy(ProcessFullPathData, "枚举信息失败");
				}
			}
			//BufferData[[20][calc.exe

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在MFC中使dialog自适应缩放Ubantu 16.04升级内核版本和还原到升级之前的内核版本的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Python3 读取和写入excel

/py_工作/销售/包括/天气。csv'_工作簿函数读取并返回所有工作表● 以列表形式读取_仅:判断是否读取_仅以模式打开Excel文档● 编码:...

正负无穷float('inf')的一些用法

示例:输入:[-2,1,-3,4,-1,2,1,-5,4],输出:6解释:连续子数组[4],-1,2,1]的和最大,为6。...

Jmeter中获取返回结果中的值

在jmeter的测试中,通常需要在下一个请求中使用上一个请求的返回值。如何获得返回值非常重要。插件下载地址为:http://jmeter-plugins.org/wiki/JSONPathExtractor/下载后,将lib文件夹放在jmeter目录中。...

es6 proxy浅析

代理用于定义用户定义的基本操作行为,如搜索、分配、枚举、函数调用等。代理接受要代理的目标对象和一些包含元操作的对象,为要代理的对象创建“屏障”,拦截所有操作,并将其重定向到用户定义的元操作对象。然而,proxy提供了一种更好的方法来实现类似的私有属性constenablePrivate==˃newProxy(target,{has:(obj,k)=˃(!pr...

【转】 中兴OLT-C300常用命令

在当前的C220版本中,ONU类型名称在GPON和EPON中应该是唯一的。这里我们使用“ZTEG-F620”。ZXAN#ponZXAN#onu-typegponZTEG-F620描述4ETH,2POTSZXAN#onu-ifZTEG-F620eth_0/1-4ZXAN#onon-ifZTEG-F620pots_0/1-2ZXAN#on u type attr...

CentOS7上使用history删除部分历史记录

使用history命令删除登录后创建的历史记录,但保留原始记录。如果未执行history命令,则直接使用history-r命令将文件中的历史刷新到此处的缓存中,并且不会保存以前操作的记录。修改后,执行:history-c以清除当前会话历史中的历史缓存-r以读取~/。bash_您可以看到历史文件中的历史记录已在缓存中更新。...