我正在查看任务管理器的进程列表,并启用查看 > 选择列 > 命令行以查看包含 exe 路径和命令行参数。
我试图让同样的东西工作,GetModuleFileNameEx
但有一些问题;首先,结果不包含任何参数,并且对于某些进程也会失败,例如WinRar.exe或Opera.exe。
我知道任务管理器使用 WMI 来获取其中的一些数据(我尝试关闭服务,但它失败了,就像我的脚本一样,对于相同的进程),但我想知道,是什么让进程的路径“无法获取”?
任务管理器使用进程的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 位),这会影响结构大小和偏移量。
但这就是它的要点。