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

时间:2012-06-14 22:29:39

标签: c++ winapi

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

我尝试使用GetModuleFileNameEx使用同样的东西,但是有一些问题;首先,结果不包含任何参数,并且对于某些进程也是如此,基本如 WinRar.exe Opera.exe

我知道任务管理器使用WMI来获取一些这些数据(我尝试关闭服务并且它失败的方式就像我的脚本一样,对于相同的进程而言),但我想知道,是什么让进程的路径“难以置信” “?

1 个答案:

答案 0 :(得分:7)

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

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

但这是它的要点。