我正在尝试获取另一个进程的命令行参数(在 WinXP 32 位上)。
我执行以下操作:
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcList.proc_id_as_numbers[i]);
BytesNeeded = sizeof(PROCESS_BASIC_INFORMATION);
ZwQueryInformationProcess(hProcess, ProcessBasicInformation, UserPool, sizeof(PROCESS_BASIC_INFORMATION), &BytesNeeded);
pbi = (PPROCESS_BASIC_INFORMATION)UserPool;
BytesNeeded = sizeof(PEB);
res = ZwReadVirtualMemory(hProcess, pbi->PebBaseAddress, UserPool, sizeof(PEB), &BytesNeeded);
/* zero value returned */
peb = (PPEB)UserPool;
BytesNeeded = sizeof(RTL_USER_PROCESS_PARAMETERS);
res = ZwReadVirtualMemory(hProcess, peb->ProcessParameters, UserPool, sizeof(RTL_USER_PROCESS_PARAMETERS), &BytesNeeded);
ProcParam = (PRTL_USER_PROCESS_PARAMETERS)UserPool;
第一次调用后, pbi.UniqueProcessID
是正确的。
但是,在调用 ZwReadVirtualMemory()
之后,我得到了我的进程的命令行,而不是请求的命令行。
我也使用 ReadProcessMemory()
& NtQueryInformationProcess()
,但得到了相同的结果。
有人可以帮忙吗?
在 这个论坛帖子上,据说这段代码有效。不幸的是,我无法在该论坛上发帖询问他们。
原文由 Georg 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何查询正在运行的进程以获取其参数列表的重复项? (windows, C++) ,所以我将在这里复制我的答案:
您无法 可靠地 获取该信息。有各种技巧可以尝试检索它,但不能保证目标进程还没有损坏那部分内存。 Raymond Chen 不久前在 The Old New Thing 上讨论过这个问题。