2010-10-21 3 views
7

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

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

+0

Вы пытаетесь сделать некоторые виды оружия массового поражения? Слишком плохо, есть уже некоторые правдоподобные ответы. –

+0

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

+0

@Alf: Что такое вредоносное ПО для изменения командной строки процесса? Это то, что может сделать программа, поскольку это ее собственная память. Например, прочитайте http://blogs.msdn.com/b/oldnewthing/archive/2009/02/23/9440784.aspx. – Joey

ответ

1

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

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

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

+3

Я проверил это. Это не работа. – Oleg

10

Я полагаю, что вы должны изменить часть 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

+0

@Joe: Я обновил свой ответ, чтобы сделать вас более простым в использовании 'NtQueryInformationProcess'. – Oleg

+0

Олег, наконец, смог попробовать это (Win7-64) и, похоже, работает полностью, когда запускается как admin, но при запуске со стандартными разрешениями пользователя TaskManager все еще может отображать командную строку. Интересно, что Process Explorer не отображает переданную командную строку в сценарии разрешений. –

+0

@Joe: Вы уверены, что вы ** перезапустили ** процесс TaskManager? – Oleg

2

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

+1

Вы сможете увидеть их в проводнике процессов. Вы можете установить его на фиктивное значение после прочтения. Я полагаю, – Anders

Смежные вопросы