Abrufen einer anderen Prozessbefehlszeile in Windows

8

Ich versuche eine andere Prozess-Kommandozeile zu bekommen (auf WinXP 32bit). Ich mache folgendes:

%Vor%

Nach dem ersten Aufruf ist pbi.UniqueProcessID korrekt. Aber nach dem Aufruf von ZwReadVirtualMemory bekomme ich die Befehlszeile für meinen Prozess, nicht angefordert.

Ich habe auch ReadProcessMemore & amp; NtQueryInformationProcess, aber das gleiche Ergebnis erhalten.

Kann jemand helfen?

Hier Ссылка wird gesagt, dass dieser Code funktioniert. Leider habe ich keinen Zugang zum Posten in diesem Forum, um sich selbst zu fragen.

    
Georg 30.06.2011, 06:04
quelle

5 Antworten

4

Duplizieren von Wie kann man einen laufenden Prozess für seine Parameterliste abfragen? (Windows, C ++) , also kopiere ich einfach meine Antwort von hier:

Sie können nicht zuverlässig diese Informationen abrufen. Es gibt verschiedene Tricks, um es zu versuchen und abzurufen, aber es gibt keine Garantie, dass der Zielprozess diesen Speicherbereich nicht schon gemangelt hat. Raymond Chen hat das eine Weile auf The Old New Thing besprochen. p>     

Jon 01.07.2011, 14:12
quelle
8

Es sieht so aus, als ob ZwReadVirtualMemory nur einmal aufgerufen wird. Das ist nicht genug. Es muss für jede Ebene der Zeigerumleitung aufgerufen werden. Mit anderen Worten, wenn Sie einen Zeiger abrufen, zeigt er auf den Adressraum des anderen Prozesses. Sie können es nicht direkt lesen. Sie müssen ZwReadVirtualMemory erneut aufrufen. Für den Fall dieser Datenstrukturen muss ZwReadVirtualMemory 3 mal aufgerufen werden: einmal um PEB zu lesen (das ist, was der Code oben tut), einmal um RTL_USER_PROCESS_PARAMETERS zu lesen und einmal um den UNICODE_STRING Puffer zu lesen. Das folgende Codefragment funktionierte für mich (die Fehlerbehandlung wurde aus Gründen der Übersichtlichkeit weggelassen und ich verwendete die dokumentierte ReadProcessMemory-API anstelle von ZwReadVirtualMemory):

%Vor%

Warum sehen wir die Befehlszeile unseres eigenen Prozesses? Denn Prozesse sind ähnlich angelegt. Befehlszeile und PEB-bezogene Strukturen haben wahrscheinlich die gleichen Adressen. Also, wenn Sie ReadProcessMemory verpasst haben, enden Sie genau mit der Befehlszeile des lokalen Prozesses.

    
glagolig 15.11.2012 23:38
quelle
4

Ich habe versucht, dasselbe mit mingw & amp; Qt. Ich stieß auf ein Problem mit "undefinierter Referenz auf CLSID_WbemLocator". Nach einigen Nachforschungen scheint es, dass die Version von libwbemuuid.a, die in meiner Version von mingw enthalten war, nur IID_IWbemLocator, aber nicht CLSID_WbemLocator definiert hat.

Ich habe festgestellt, dass CLSID_WbemLocator manuell definiert wird (obwohl es wahrscheinlich nicht die "richtige" Vorgehensweise ist).

Der endgültige Arbeitscode:

%Vor%

und in meiner Qt-Projektdatei (.pro) verlinke ich zu folgenden Bibliotheken:

%Vor%     
bruceceng 19.11.2013 21:10
quelle
3

Sie müssen disziplinierter vorgehen, wenn Sie Rückkehrcodes überprüfen. Es kann sein, dass jeder Ihrer ZwReadVirtualMemory -Aufrufe einen Fehlercode ergibt, der Sie in die richtige Richtung weist.

Insbesondere schlägt der ProcList.proc_id_as_numbers[i] -Teil vor, dass Sie diesen Code in einer Schleife ausführen. Es ist möglich, dass die procPeb.ProcessParameters -Struktur immer noch mit den Werten einer früheren Schleifeniteration gefüllt ist - und da der Aufruf ZwReadVirtualMemory für Ihren Zielprozess fehlschlägt, sehen Sie die Befehlszeile des zuvor abgefragten Prozesses.

    
Frerich Raabe 30.06.2011 08:27
quelle
1

Sie müssen dazu nicht die VM des Zielprozesses lesen. Stellen Sie nur sicher, dass Sie die richtige Prozess-ID für den Zielprozess haben.

Sobald Sie den Prozess-Handle über OpenProcess haben, können Sie verwenden NtQueryInformationProcess , um detaillierte Prozessinformationen zu erhalten. Verwenden Sie die ProcessBasicInformation-Option, um das PEB des Prozesses abzurufen - das enthält einen anderen Strukturzeiger RTL_USER_PROCESS_PARAMETERS , durch die Sie die Befehlszeile erhalten können.

    
Steve Townsend 30.06.2011 14:05
quelle