![]() |
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:
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.
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; 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 |
Re: CreateProcess und uallHook.InjectLibrary
denke eher es liegt an der hook.dll
mach mal ne cleane dll die nur mit MessageBoxA was anzeigt |
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:
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.
library Project1;
uses Windows; begin MessageBox(0, 'x', 'x', MB_ICONINFORMATION); end. 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 :) |
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. |
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:
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...
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; 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: ... |
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 :). |
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 :) |
Re: CreateProcess und uallHook.InjectLibrary
Zitat:
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:
|
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