![]() |
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:
Das Ergebnis des Debug-Outputs:
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;
Code:
pTargetMemory: True
pLoadLibraryA: True writtenBytes: 71 TID: 464 Exit Code: 0 LastError: 18 LastErrorMsg: Es sind keine weiteren Dateien vorhanden |
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. |
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: |
AW: DLL-Injection schlägt fehl
Man kann natürlich auch beide Varianten zur Verfügung stellen:
Delphi-Quellcode:
und hat eine automatische Umleitung (je nach Compiler), wenn man
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.
Delphi-Quellcode:
verwendet.
function InjectDll( TargetPID: DWORD; InjDLL: PChar ): Boolean;
|
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 02:13 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