2012-06-14 91 views
1

我正在查看任务管理器的进程列表,并启用了查看>选择列>命令行以查看包含exe路径的&命令行参数。任务管理器如何获取进程的命令行可执行路径?

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

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

+0

您的进程句柄是否对'GetModuleFileNameEx'具有必要的访问权限? (PROCESS_QUERY_INFORMATION和PROCESS_VM_READ) –

+0

是的,我将两者都传递给'OpenProcess'。 –

+0

它只是不能直接从winapi获得。你可以用winternl.h来获得本机API的后门,足以获得这个。但是使用Win32_Process是受支持的方式。 –

回答

7

任务管理器使用进程的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位),这会影响结构大小和偏移量。

但这是它的要义。

+0

我发现这个http://blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx提供了一个关于如何处理由'GetCommandLine()'返回的指针来改变命令的例子线数据。 –