![]() |
GetCommandLine für fremde Anwendung
In meiner eigenen Anwendung kann ich über GetCommandLine den kompletten Kommandozeilenaufruf (also Pfad zur Anwendung inkl. evtl. vorhandener Parameter) erhalten.
Wie kann ich den kompletten Kommandozeilenaufruf für eine fremde Anwendung erhalten deren Fensterhandle ich habe? Ich habe jetzt schon stundenlang hier im Forum und bei Google gesucht, bin aber leider nicht fündig geworden. |
Re: GetCommandLine für fremde Anwendung
|
Re: GetCommandLine für fremde Anwendung
Danke für deine Antwort. Leider scheint der Code nicht zu funktionieren. Die Funktion gibt bei mir leider nur einen leeren String zurück. GetLastError gibt nur 0 (Der Vorgang wurde erfolgreich beendet) zurück.
|
Re: GetCommandLine für fremde Anwendung
:gruebel: Ich rufe die Funktion so auf:
Delphi-Quellcode:
und es wird kein leerer String zurückgegeben.
var
ProcId : DWORD; begin GetWindowThreadProcessID(..., @ProcId); ShowMessage(AufrufParameter(ProcId)); Was hast du denn eigentlich für ein OS? |
Re: GetCommandLine für fremde Anwendung
Hmmm... genauso hab ich es auch aufgerufen. :gruebel:
Ich habe es hier unter Vista getestet und da geht es definitiv nicht. Habe aber grade mal Tests in einer VM unter XP und XP64 durchgeführt. Unter XP funktioniert der Code, unter XP64 ist jedoch auch Fehlanzeige. |
Re: GetCommandLine für fremde Anwendung
Klingt so, als _sollte_ das nicht mehr funktionieren. Was passiert, wenn du deine Anwendung unter Vista mit Admin-Rechten startest und die fremde Anwendung mit normalen Rechten?
|
Re: GetCommandLine für fremde Anwendung
Funktioniert auch mit Admin-Rechten nicht. Folgendes habe ich ausprobiert:
- Meine Anwendung als Administrator gestartet, fremde Anwendung mit normalen Rechten. - Meine Anwendung als Administrator gestartet, fremde Anwendung als Administrator gestartet. |
Re: GetCommandLine für fremde Anwendung
Was noch gehen könnte wenn man mit Hilfe von Codeinjektion windows.GetCommandLine im fremden Prozess aufruft.
|
Re: GetCommandLine für fremde Anwendung
Wie funktioniert das denn mit Codeinjektion? Hast du da zufällig einen Codeschnippsel parat?
|
Re: GetCommandLine für fremde Anwendung
Parat wohl auch nicht gerade aber ich kann es ja heute mal ausprobieren ob es geht. Ansonsten kannst du mal nach
![]() |
Re: GetCommandLine für fremde Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
Dank bitsetter's Hilfe konnte das Problem gelöst werden. :thumb:
Im Anhang die Lösung in Form einer kleinen Demoanwendung. Getestet wurde der Code unter den folgenden Betriebssytemen:
|
Re: GetCommandLine für fremde Anwendung
Vielleicht pointer größe?
(statt 32 64) |
Re: GetCommandLine für fremde Anwendung
32 Bit Prozesse können keine Remote Threads in 64 Bit Prozessen erstellen. Allerdings gibt es dennoch Möglichkeiten der Code Injection.
Ansonsten würde ich von Code Injection die Finger lassen, wenn immer es geht. Prinzipiell kannst Du allein mit ReadProcessMemory die Command Line auslesen. Bei Interesse, kann ichs Dir mal auscoden. Könnte sein, daß es auch mit 64 Bit Prozessen funktioniert. Habs aber nie probiert, daher keine Ahnung. |
Re: GetCommandLine für fremde Anwendung
Ich habs einfach mal ausgecodet. Funktioniert übrigens für 64bit Prozesse leider nicht, da die PebBaseAddress für solche Prozesse nil ist. Evtl. gibts ne 64bit PEB Struktur. Ich werd nachher mal nachschauen. Kommt übrigens wie Du siehst komplett ohne Code Injection aus ;).
Delphi-Quellcode:
program GetCommandLineExDemo;
{$APPTYPE CONSOLE} uses JwaWinBase, JwaNative, JwaWinNt, JwaWinType, JwaPSAPI, JwaNtStatus; type PROCESS_BASIC_INFORMATION = packed record ExitStatus: DWORD; PebBaseAddress: Pointer; AffinityMask: DWORD; BasePriority: DWORD; UniqueProcessId: DWORD; InheritedUniquePID:DWORD; end; // Funktioniert nur für Windows NT basierte Systeme function GetCommandLineEx(PID : DWORD) : widestring; var ProcessHandle : THandle; ProcessBasicInfo : PROCESS_BASIC_INFORMATION; PEB : _PEB_W2K; ProcessParameters : RTL_USER_PROCESS_PARAMETERS; ReturnLength : DWORD; CommandLine : PWideChar; begin result := ''; ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID); if ProcessHandle <> 0 then begin // Schritt 1: Wir holen uns die PROCESS_BASIC_INFORMATION um den PEB zu lokalisieren if (NtQueryInformationProcess(ProcessHandle, ProcessBasicInformation, @ProcessBasicInfo, SizeOf(ProcessBasicInfo), @ReturnLength) = STATUS_SUCCESS) and (ReturnLength = SizeOf(ProcessBasicInfo)) then // Schritt 2: Wir lesen den PEB aus if ReadProcessMemory(ProcessHandle, ProcessBasicInfo.PebBaseAddress, @PEB, SizeOf(PEB), @ReturnLength) and (ReturnLength = SizeOf(PEB)) then // Schritt 3: Wir lesen die ProcessParameters aus if ReadProcessMemory(ProcessHandle, PEB.ProcessParameters, @ProcessParameters, SizeOf(ProcessParameters), @ReturnLength) and (ReturnLength = SizeOf(ProcessParameters)) then begin // Schritt 4: Wir lesen die Command Line aus GetMem(CommandLine, (ProcessParameters.CommandLine.Length + 1) * 2); if ReadProcessMemory(ProcessHandle, ProcessParameters.CommandLine.Buffer, CommandLine, ProcessParameters.CommandLine.Length * 2, @ReturnLength) then result := WideString(CommandLine); FreeMem(CommandLine); end; CloseHandle(ProcessHandle); end; end; var PIDs : array[0..1000] of DWORD; Needed : DWORD; i : Integer; begin EnumProcesses(@PIDs[0], 1001, Needed); for i := 0 to (Needed div 4) - 1 do writeln(PIDs[i], ' --> ', GetCommandLineEx(PIDs[i])); readln; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz