[英]How does Task Manager gets command line executable path for processes?
我正在查看任務管理器的進程列表,並啟用了“查看”>“選擇列”>“命令行”以查看包含exe路徑和命令行參數。
我試圖使用GetModuleFileNameEx
來獲得同樣的效果,但是存在一些問題; 首先,結果不包含任何參數,並且對於某些進程(如WinRar.exe或Opera.exe這樣的基本進程)也將失敗。
我知道任務管理器使用WMI來獲取一些數據(我嘗試關閉該服務,並且對於相同的進程,它就像我的腳本那樣失敗了),但是我想知道,是什么導致進程的路徑“不可覆蓋的”?
任務管理器使用流程的PEB
結構來訪問命令行參數(以及其他功能)。 如果您對目標進程有一個HANDLE
(並且有足夠的權限訪問它的內存),則可以使用NtQueryInformationProcess()
函數(將其ProcessInformationClass
參數設置為ProcessBasicInformation
來接收PROCESS_BASIC_INFORMATION
結構)來訪問PEB
以獲得該對象的內存地址。在目標進程的地址空間內的PEB
(以及其他)。 然后,您可以根據需要使用ReadProcessMemory()
將PEB
的內容讀取到應用程序的地址空間中。 通過使用PEB::ProcessParameters
字段來定位命令行參數,該字段是指向RTL_USER_PROCESS_PARAMETERS
結構的指針,該結構包含UNICODE_STRING
類型的CommandLine
字段。
如果您是32位進程,則要訪問64位進程的PEB,事情會變得有些棘手,反之亦然。 您必須考慮到指針的不同大小(32位為4,64位為8),這會影響結構的大小和偏移量。
但這就是要點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.