AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetCommandLine für fremde Anwendung

GetCommandLine für fremde Anwendung

Ein Thema von ringli · begonnen am 7. Feb 2008 · letzter Beitrag vom 15. Apr 2008
Antwort Antwort
Seite 2 von 2     12
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: GetCommandLine für fremde Anwendung

  Alt 9. Feb 2008, 09:57
Dank bitsetter's Hilfe konnte das Problem gelöst werden.
Im Anhang die Lösung in Form einer kleinen Demoanwendung. Getestet wurde der Code unter den folgenden Betriebssytemen:
  • XP32 --> funktioniert
  • Vista32 --> funktioniert
  • XP64 --> bei 32bit-Anwendungen funktioniert der Code, bei 64bit-Anwendungen funktioniert der Code allerdings nicht was vermutlich daran liegt das 32Bit-Anwendungen keinen Code in eine 64bit-Anwendung injizieren können. Oder hat jemand diesbezüglich einen anderen Wissensstand?
Angehängte Dateien
Dateityp: zip getcommandline_141.zip (10,6 KB, 32x aufgerufen)
  Mit Zitat antworten Zitat
iskywalker

Registriert seit: 12. Okt 2007
16 Beiträge
 
#12

Re: GetCommandLine für fremde Anwendung

  Alt 15. Apr 2008, 17:28
Vielleicht pointer größe?
(statt 32 64)
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#13

Re: GetCommandLine für fremde Anwendung

  Alt 15. Apr 2008, 19:39
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.
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#14

Re: GetCommandLine für fremde Anwendung

  Alt 15. Apr 2008, 20:02
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz