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/)
-   -   Delphi CreateProcess und uallHook.InjectLibrary (https://www.delphipraxis.net/110842-createprocess-und-uallhook-injectlibrary.html)

wicht 25. Mär 2008 20:10


CreateProcess und uallHook.InjectLibrary
 
Hallo Forum,

mal wieder eine Frage von mir.... Also, ich mache CreateProcess() und möchte dann mittels den schönen uall-Units eine DLL einschleusen (uallHook.InjectLibrary()).

Mein Code sieht so aus:
Delphi-Quellcode:
procedure MyCreateProcess(Filename: string);
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := 1;
  CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    StartupInfo,
    ProcessInfo);
  uallHook.InjectLibrary(ProcessInfo.dwProcessId, 'D:\hook.dll');
end;
Funktioniert meistens auch, aber eben nicht immer. Als mir das aufgefallen ist, habe ich einfach die Funktion 10 mal mit 'notepad.exe' aufgerufen und 10 mal mit 'sndvol32.exe', einfach nur zum testen. Es kommt dann teilweise vor, dass der Prozess gar nicht mehr startet. Teilweise kommt überhaupt kein Fenster, oder das Programm startet (sndvol32), macht ein "Beep" (keine Ahnung warum) und ist dann auch weg, ohne ein Fenster anzuzeigen.
Vielleicht könnte man das Problem lösen, indem man vor InjectLibrary() ein Sleep oder so packt, aber das ist unsauber und hilft mir auch nicht wirklich weiter, das Problem zu verstehen. Ich vermute einfach mal, dass der Thread (von CreateRemoteThread) den Start des Programms (sndvol32/notepad) irgendwie durcheinander bringt.
Aber was kann man dagegen tun und wo genau liegt das Problem?

Würde mich sehr über Antworten freuen.. :)

Gruß,
Alexander

brechi 26. Mär 2008 13:25

Re: CreateProcess und uallHook.InjectLibrary
 
denke eher es liegt an der hook.dll
mach mal ne cleane dll die nur mit MessageBoxA was anzeigt

wicht 27. Mär 2008 20:15

Re: CreateProcess und uallHook.InjectLibrary
 
Hi :)

Irgendwie habe ich gehofft, dass du dazu was sagst :-D ... Ich habe das natürlich sofort ausprobiert, allerdings hat das nicht weiter geholfen.

Delphi-Quellcode:
library Project1;

uses
  Windows;

begin
  MessageBox(0, 'x', 'x', MB_ICONINFORMATION);
end.
Das da oben ist die DLL. Auch wenn ich die MessageBox rausnehme, funktioniert es nicht. Ich teste es jetzt nur noch mit sndvol32.exe (XP/SP2), entweder das Teil startet oder es macht nur Beep und nix weiter passiert.
Ausserdem habe ich versucht, den Prozess mit CREATE_SUSPENDED zu erstellen, dann InjectLibrary() machen, dann ResumeThread().
Ist aber genau das selbe...

Ich würde mich sehr freuen, wenn das mal jemand selber ausprobieren würde. Oder wenn jemand so eine Erklärung dafür hat...


Einen schönen Abend noch, und vielen Dank erstmal :)

wido 27. Mär 2008 20:44

Re: CreateProcess und uallHook.InjectLibrary
 
Hmmm ... es wird definitiv damit zu tun haben, daß versucht wird die DLL zu injezieren, bevor der Prozess überhaupt vollständig initialisiert wurde. Nur weil CreateProcess beendet ist, heißt es ja nicht zwangsläufig, daß der Prozess bereits läuft.

Ich kenn die Routinen von uall nicht. Kannst mal die InjectLibrary API posten? Einfach nur um zu sehen wie die DLL injeziert wird.

wicht 29. Mär 2008 01:33

Re: CreateProcess und uallHook.InjectLibrary
 
Hi,

danke für deine Antwort :)
Also, es klappt nicht nur nicht mit uallHook, sondern auch mit einer anderen (einfacheren) Funktion. Es kommt aufs gleiche hinaus (Beep und Prozess ist weg), hier ist mal der Code:
Delphi-Quellcode:
function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: String):Boolean;
var
  hProc: Cardinal;
  oAlloc: Pointer;
  cWPM: Cardinal;
  hRemThread: Cardinal;
begin
  result := false;
  SetLastError(ERROR_SUCCESS);
  hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID);
  oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM);
  CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread);
  if GetLastError = ERROR_SUCCESS then
   result := true;
  CloseHandle(hProc);
end;
Der Code kommt von irgendwoher, ich schätze aber mal, dass der Code in Ordnung ist, weil das ganze sowohl mit dieser Funktion als auch mit uallHook funktioniert, wenn ich z.B. ein Sleep(500) zwischen CreateProcess() und die Inject-Funktion setze...

Eine andere Sache noch nebenbei: sndvol32 erstellt sein Fenster erst, wenn die MessageBox weggeklickt wurde. Sollte die MessageBox nicht sozusagen Zeitgleich mit dem Programmfenster erscheinen? Weil die doch in einem anderen Thread erstellt wird...?

Danke für Antworten und einen schönen Abend noch :stupid: ...

wido 29. Mär 2008 10:55

Re: CreateProcess und uallHook.InjectLibrary
 
Nunja, sicher, daß kernel32.dll bereits geladen ist, wenn Du versuchst zu injecten? Das würde erklären wieso es "plötzlich" funktioniert, sobald Du einen Moment wartest. Die Wahrscheinlichkeit ist höher, daß die DLL geladen wurde :).

Generell soll Deine Funktion ja die DLL laden, sobald der Prozess gestartet wurde. Entsprechend würde ich eher den EP des neuen Prozesses überschreiben mit nem einfachen LdrLoadDll. LdrLoadDll weil NTDLL.DLL die einzige DLL ist, die wirklich in jedem Prozess geladen ist. KERNEL32.DLL ist zwar in den meisten, aber noch längst nicht allen Prozessen vorhanden :).

wicht 29. Mär 2008 12:04

Re: CreateProcess und uallHook.InjectLibrary
 
Danke für Antwort :) !

Bevor ich jetzt anfange (lange) rumzuprobieren... Verstehe ich dich richtig, dass ich anstelle von LoadLibraryA() LdrLoadDll() benutzen soll? Das frage ich, weil ich keine 'Lust' habe rumzuprobieren, stundenlang, und es nichts bringt, weil ich dich nicht verstanden habe :lol: ...
Ich müsste nur zusehen, wie ich mit WriteProcessMemory die Parameter passend dahinschreiben kann. Vielleicht bekomme ich das hin, aber freuen würde ich mich trotzdem wahnsinnig, wenn mir da jemand noch einmal unter die Arme greifen würde.. So stark bin ich nämlich nicht in dieser Materie drin, dass ist ja schon was anderes als mal eben ein 'normales' Programm mit Delphi zusammen zu bauen...

Falls jemand (oder du *g*) noch einmal hilft wäre ich sehr dankbar!
Erstmal noch einen schönen Samstag :)

wido 29. Mär 2008 12:18

Re: CreateProcess und uallHook.InjectLibrary
 
Zitat:

Zitat von wicht
Bevor ich jetzt anfange (lange) rumzuprobieren... Verstehe ich dich richtig, dass ich anstelle von LoadLibraryA() LdrLoadDll() benutzen soll? Das frage ich, weil ich keine 'Lust' habe rumzuprobieren, stundenlang, und es nichts bringt, weil ich dich nicht verstanden habe :lol: ...

Ja und nein. Ich befürchte da jetzt etwas weiter ausholen zu müssen. Aber ich denke mal, das ist notwendig weil Du es ansonsten eher nicht verstehst ;).

Was passiert wenn Du einen Prozess startest? Vereinfacht gesagt, mapped Windows das Image (die Datei) der Anwendung in den Speicher, lädt evtl. statisch gelinkte Bibliotheken, initialisiert jede einzelne Bibliothek in der Reihenfolge ihrer Abhängigkeiten zu einander und springt dann erst an einen fix definierten Punkt innerhalb deiner Anwendung und fängt an die Befehle dort abzuarbeiten. Dieser definierte Punkt nennt sich Entry Point.

Ich empfehle Dir nun den Prozess SUSPENDED zu starten. Dann wird der Prozess bis zu dem Punkt vorbereitet, an dem die Ausführung am Entry Point beginnt. Dort änderst Du den Entry Point einfach, so daß bevor irgendetwas gemacht wird, ein LdrLoadDLL() ausgeführt wird, der deine Bibliothek lädt und DANN erst der Code am Original Entry Point ausgeführt wird.

Das hat mit deiner jetzigen Methode nicht viel zu tun, ist aber deutlich zuverlässiger, weil Du nur so sichergehen kannst, daß deine DLL geladen wird zu einem Zeitpunkt, an dem sie überhaupt geladen werden kann.

Zitat:

Zitat von wicht
Falls jemand (oder du *g*) noch einmal hilft wäre ich sehr dankbar!
Erstmal noch einen schönen Samstag :)

Naja, für was willst es denn benutzen? Prinzipiell lassen sich so problemlos hübsche Usermode Rootkits bauen. Das würd ich eher nicht unterstützen :P.

wicht 30. Mär 2008 23:54

Re: CreateProcess und uallHook.InjectLibrary
 
Hi, danke für deine Hilfe und die Erklärung.
Weil mir das alles etwas zu weit geht habe ich das Problem anders gelöst. Ich gehe einfach die vom Prozess geladenen Module durch, wenn die benötigten geladen sind injekte ich die DLL. Klappt erstmal, Problem gelöst :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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 by Thomas Breitkreuz