2016-07-11 10 views
6

Ist es möglich, die Startinformationen eines anderen laufenden Prozesses zu erhalten? Ich möchte herausfinden, die cmd Zeilenargumente, wenn es minimiert/maximiert ausgeführt werden sollte, starten Sie im Verzeichnis, führen Sie als Administrator usw.Get STARTUPINFO für gegebenen Prozess

+1

1. Code in den Zielprozess injizieren. 2. Rufen Sie 'GetStartupInfo()' und 'GetCommandLine()' aus dem Kontext des Zielprozesses auf. 3. Übergeben Sie die Daten an den ursprünglichen Prozess zurück. –

+0

@ JonathanPotter danke für Ihren Kommentar. Der Zweck besteht darin, dem Benutzer die Möglichkeit zu geben, Prozesse (mit den richtigen Startup-Attributen) durch Klicken auf eine Schaltfläche zu starten. Das Injizieren von Code, um die richtigen Startup-Attribute zu bekommen, wäre von Antiviren-Programmen verdächtig/markiert, nicht wahr? –

+3

@JakeM: Die Befehlszeile eines Prozesses kann abgerufen werden, ohne die Injektion zu verwenden, entweder durch [Lesen der PEB-Struktur des Prozesses] (http://stackoverflow.com/a/11042947/65863) oder mithilfe von [WMI] (https : //blogs.msdn.microsoft.com/oldnewthing/20091125-00/? p = 15923). –

Antwort

2

müssen Sie RTL_USER_PROCESS_PARAMETERS von Remote-Prozess lesen. Dies kann wie folgt durchgeführt werden:

NTSTATUS GetProcessParameters(PCLIENT_ID pcid, PUNICODE_STRING CommandLine) 
{ 
    HANDLE hProcess; 
    NTSTATUS status; 

    static OBJECT_ATTRIBUTES zoa = { sizeof(zoa)}; 

    if (0 <= (status = ZwOpenProcess(&hProcess, PROCESS_VM_READ|PROCESS_QUERY_INFORMATION, &zoa, pcid))) 
    { 
     PROCESS_BASIC_INFORMATION pbi; 
     _RTL_USER_PROCESS_PARAMETERS ProcessParameters, *pv; 
     if (0 <= (status = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), 0))) 
     { 
      if (
       (0 <= (status = ZwReadVirtualMemory(hProcess, (_PEB*)&pbi.PebBaseAddress->ProcessParameters, &pv, sizeof(pv), 0))) 
       && 
       (0 <= (status = ZwReadVirtualMemory(hProcess, pv, &ProcessParameters, sizeof(ProcessParameters), 0))) 
       ) 
      { 
       if (ProcessParameters.CommandLine.Length) 
       { 
        if (CommandLine->Buffer = (PWSTR)LocalAlloc(0, ProcessParameters.CommandLine.Length + sizeof(WCHAR))) 
        { 
         if (0 > (status = ZwReadVirtualMemory(hProcess, ProcessParameters.CommandLine.Buffer, CommandLine->Buffer, ProcessParameters.CommandLine.Length, 0))) 
         { 
          LocalFree(CommandLine->Buffer); 
         } 
         else 
         { 
          CommandLine->MaximumLength = (CommandLine->Length = ProcessParameters.CommandLine.Length) + sizeof(WCHAR); 
          *(PWSTR)RtlOffsetToPointer(CommandLine->Buffer, ProcessParameters.CommandLine.Length) = 0; 
         } 
        } 
        else 
        { 
         status = STATUS_INSUFFICIENT_RESOURCES; 
        } 
       } 
      } 
     } 
     ZwClose(hProcess); 
    } 
    return status; 
} 
    UNICODE_STRING CommandLine; 
    if (0 <= GetProcessParameters(&cid, &CommandLine)) 
    { 
     DbgPrint("CommandLine=%wZ\n", &CommandLine); 
     LocalFree(CommandLine.Buffer); 
    } 
+0

Dies hilft nicht, STARTUPINFO zu bekommen, was die eigentliche Frage war. –

+0

Suchen Sie bitte nach STARTUPINFO Feldern und RTL_USER_PROCESS_PARAMETERS Feldern - das ist fast gleich. wirklich STARTUPINFO ist gefüllt von RTL_USER_PROCESS_PARAMETERS – RbMm

+1

Wahrscheinlich erwähnenswert, dass die Dokumentation sagt: "Die ZwQueryInformationProcess-Funktion und die Strukturen, die es zurückgibt, sind intern im Betriebssystem und unterliegen Änderungen von einem Release von Windows zu einem anderen. Um die Kompatibilität Ihrer Anwendung zu erhalten Es ist besser, stattdessen öffentliche Funktionen zu verwenden, die in der Beschreibung des Parameters ProcessInformationClass erwähnt werden. " – theB

Verwandte Themen