Я полагаю, что вы должны изменить часть 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;
}
Если мы начинаем программу с некоторыми параметрами мы увидим
вместо следующих видел
Вы пытаетесь сделать некоторые виды оружия массового поражения? Слишком плохо, есть уже некоторые правдоподобные ответы. –
Нет, но это многопроцессорное решение, которое я хотел бы сделать максимально безопасным. Один запускает другой с секретным ключом, переданным через командную строку, я просто пытаюсь удалить его, как только он будет обработан при запуске. –
@Alf: Что такое вредоносное ПО для изменения командной строки процесса? Это то, что может сделать программа, поскольку это ее собственная память. Например, прочитайте http://blogs.msdn.com/b/oldnewthing/archive/2009/02/23/9440784.aspx. – Joey