Как очистить командную строку процесса? - PullRequest
7 голосов
/ 22 октября 2010

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

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

Ответы [ 3 ]

10 голосов
/ 22 октября 2010

Полагаю, вам нужно изменить 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 голосов
/ 22 октября 2010

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

1 голос
/ 22 октября 2010

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

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

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

...