簡體   English   中英

任務管理器如何獲取進程的命令行可執行路徑?

[英]How does Task Manager gets command line executable path for processes?

我正在查看任務管理器的進程列表,並啟用了“查看”>“選擇列”>“命令行”以查看包含exe路徑和命令行參數。

我試圖使用GetModuleFileNameEx來獲得同樣的效果,但是存在一些問題; 首先,結果不包含任何參數,並且對於某些進程(如WinRar.exeOpera.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM