我正在查看任务管理器的进程列表,并启用了View>选择列>命令行看到包含exe路径&命令行参数。
我尝试使用GetModuleFileNameEx
使用同样的东西,但是有一些问题;首先,结果不包含任何参数,并且对于某些进程也是如此,基本如 WinRar.exe 或 Opera.exe 。
我知道任务管理器使用WMI来获取一些这些数据(我尝试关闭服务并且它失败的方式就像我的脚本一样,对于相同的进程而言),但我想知道,是什么让进程的路径“难以置信” “?
答案 0 :(得分:7)
任务管理器使用进程的PEB
结构来访问命令行参数(以及其他内容)。如果您对目标进程HANDLE
(以及访问其内存的足够权限),则可以使用PEB
函数访问NtQueryInformationProcess()
(将其ProcessInformationClass
参数设置为ProcessBasicInformation
接收PROCESS_BASIC_INFORMATION
结构)以获取目标进程地址空间(以及其他内容)中PEB
的内存地址。然后,您可以根据需要使用ReadProcessMemory()
将PEB
的内容读入应用的地址空间。命令行参数是使用PEB::ProcessParameters
字段定位的,CommandLine
字段是指向RTL_USER_PROCESS_PARAMETERS
结构的指针,其中包含UNICODE_STRING
类型的{{1}}字段。
如果您是访问64位进程的PEB的32位进程,或者反之亦然,那么事情会变得有点棘手。您必须考虑指针的不同大小(32位中的4位,64位中的8位),这会影响结构大小和偏移。
但这是它的要点。