AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL-Injection schlägt fehl

Ein Thema von mh166 · begonnen am 18. Mai 2015 · letzter Beitrag vom 18. Mai 2015
Antwort Antwort
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

DLL-Injection schlägt fehl

  Alt 18. Mai 2015, 11:36
Hallo Leute,

ich versuche derzeit eine kleine DLL in einen anderen Prozess zu injizieren. Diese soll dann die API-Funktion TextOutA() hooken und schickt mir die Parameter des Aufrufs an meine Anwendung. Leider schaffe ich es nicht, diese DLL in den Zielprozess einzubinden.

Die DLL funktioniert ganz tadellos. Hab ich mit einer kleinen Testanwendung geprüft: dort habe ich, um die Injizierung nachzustellen, die DLL mit LoadLibraryA geladen und kann sie mit FreeLibrary wieder entladen. Delphi zeigt mir im Debug-Log dann jeweils die Info, dass ein Modul geladen/entladen wurde. Der Hook funktioniert dann ebenfalls ohne Probleme.

Wenn ich nun versuche die DLL mit folgender Funktion von extern in den Prozess zu schieben, scheiiint alles zu funktionieren. Allerdings kann ich mit Process Explorer sehen, dass die DLL dann nicht in der Anwendung geladen ist. Auch funktioniert der Hook nicht (was ohne DLL ja logisch ist...). Und Delphi selbst, zeigt mir im Debug-Log an, dass zwar in meiner Testanwendung ein Thread gestartet wurde (sh. CreateRemoteThread), dieser endet allerdings augenblicklich wieder. Ohne ein Modul geladen zu haben.

Hat von euch einer noch eine Idee, woran das nun scheitert? Sitze inzwischen zwei Tage und komm einfach nicht weiter. Vermutlich ist es was ganz simples, aber ich find es einfach nicht.

Infos am Rande: geschrieben mit XE2, 32bit Anwendung erzeugt, sowohl unter Win7 mit 32bit wie auch mit 64bit versucht --> beide male kein Erfolg.

Vielen Dank schonmal für eure dringend benötigte Hilfe!

mfg, mh166

Delphi-Quellcode:
  function InjectDll(TargetPID: DWORD; InjDLL: PChar): Boolean;
  var
    hProcess, lenDLL, hThread, tExitCode: DWord;
    pTargetMemory, pLoadLibraryA: Pointer;
    writtenBytes, TID: NativeUInt;
  begin
    Result := False;

    hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, TargetPID);
    lenDLL := Length(InjDLL)+1;
    pTargetMemory := VirtualAllocEx(hProcess,nil, lenDLL, MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    pLoadLibraryA := GetProcAddress(GetModuleHandleA(kernel32),'LoadLibraryA');
    if (InjDLL <> nil) and (pTargetMemory <> nil) and (pLoadLibraryA <> nil) then
    begin
      if WriteProcessMemory(hProcess, pTargetMemory, InjDLL, lenDLL, writtenBytes) then
      begin
        if (writtenBytes = lenDLL) then
        begin
          TID := CreateRemoteThread(hProcess, nil, 0, pLoadLibraryA, pTargetMemory, 0, hThread);
          Result := TID <> 0;
          if TID > 0 then
          begin
            WaitForSingleObject(TID, INFINITE);
            GetExitCodeThread(TID, tExitCode);
            CloseHandle(TID);
          end;
        end;
      end;
    end;
    CloseHandle(hProcess);

    // Debug-Infos
    ShowMessage('pTargetMemory: ' + BoolToStr(pTargetMemory<>nil, true) + sLineBreak +
                'pLoadLibraryA: ' + BoolToStr(pLoadLibraryA<>nil, true) + sLineBreak +
                'writtenBytes: ' + IntToStr(writtenBytes) + sLineBreak +
                'TID: ' + IntToStr(TID) + sLineBreak +
                'Exit Code: ' + IntToStr(tExitCode) + sLineBreak +
                'LastError: ' + IntToStr(GetLastError) + sLineBreak +
                'LastErrorMsg: ' + SysErrorMessage(GetLastError)
               );
  end;
Das Ergebnis des Debug-Outputs:
Code:
pTargetMemory: True
pLoadLibraryA: True
writtenBytes: 71
TID: 464
Exit Code: 0
LastError: 18
LastErrorMsg: Es sind keine weiteren Dateien vorhanden
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: DLL-Injection schlägt fehl

  Alt 18. Mai 2015, 11:47
Wenn du einen PChar übergibst (Widestring) solltest du auch LoadLibraryW benutzen.
Ansonsten sieht alles gut aus. Ich denke der LoadLibrary Aufruf im remote Thread schlägt deswegen fehl.
(Und du musst lenDLL * 2 Bytes schreiben wenn du PChar nimmst).

Oder du übergibst an InjectDll direkt einen PAnsichar. Das sollte auch gehn.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (18. Mai 2015 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: DLL-Injection schlägt fehl

  Alt 18. Mai 2015, 12:12
Oha, das könnte es natürlich sein. Wenn ich für die doppelte Länge vom String nur die einfache Länge reserviere ... kann er ja die DLL nicht finden.

Ich probier das dann gleich mal, sobald ich wieder am Rechner bin. Schonmal vielen Dank für den (vermutlich bahnbrechenden) Hinweis.
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: DLL-Injection schlägt fehl

  Alt 18. Mai 2015, 12:37
Man kann natürlich auch beide Varianten zur Verfügung stellen:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows;

function InjectDll( TargetPID: DWORD; InjDLL: PChar ): Boolean;
function InjectDllA( TargetPID: DWORD; InjDLL: PAnsiChar ): Boolean;
function InjectDllW( TargetPID: DWORD; InjDLL: PWideChar ): Boolean;

implementation

function InjectDllA( TargetPID: DWORD; InjDLL: PAnsiChar ): Boolean;
begin

end;

function InjectDllW( TargetPID: DWORD; InjDLL: PWideChar ): Boolean;
begin

end;

function InjectDll( TargetPID: DWORD; InjDLL: PChar ): Boolean;
begin
{$IFDEF UNICODE}
  Result := InjectDllW( TargetPID, InjDLL );
{$ELSE}
  Result := InjectDllA( TargetPID, InjDLL );
{$ENDIF}
end;

end.
und hat eine automatische Umleitung (je nach Compiler), wenn man function InjectDll( TargetPID: DWORD; InjDLL: PChar ): Boolean; verwendet.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: DLL-Injection schlägt fehl

  Alt 18. Mai 2015, 12:42
@Neutral General: Daaaaankeeeee!!! Es funktioniert endlich!

Was so ein doofes P[Wide]Char doch ins Handwerk pfuschen kann.

@Sir Rufo: Kann man. Sicherlich. Vor allem, wenn man denn weiß, wo genau das Problem war. Allerdings ist das ja nur ne Funktion in meinem Programm. Da ist mir der Compiler ja bekannt. Und ich gehe nicht davon aus, dass sich dort etwas ändert. Zumindest nicht weg von Unicode. Aber dennoch danke für den Tipp.


Ich weiß schon, warum ich immer wieder hier her zurückkomme!
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 18:44 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