NtQueryInformationProcess, кажется, возвращает неправильную командную строку

Я использую NtQueryInformationProcess() для получения командной строки другого процесса (через RTL_USER_PROCESS_PARAMETERS в PEB, возвращенном NtQueryInformationProcess()) в Windows 7.

Обычно это работает нормально, но при запуске нескольких экземпляров одного и того же исполняемого файла строка командной строки одинакова для всех экземпляров: это всегда командная строка первого запущенного экземпляра. Однако GetCommandLine() возвращает правильную командную строку для каждого процесса.

Может ли кто-нибудь подтвердить или опровергнуть это?


person kassiopeia    schedule 22.05.2012    source источник


Ответы (1)


Что вы, вероятно, упускаете из виду, так это то, что каждый указатель в PEB имеет значение только в адресном пространстве процесса PEB, а не процесса, который вызвал NtQueryInformationProcess и получил PEB. Вы должны использовать ReadProcessMemory для разграничения указателей. В противном случае, поскольку процессы, вероятно, будут расположены одинаково, вы в конечном итоге читаете командную строку вызывающего объекта NtQueryInformationProcess, а не процесса PEB.

Я могу подтвердить, что с помощью NtQueryInformationProcess и ReadProcessMemory для каждого уровня косвенного указателя вы можете правильно получить командные строки всех процессов. См. https://stackoverflow.com/a/13408150/1236546 пример исходного кода.

person glagolig    schedule 23.01.2013