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