任务管理器如何获取进程的命令行可执行路径

How does Task Manager gets command line executable path for processes?

本文关键字:命令行 可执行 路径 取进程 何获 任务管理器      更新时间:2023-10-16

我正在查看任务管理器的进程列表,并启用了查看>>命令行选择列以查看包括exe路径和命令行参数。

我试图使用GetModuleFileNameEx让同样的事情工作,但存在一些问题;首先,结果不包含任何参数,并且对于某些过程也失败,如WinRar.exeOpera.exe

我知道任务管理器使用 WMI 来获取其中一些数据(我尝试关闭服务,但对于相同的进程,它就像我的脚本一样失败),但我想知道,是什么让进程的路径"无法获取"?

任务管理器使用进程的PEB结构来访问命令行参数(以及其他内容)。 如果您具有目标进程的HANDLE(并且有足够的权限访问其内存),则可以使用 NtQueryInformationProcess() 函数(将其 ProcessInformationClass 参数设置为 ProcessBasicInformation 以接收PROCESS_BASIC_INFORMATION结构)访问PEB,以获取目标进程地址空间内PEB的内存地址(以及其他内容)。 然后,可以使用ReadProcessMemory()根据需要将PEB的内容读入应用的地址空间。 命令行参数是使用 PEB::ProcessParameters 字段定位的,该字段是指向 RTL_USER_PROCESS_PARAMETERS 结构的指针,其中包含 UNICODE_STRING 类型的CommandLine字段。

如果您是访问 64 位进程的 PEB 的 32 位进程,事情会变得更加棘手,反之亦然。 您必须考虑指针的不同大小(32 位为 4,64 位为 8),这会影响结构大小和偏移量。

但这就是它的要点。