我正在查看任务管理器的进程列表,并启用了查看>选择列>命令行以查看包含exe路径的&命令行参数。任务管理器如何获取进程的命令行可执行路径?
我试图用GetModuleFileNameEx
得到同样的东西,但有一些问题;首先,结果不包含任何参数,并且对于某些进程也失败,基本如WinRar.exe或Opera.exe。
我知道任务管理器使用WMI来获取这些数据(我尝试关闭服务,但它失败了,就像我的脚本一样,对于相同的进程),但我想知道是什么让一个进程的路径“ ungettable“?
我正在查看任务管理器的进程列表,并启用了查看>选择列>命令行以查看包含exe路径的&命令行参数。任务管理器如何获取进程的命令行可执行路径?
我试图用GetModuleFileNameEx
得到同样的东西,但有一些问题;首先,结果不包含任何参数,并且对于某些进程也失败,基本如WinRar.exe或Opera.exe。
我知道任务管理器使用WMI来获取这些数据(我尝试关闭服务,但它失败了,就像我的脚本一样,对于相同的进程),但我想知道是什么让一个进程的路径“ ungettable“?
任务管理器使用进程的PEB
结构来访问命令行参数(等等)。如果你有一个HANDLE
目标进程(和足够的权限来访问它的内存),则可以使用NtQueryInformationProcess()
功能访问PEB
(其ProcessInformationClass
参数设置为ProcessBasicInformation
接收PROCESS_BASIC_INFORMATION
结构)内获得PEB
的内存地址目标进程的地址空间(等等)。然后,您可以根据需要使用ReadProcessMemory()
将PEB
的内容读入应用的地址空间。命令行参数使用PEB::ProcessParameters
字段进行定位,该字段是指向RTL_USER_PROCESS_PARAMETERS
结构的指针,该结构包含UNICODE_STRING
类型的CommandLine
字段。
如果你是一个访问64位进程的PEB的32位进程,事情会变得有点棘手,反之亦然。您必须考虑指针的不同大小(32位的4位,64位的8位),这会影响结构大小和偏移量。
但这是它的要义。
我发现这个http://blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx提供了一个关于如何处理由'GetCommandLine()'返回的指针来改变命令的例子线数据。 –
您的进程句柄是否对'GetModuleFileNameEx'具有必要的访问权限? (PROCESS_QUERY_INFORMATION和PROCESS_VM_READ) –
是的,我将两者都传递给'OpenProcess'。 –
它只是不能直接从winapi获得。你可以用winternl.h来获得本机API的后门,足以获得这个。但是使用Win32_Process是受支持的方式。 –