Как очистить командную строку процесса?
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;
}
Если мы запустим программу с некоторыми параметрами, мы увидим
вместо следующего вида перед
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';
Честно говоря, я не знаю, будет ли это работать или каковы возможные последствия, но это может стоить того.