Как очистить командную строку процесса?

7 Joe Jordan [2010-10-22 02:24:00]

Я хотел бы очистить командную строку моего процесса изнутри. Например, при просмотре моего процесса в диспетчере задач /Process Explorer запись в командной строке будет пустой.

Я хотел бы сделать это в текущем запущенном процессе, а не перезапускать процесс, если это возможно.

c++ command-line windows winapi command-line-arguments


3 ответа


10 Oleg [2010-10-22 03:03:00]

Предположим, вам нужно изменить часть RTL_USER_PROCESS_PARAMETERS PEB вашего процесса (например, http://en.wikipedia.org/wiki/Process_Environment_Block и http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html). Вы можете попытаться использовать NtQueryInformationProcess, чтобы получить PEB. Затем вы можете изменить ProcessParameters.CommandLine. Я надеюсь, что это сработает.

ОБНОВЛЕНО. Я подтвердил свое предложение. Оно работает. Следующая тестовая программа демонстрирует это:

#include <Windows.h>
#include <Winternl.h> // for PROCESS_BASIC_INFORMATION and ProcessBasicInformation
#include <stdio.h>
#include <tchar.h>

typedef NTSTATUS (NTAPI *PFN_NT_QUERY_INFORMATION_PROCESS) (
    IN HANDLE ProcessHandle,
    IN PROCESSINFOCLASS ProcessInformationClass,
    OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength,
    OUT PULONG ReturnLength OPTIONAL);

int main()
{
    HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                                   FALSE, GetCurrentProcessId());
    PROCESS_BASIC_INFORMATION pbi;
    ULONG ReturnLength;
    PFN_NT_QUERY_INFORMATION_PROCESS pfnNtQueryInformationProcess =
        (PFN_NT_QUERY_INFORMATION_PROCESS) GetProcAddress (
            GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationProcess");
    NTSTATUS status = pfnNtQueryInformationProcess (
        hProcess, ProcessBasicInformation,
        (PVOID)&pbi, sizeof(pbi), &ReturnLength);
    // remove full information about my command line
    pbi.PebBaseAddress->ProcessParameters->CommandLine.Length = 0;

    getchar(); // wait till we can verify the results
    return 0;
}

Если мы запустим программу с некоторыми параметрами, мы увидим

alt text

вместо следующего вида перед

alt text


2 Greg Hewgill [2010-10-22 06:13:00]

Основываясь на вашем комментарии выше, вы можете захотеть передать секретный ключ через переменную среды. Если вы установите ключ в родительской среде процесса, он будет наследоваться дочерним процессом и не будет видимым для посторонних так же легко, как в командной строке.


1 Jim Mischel [2010-10-22 02:28:00]

Вы можете попробовать вызвать функцию API GetCommandLine, а затем установить первый байт в 0. То есть:

LPTSTR cmdline = GetCommandLine();
*cmdline = '\0';

Честно говоря, я не знаю, будет ли это работать или каковы возможные последствия, но это может стоить того.