2010-10-21 35 views
7

Ich möchte die Befehlszeile meines Prozesses von innen löschen. Wenn Sie beispielsweise meinen Prozess im Task-Manager/Process Explorer anzeigen, ist der Befehlszeileneintrag leer.Wie lösche ich eine Prozessbefehlszeile?

Ich möchte dies innerhalb des laufenden Prozesses tun, anstatt den Prozess neu zu starten, wenn möglich.

+0

Sie versuchen, etwas MALWARE zu machen? Schade, dass es schon plausible Antworten gibt. –

+0

Nein, aber es ist eine Multi-Prozess-Lösung, die ich so sicher wie möglich machen möchte. Man startet ein anderes mit einem geheimen Schlüssel, der über die Befehlszeile übergeben wird. Ich versuche gerade, es zu entfernen, sobald es von der Startroutine verarbeitet wurde. –

+0

@Alf: Was ist Malware-y über das Ändern der Befehlszeile des Prozesses? Es ist etwas, was ein Programm tun kann, da es sein eigenes Gedächtnis ist. Lesen Sie zum Beispiel http://blogs.msdn.com/b/oldnewthing/archive/2009/02/23/9440784.aspx. – Joey

Antwort

1

Sie könnten versuchen, die GetCommandLine API-Funktion aufrufen und dann das erste Byte auf 0 setzen Das heißt:

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

Ich weiß ehrlich nicht, ob das wird funktionieren oder was die möglichen Auswirkungen, aber es könnte einen Versuch wert sein.

+3

Ich habe das verifiziert. Es ist keine Arbeit. – Oleg

10

Ich nehme an, Sie haben den RTL_USER_PROCESS_PARAMETERS Teil der PEB Ihren Prozesses zu modifizieren (siehe http://en.wikipedia.org/wiki/Process_Environment_Block zum Beispiel und http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html). Sie können versuchen, NtQueryInformationProcess zu verwenden, um PEB zu erhalten. Dann können Sie ProcessParameters.CommandLine ändern. Ich hoffe, dass es funktionieren wird.

AKTUALISIERT: Ich verifizierte meinen Vorschlag. Es klappt. Das folgende Testprogramm demonstrieren dies:

#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; 
} 

Wenn wir das Programm mit einigen Parametern starten wir

alt text

statt der folgenden gesehen vor

alt text

+0

@Joe: Ich habe meine Antwort aktualisiert, um Ihnen die Verwendung von 'NtQueryInformationProcess' zu erleichtern. – Oleg

+0

Oleg, war schließlich in der Lage, dies zu versuchen (Win7-64), und es scheint vollständig zu funktionieren, wenn als Admin ausgeführt, aber wenn mit Standard-Benutzerberechtigungen ausgeführt wird, kann TaskManager immer noch die Befehlszeile anzeigen. Interessanterweise zeigt Process Explorer die übergebene Befehlszeile in keinem Berechtigungsszenario an. –

+0

@Joe: Sind Sie sicher, dass Sie den TaskManager-Prozess ** neu gestartet haben? – Oleg

2

Based sehen In Ihrem obigen Kommentar möchten Sie vielleicht überlegen, den geheimen Schlüssel über eine Umgebungsvariable zu übergeben. Wenn Sie den Schlüssel in der übergeordneten Prozessumgebung festlegen, wird er vom untergeordneten Prozess geerbt und ist für Außenstehende nicht so einfach sichtbar wie die Befehlszeile.

+1

Sie könnten sie in Process Explorer sehen. Sie könnten es nach dem Lesen auf einen Dummy-Wert setzen, nehme ich an – Anders