1

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

我试图让同样的东西工作,GetModuleFileNameEx但有一些问题;首先,结果不包含任何参数,并且对于某些进程也会失败,例如WinRar.exeOpera.exe

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

4

1 回答 1

7

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

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

但这就是它的要点。

于 2012-06-14T23:55:16.603 回答