Es wird nur der Referenz-Counter erhöht von daher ist es bei der kernel32.dll egal (da sie soweiso nicht entladen werden kann egal wie oft man FreeLibrary darauf aufruft). Schöner wär es allerdings doch nur einmal LoadLibrary aufzurufen und dann FreeLibrary am Schluss wieder. Das gilt inbesondere für Dlls die Extra geladen werden (wie z.B. opengl32.dll). Bei der user32 / ntdll / kernel32 ist es aber im Grunde egal (user32 wenn es ein Window-Programm ist)).
LoadLibrary liefert in dem Sinne kein
Handle zurück, sondern nur die Speicheradresse der
DLL und erhöht den Loadcounter, wenn der bei 0 (oder wars -1??) ist wird die
Dll wieder entladen.
Zu deiner Frage: Wie sieht denn das TInjectDllData überhaupt aus?
Zu 99.9% wird TInjectDllData in das Zielprogramm geschrieben und dann per CreateRemoteThread ausgeführt. D.h. bei TInjectDllData handelt es sich um Assemblercode bei dem nur die Adressen vorher angepasst werden. Das ist für das Injeten aber ziemlich überflüssig! Es muss nur der String in das Zielprogramm gespeichert werden, dann kann CreateRemoteThread direkt auf LoadLibraryA /bzw. W) ausgeführt werden. Das funktioniert deshalb, weil ein Thread (genau wie LoadLibraryA) einen Parameter hat. Dieser Parameter (in dem Fall die Adresse des Strings) kann auch bei CRT angegeben werden. Man spart sich also das Schreiben des Assembler Codes in den ZielProzess.
InjectProgram:
Schreibe
DLL-String in Zielprozess
Rufe CRT im Zielprozess auf, wobei Start = LoadLibraryA und Parameter = Adresse des
Dll-Strings im Zielprozess
Warte bis Thread zu ende und gebe Speicher im Zielprozess wieder frei.
Dazu kannst du dir rauch mal meine Units anschauen da ist alles genauer erklärt. (uallCollection @ google bzw hier im Forum)
uallHook.InjectLibrary von
http://omorphia.cvs.sourceforge.net/...p&sortdir=down
PS: der Code ist super alt (2Jahre??) und mittlerweile eher schlecht, sieht man z.B. an der Version da net mal das
Handle vom Thread wieder geschlossen wird (hab aber schon seit ewigkeiten nicht mehr die Zeit die Bugs alle zu fixen, aber is ja OpenSource
)