Seite 1 von 1

DLL sich selbst entladen lassen

Verfasst: 02.03.2008 18:49
von Thorium
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? :wink:
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
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.