Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   DLL-Injection schlägt fehl (https://www.delphipraxis.net/185130-dll-injection-schlaegt-fehl.html)

mh166 18. Mai 2015 10:36

DLL-Injection schlägt fehl
 
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

Neutral General 18. Mai 2015 10:47

AW: DLL-Injection schlägt fehl
 
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.

mh166 18. Mai 2015 11:12

AW: DLL-Injection schlägt fehl
 
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. :pale:

Ich probier das dann gleich mal, sobald ich wieder am Rechner bin. Schonmal vielen Dank für den (vermutlich bahnbrechenden) Hinweis. :stupid:

Sir Rufo 18. Mai 2015 11:37

AW: DLL-Injection schlägt fehl
 
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
Delphi-Quellcode:
function InjectDll( TargetPID: DWORD; InjDLL: PChar ): Boolean;
verwendet.

mh166 18. Mai 2015 11:42

AW: DLL-Injection schlägt fehl
 
@Neutral General: Daaaaankeeeee!!! :-D:-D:-D Es funktioniert endlich! :)

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

@Sir Rufo: Kann man. Sicherlich. Vor allem, wenn man denn weiß, wo genau das Problem war. :lol: 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!:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 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