DLL sich selbst entladen lassen
Verfasst: 02.03.2008 18:49
Aus meinem aktuellen kleinen Projekt ein Codeschnippsel der vieleicht dem ein oder anderem helfen kann, der mit DLL-Injection arbeitet.
Ein Problem bei der DLL-Injection ist, das die injizierte DLL sich nicht selbst entladen kann, oder etwas doch?
Der Codeschnippsel geht davon aus, das der DLL-Code in einem eigenen Thread läuft.
Als Parameter einfach den Namen der DLL angeben. Ist aber auch nicht schwer für eine Übergabe des Handles umzubauen.
Leider bleibt ein wenig Speicher im Prozess reserviert. Aber sollte sehr wenig sein.
Ein Problem bei der DLL-Injection ist, das die injizierte DLL sich nicht selbst entladen kann, oder etwas doch?

Der Codeschnippsel geht davon aus, das der DLL-Code in einem eigenen Thread läuft.
Code: Alles auswählen
Procedure SelfUnloadModule(SelfModuleName.s)
Define.l NewProcAddr,ProcSize,hKernel32,hSelfModule,FreeLibraryAddr,ExitThreadAddr
ProcSize = ?SelfUnloadProcEnd - ?SelfUnloadProcStart
NewProcAddr = VirtualAlloc_(0,ProcSize,#MEM_COMMIT | #MEM_RESERVE,#PAGE_EXECUTE_READWRITE)
CopyMemory(?SelfUnloadProcStart,NewProcAddr,ProcSize)
hSelfModule = GetModuleHandle_(SelfModuleName)
hKernel32 = GetModuleHandle_("kernel32.dll")
FreeLibraryAddr = GetProcAddress_(hKernel32,"FreeLibrary")
ExitThreadAddr = GetProcAddress_(hKernel32,"ExitThread")
!jmp dword[p.v_NewProcAddr]
SelfUnloadProcStart:
!mov eax,dword[p.v_FreeLibraryAddr]
!mov ebx,dword[p.v_hSelfModule]
!push ebx
!call eax
!mov eax,dword[p.v_ExitThreadAddr]
!xor ebx,ebx
!push ebx
!call eax
SelfUnloadProcEnd:
EndProcedure
Leider bleibt ein wenig Speicher im Prozess reserviert. Aber sollte sehr wenig sein.