【问题标题】:How does Task Manager gets command line executable path for processes?任务管理器如何获取进程的命令行可执行路径?
【发布时间】:2012-06-18 00:36:57
【问题描述】:

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

我尝试使用GetModuleFileNameEx 来实现相同的功能,但存在一些问题;首先,结果不包含任何参数,并且对于某些进程也会失败,例如 WinRar.exeOpera.exe

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

【问题讨论】:

  • 您的进程句柄是否拥有GetModuleFileNameEx 的必要访问权限? (PROCESS_QUERY_INFORMATION 和 PROCESS_VM_READ)
  • 是的,我把两个都传给了OpenProcess
  • 只是不能直接从 winapi 获得。您可以使用 winternl.h 获得本机 api 的后门,足以获得这个。但是使用 Win32_Process 是受支持的方式。

标签: c++ winapi


【解决方案1】:

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

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

但这就是它的要点。

【讨论】:

猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2012-07-24
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多