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.