Einzelnen Beitrag anzeigen

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