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