2012-06-14 36 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()'返回的指針來改變命令的例子線數據。 –