DLL Inject / Eject

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

DLL Inject / Eject

Beitrag von Josh »

Für Inject habe ich hier im Forum einiges an Code gefunden, leider aber nichts für Eject. Vielleicht war ich auch nur zu blöd zum suchen. Sollte es jemand mal brauchen, hier mal ein Beispielcode:

Code: Alles auswählen

EnableExplicit

#Window     = 0
#Combo      = 0
#BtnInject  = 1
#BtnEject   = 2
#BtnUpdate  = 3

#TextSelect = "Bitte wählen ..."
#PathDll    = "D:\Programmieren\PureBasic Versuche\Injektion\"

Procedure.i CodeInject   (WndName.s, DllName.s)
  Define hWnd        .i
  Define hProcess    .i
  Define IdProcess   .i
  Define hKernel32   .i
  Define pLoadLibrary.i
  Define pDllName    .i
  Define lenDllName  .i
  Define lenWritten  .i
  Define hThread     .i
  Define ret         .i
  Define msg         .s

 ;Prüfen ob File vorhanden und ob es sich um eine DLL handelt
  If FileSize (DllName) < 0 Or UCase (GetExtensionPart (DllName)) <> "DLL"
    msg = "Die vorgegebene Datei ist keine DLL"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeNothing
  EndIf

 ;Handle auf Fenster holen
  hWnd = FindWindow_(0, WndName)
  If hWnd = 0
    msg = "Das folgende Fenster konnte nicht gefunden werden" + #CRLF$
    msg + WndName
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeNothing
  EndIf

 ;Handle auf den fremden Prozess holen
  GetWindowThreadProcessId_(hWnd, @IdProcess)
  hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, IdProcess)
  If hProcess = 0
    msg = "Handle auf Prozess nicht gefunden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeNothing
  EndIf

 ;Funktionszeiger auf LoadLibraryA holen
  hKernel32    = OpenLibrary (#PB_Any, "Kernel32.dll")
  pLoadLibrary = GetFunction (hKernel32, "LoadLibraryA")
  If pLoadLibrary = 0
    msg = "Funktion LoadLibrary konnte nicht gefunden werden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeLibrary
  EndIf

 ;Namen der DLL in fremden Prozess schreiben
  lenDllName = Len (DllName) + 1
  pDllName = VirtualAllocEx_(hProcess, 0, lenDllName, #MEM_COMMIT | #MEM_RESERVE, #PAGE_READWRITE)
  WriteProcessMemory_(hProcess, pDllName, DllName, lenDllName, @lenWritten)
  If lenWritten <> lenDllName
    msg = "Der DLL Name konnte nicht in den fremden Prozess geschrieben werden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeVirtual
  EndIf

 ;CreateRemoteThread ausführen
  hThread = CreateRemoteThread_(hProcess, 0, 0, pLoadLibrary, pDllName, 0, 0)
  WaitForSingleObject_(hThread, #INFINITE)
  If hThread
    CloseHandle_(hThread)
    hThread = 0
  Else
    msg = "CreateRemoteThread konnte nicht ausgeführt werden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeVirtual
  EndIf

 ;Rückgabewert wenn erfolgreich
  ret = #True

 ;Freigaben
  FreeVirtual: VirtualFreeEx_(hProcess, pDllName, 0, #MEM_RELEASE)
  FreeLibrary: CloseLibrary  (hKernel32)
  FreeProcess: CloseHandle_  (hProcess)
  FreeNothing:

  ProcedureReturn ret

EndProcedure
Procedure.i CodeEject    (WndName.s, DllName.s)
  Define DllDesc     .MODULEENTRY32
  Define hWnd        .i
  Define IdProcess   .i
  Define hProcess    .i
  Define hKernel32   .i
  Define pFreeLibrary.i
  Define hSnapshot   .i
  Define IsNewContent.i
  Define DllPathTemp .s
  Define hThread     .i
  Define cnt         .i
  Define ret         .i
  Define msg         .s

 ;Prüfen ob File vorhanden und ob es sich um eine DLL handelt
  If FileSize (DllName) < 0 Or UCase (GetExtensionPart (DllName)) <> "DLL"
    msg = "Die vorgegebene Datei ist keine DLL"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeNothing
  EndIf

 ;Handle auf Fenster holen
  hWnd = FindWindow_(0, WndName)
  If hWnd = 0
    msg = "Das folgende Fenster konnte nicht gefunden werden" + #CRLF$
    msg + WndName
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeNothing
  EndIf

 ;Handle auf den fremden Prozess holen
  GetWindowThreadProcessId_(hWnd, @IdProcess)
  hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, IdProcess)
  If hProcess = 0
    msg = "Handle auf Prozess nicht gefunden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeNothing
  EndIf

 ;Funktionszeiger auf FreeLibrary holen
  hKernel32    = OpenLibrary (#PB_Any, "Kernel32.dll")
  pFreeLibrary = GetFunction (hKernel32, "FreeLibrary")
  If pFreeLibrary = 0
    msg = "Funktion FreeLibrary konnte nicht gefunden werden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeProcess
  EndIf

 ;Snapshot erstellen
  hSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, IdProcess)
  If hSnapshot = #INVALID_HANDLE_VALUE
    msg = "Snapshot konnte nicht erstellt werden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeLibrary
  EndIf

 ;Alle geladenen Dll's durchlaufen und eigene suchen
  DllDesc\dwSize = SizeOf (MODULEENTRY32)
  IsNewContent = Module32First_(hSnapshot, @DllDesc)
  While IsNewContent = #True
Debug PeekS (@DllDesc\szExePath[0])
    DllPathTemp = PeekS (@DllDesc\szExePath[0])
    If UCase (DllPathTemp) = UCase (DllName)
      Break
    EndIf
    IsNewContent = Module32Next_(hSnapshot, @DllDesc)
  Wend
  If IsNewContent = #False
    msg = GetFilePart (DllName) + " ist nicht enthalten"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    Goto FreeSnapshot
  EndIf

 ;Alle Instanzen der DLL entfernen
  For cnt = 1 To DllDesc\GlblcntUsage
    hThread = CreateRemoteThread_(hProcess, 0, 0, pFreeLibrary, DllDesc\hModule, 0, 0)
    WaitForSingleObject_(hThread, #INFINITE)
    If hThread
      CloseHandle_(hThread)
      hThread = 0
    Else
      msg = "CreateRemoteThread konnte nicht ausgeführt werden"
      MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
      Goto FreeSnapshot
    EndIf
  Next

 ;Rückgabewert wenn erfolgreich
  ret = #True

 ;Freigaben
  FreeSnapshot: CloseHandle_ (hSnapshot)
  FreeLibrary : CloseLibrary (hKernel32)
  FreeProcess : CloseHandle_ (hProcess)
  FreeNothing:

  ProcedureReturn ret

EndProcedure

Procedure.s GetProcessor (WndName.s)

  WndName = StringField (WndName, 2, "(")
  WndName = StringField (WndName, 1, ")")

  ProcedureReturn WndName

EndProcedure
Procedure   UpdateCombo  ()
  NewList PbWindows.s()
  Define  WndName  .s{100}
  Define  hWnd     .i
  Define  msg      .s

 ;Fensternamen der Pb-Fenster in List sammeln
  hWnd = GetWindow_(GetDesktopWindow_(), #GW_CHILD)
  While hWnd
   ;Fenster muss mit "PureBasic" beginnen
    GetWindowText_(hWnd, @WndName, 98)
    If Left (WndName, 9) = "PureBasic"
     ;Fenster muss (x86) oder (x64) enthalten
      If GetProcessor (WndName) = "x86" Or GetProcessor (WndName) = "x64"
       ;Fensternamen der List hinzufügen
        AddElement (PbWindows())
        PbWindows() = WndName
      EndIf
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  Wend

 ;Alte Einträge in Combobox löschen
  ClearGadgetItems (#Combo)

 ;Gadgets aktivieren/deaktivieren
  Select ListSize (PbWindows())
    Case 0
      DisableGadget (#Combo    , #True)
      DisableGadget (#BtnInject, #True)
      DisableGadget (#BtnEject , #True)
    Case 1
      DisableGadget (#Combo    , #True)
      DisableGadget (#BtnInject, #False)
      DisableGadget (#BtnEject , #False)
    Default
      AddGadgetItem (#Combo, -1, #TextSelect)
      DisableGadget (#Combo    , #False)
      DisableGadget (#BtnInject, #True)
      DisableGadget (#BtnEject , #True)
  EndSelect

 ;Einträge der Combobox hinzufügen
  ForEach PbWindows()
    AddGadgetItem (#Combo, -1, PbWindows())
  Next
  SetGadgetState(#Combo, 0)
  SetActiveGadget(#BtnInject)

EndProcedure
Procedure   Main         ()
  Define DllName.s
  Define msg    .s

 ;Prüfen ob Programm nicht in Unicode compiliert
  If #PB_Compiler_Unicode
    msg = "Das Programm darf nicht in Unicode compiliert werden"
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    End
  EndIf

 ;Prüfen ob der angegebene Pfad existiert
  If FileSize (#PathDll) <> -2
    msg = "Der angegebenen Pfad für die Dll existiert nicht" + #CRLF$ + #CRLF$
    msg + #PathDll
    MessageRequester ("Inject / Eject", msg, #MB_ICONERROR)
    End
  EndIf

 ;Fenster erstellen
  OpenWindow     (#Window   ,   0,  0, 300, 100, "Inject / Eject", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  ComboBoxGadget (#Combo    ,  20, 20, 260,  21)
  ButtonGadget   (#BtnInject,  20, 60,  80,  24, "Inject")
  ButtonGadget   (#BtnEject , 110, 60,  80,  24, "Eject")
  ButtonGadget   (#BtnUpdate, 200, 60,  80,  24, "Update")

 ;Combobox füllen
  UpdateCombo()

  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_CloseWindow
        End

      Case #PB_Event_Gadget

        Select EventGadget()

          Case #Combo
            If EventType() = #PB_EventType_Change
              If GetGadgetText (#Combo) = #TextSelect
                DisableGadget (#BtnInject, #True)
                DisableGadget (#BtnEject , #True)
              Else
                DisableGadget (#BtnInject, #False)
                DisableGadget (#BtnEject , #False)
              EndIf
            EndIf

          Case #BtnInject
            Select GetProcessor (GetGadgetText (#Combo))
              Case "x86" : DllName = #PathDll + "IdeHook32.dll"
              Case "x64" : DllName = #PathDll + "IdeHook64.dll"
            EndSelect
            CodeInject (GetGadgetText (#Combo), DllName)

          Case #BtnEject
            Select GetProcessor (GetGadgetText (#Combo))
              Case "x86" : DllName = #PathDll + "IdeHook32.dll"
              Case "x64" : DllName = #PathDll + "IdeHook64.dll"
            EndSelect
            CodeEject (GetGadgetText (#Combo), DllName)

          Case #BtnUpdate
            UpdateCombo()

      EndSelect

    EndSelect

  ForEver

EndProcedure

Main ()
2013.03.13 01:32Code zum Suchen des Prozessors x64 oder x86 geändert
Zuletzt geändert von Josh am 13.03.2013 02:32, insgesamt 2-mal geändert.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: DLL Inject / Eject

Beitrag von Thorium »

Nett, ich habs immer so gemacht, dass die DLL sich selbst entläd.
Dafür gibts die API-Funktion FreeLibraryAndExitThread.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: DLL Inject / Eject

Beitrag von uweb »

Hallo,

nach sehr langer Zeit bin ich auch mal wieder hier.
Die fehlende Zeit ist mein Problem und der Grund weshalb ich wohl nie aus dem Anfäger-Status heraus komme.

Ich sehe schon einen Vorteil in Josh's Methode. Auf die Art muss das fremde Programm nicht bis zum Schluß gehhookt bleiben. Ich frage mich aber was passiert wenn der Injector vor dem fremden Programm beendet wird.

Selbst ausprobieren kann ich es nicht, weil ich meine alte DLL nicht angepasst bekomme. Nach dem Inject funktioniert damit der Hook. Der Eject scheint auch zu funktionieren. Zumindest meckert er wenn ich ihn mehrmals aufrufe. Beim anschließenden Aufruf der ehemals gehhookten Funktion kommt es dann aber zum Absturz des Programms. Einfach nur den unhook aus DetachProcess zu entfernen reicht aber nicht.

Könntest Du bitte noch den Source für die passende DLL nachschieben ?

Noch eine Verständnisfrage :
Kann man LoadLibraryA aus der kernel32.dll auch für 64Bit-Hook-DLL's benutzen?

DANKE !
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: DLL Inject / Eject

Beitrag von Josh »

uweb hat geschrieben:Ich frage mich aber was passiert wenn der Injector vor dem fremden Programm beendet wird.
Gar nichts passiert. Du kannst InjectEject jederzeit wieder aufrufen und wenn du das selbe Programm auswählst, kannst du die DLL wieder entfernen. Inject und Eject sind unabhängige Prozeduren.
Mit Eject kannst du einem Prozess im Prinzip jede DLL austreiben die du willst. Was dann allerdings passiert, ist ein anderes Kapitel.
uweb hat geschrieben:Einfach nur den unhook aus DetachProcess zu entfernen reicht aber nicht.
Wenn du alles, was du 'angestellt' hast im DetachProcess wieder entfernst, gibt es auch keine Probleme. Hook entfernen, Verweise freigeben oder was du sonst gemacht hast. Bist du dir sicher, dass du den Hook im AttachProcess richtig gesetzt hast? Bin mir nicht ganz sicher wie das abläuft, aber anscheinend läuft der AttachProcess in einem anderen Thread. Ich hole mir im AttachProcess nur das Handle auf das Hauptfenster und setze einen Timer der eine Prozedur startet. Erst in dieser Timerprozedur mach ich meine Aktionen für den Start.
uweb hat geschrieben:Könntest Du bitte noch den Source für die passende DLL nachschieben ?
Nö, der Code in der DLL hat nichts mit den beiden Funktionen Inject/Eject zu tun. Meine DLL ist noch eine Baustelle :mrgreen:
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: DLL Inject / Eject

Beitrag von uweb »

Ich bin mir noch weniger sicher wie das abläuft.
Es ist auch schon eine Weile her, dass ich mich damit beschäftigt habe.
Um so mehr bin ich für's Teilen und jede Info dankbar!


Tatsächlich setze ich den Hook ohne weiteres im AttachProcess :

Code: Alles auswählen

ProcedureDLL AttachProcess(Instance)
  Protected *OldAddress
  Protected *NewAddress
  
  Library = OpenLibrary(#PB_Any, "user32.dll")
  If Library
    *OldAddress = GetFunction(Library, "MessageBoxA")
    *NewAddress = @MessageBoxAHook()
    
    If *OldAddress <> #Null And *NewAddress <> #Null
      Hook(*OldAddress, *NewAddress)
    EndIf
    
    CloseLibrary(Library)
  EndIf
EndProcedure
Das mit dem Thread beim AttachProcess war mir neu.
Ich verstehe aber weder wie sich daraus ein Problem ergibt noch was ein Timer daran ändert
- es sei den es hat mit zeitintensiven Geburtswehen des Thread zu tun.

Bei meinen Versuchen den Injector auch als Starter des Ziels zu verwenden, um sicherzustellen, dass der Zielprozess nie ungehookt ist, hatte ich allerdings auch Timingprobleme.
Einige Programme waren einfach schneller als das Setzen des Hooks. Das könnte auch daran liegen.

Im Moment fehlt mir da eine zündende Idee. Ich werde mich wohl erst wieder reinlesen, etwas nachdenken und herumspielen müssen.


Hat noch jemand eine Antwort auf die Frage :
Kann man LoadLibraryA aus der kernel32.dll auch für 64Bit-Hook-DLL's benutzen?

Danke !
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: DLL Inject / Eject

Beitrag von Josh »

uweb hat geschrieben:Ich verstehe aber weder wie sich daraus ein Problem ergibt noch was ein Timer daran ändert
  • Erstellen von Gadgets im AttachProcess funktioniert nicht
  • Erstellen eines Hooks mit SetWindowsHookEx_ im AttachProcess funktioniert nicht
Mit dem Aufruf der Prozedur PvtAttach mittels Timer arbeite ich nicht mehr im Thread von AttachProzess und habe auch keine Probleme. Vielleicht gibt es elegantere Lösungen, aber es funktioniert. Dazu verwende ich folgende Prozeduren:

Code: Alles auswählen

Procedure.i  Ide_hWnd                  ()
 ;Gibt das Handle der IDE zurück
  Define WndTitle .s {100}
  Static hIde     .i
  Define hIter    .i
  Define ProcId   .i

 ;Nur wenn hIde noch nicht ermittelt wurde (ändert sich nie)
  If hIde = 0
    hIter = GetWindow_(GetDesktopWindow_(), #GW_CHILD)
    While hIter
     ;Fenster muss mit "PureBasic" beginnen
      GetWindowText_(hIter, @WndTitle, 98)
      If Left (WndTitle, 9) = "PureBasic"
       ;Fenster muss zum gleichen Thread gehören
        GetWindowThreadProcessId_(hIter, @ProcId)
        If ProcId = GetCurrentProcessId_()
          If hIde = 0
            hIde = hIter
          Else
            msg = "Es wurden mehrere passende" + #CRLF$
            msg + "PureBasic Fenster gefunden."
            MessageRequester ("Ide Hook", msg, #MB_ICONERROR)
          EndIf
        EndIf
      EndIf
      hIter = GetWindow_(hIter, #GW_HWNDNEXT)
    Wend
    If hIde = 0
      msg = "Es wurde kein passendes" + #CRLF$
      msg + "PureBasic Fenster gefunden."
      MessageRequester ("Ide Hook", msg, #MB_ICONERROR)
    EndIf
  EndIf

 ;Handle zurückgeben
  ProcedureReturn hIde

EndProcedure

Code: Alles auswählen

ProcedureDLL AttachProcess             (hModul.i)

 ;Hier die globalen Deklarationen
  ;......
  ;......

 ;Erstellen des Hooks im AttachProcess funct nicht, deswegen über Timer
  SetTimer_(Ide_hWnd(), #TimerId_StartHook, 100, @PvtAttach())

EndProcedure

Code: Alles auswählen

Procedure    PvtAttach                 (hWnd, uMsg, wParam, lParam)

 ;Timer löschen
  If uMsg = #WM_TIMER
    KillTimer_(Ide_hWnd(), #TimerId_StartHook)
  EndIf

 ;Hier was ich sonst noch brauche
  ;......
  ;......

 ;Hook auf Ide erstellen
  hHookIde = SetWindowsHookEx_(#WH_CALLWNDPROC, @PvtHookIde(), 0, GetCurrentThreadId_())

EndProcedure
uweb hat geschrieben:Hat noch jemand eine Antwort auf die Frage :
Kann man LoadLibraryA aus der kernel32.dll auch für 64Bit-Hook-DLL's benutzen?
Funktionieren tut es, mehr kann ich dazu auch nicht sagen. Vielleicht liegt es daran, dass Kernel32.dll (und noch Eine, die mir gerade nicht einfällt) einen Sonderstatus in Windows hat. Kernel32.dll vergibt feste Funktionszeiger, die sich nie ändern.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: DLL Inject / Eject

Beitrag von uweb »

einmal mehr : D A N K E !
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: DLL Inject / Eject

Beitrag von Thorium »

Zu AttachThread: Man sollte da so wenig wie möglich tun. Die sicherste Methode ist es in AttachThread garnichts zu tun, sondern per CreateRemoteThread eine Prozedur der DLL von ausserhalb starten, nachdem die DLL komplett initialisiert wurde (AttachThread durchgelaufen ist). Ich hatte beim GameFixer auch einige Probleme damit.
uweb hat geschrieben: Ich sehe schon einen Vorteil in Josh's Methode. Auf die Art muss das fremde Programm nicht bis zum Schluß gehhookt bleiben. Ich frage mich aber was passiert wenn der Injector vor dem fremden Programm beendet wird.
Beim selbst entladen muss das Programm auch nicht bis zum schluss gehookt bleiben, wobei DLL-Injection nicht zwingend benutzt wird um Hooks zu installieren, es gibt auch einige andere Anwendungsmöglichkeiten.
Eine DLL kann sich jederzeit selbst entladen. Ob man das vom Fremdprogramm aus tut oder extern ist eine Frage nach dem Stil der eigenen Anwendung. Möchte man eher von "aussen" oder eher von "innen" steuern. Vorteile oder Nachteile haben beide nicht zueinander, bis vieleicht auf den Implementationsaufwand.
uweb hat geschrieben: Noch eine Verständnisfrage :
Kann man LoadLibraryA aus der kernel32.dll auch für 64Bit-Hook-DLL's benutzen?
kernel32.dll ist eine 64bit dll unter 64bit Systemen.
uweb hat geschrieben: Bei meinen Versuchen den Injector auch als Starter des Ziels zu verwenden, um sicherzustellen, dass der Zielprozess nie ungehookt ist, hatte ich allerdings auch Timingprobleme.
Einige Programme waren einfach schneller als das Setzen des Hooks. Das könnte auch daran liegen.

Im Moment fehlt mir da eine zündende Idee. Ich werde mich wohl erst wieder reinlesen, etwas nachdenken und herumspielen müssen.
Dazu startet man den Zielprozess mit dem Suspended Flag per CreateProcess. Somit gibts keine Timingprobleme, da der Process nach dem initialisieren vom System angehalten wird und man in aller Ruhe alles machen kann was man will. Weiterlaufen lassen tut man den Prozess dann mit ResumeThread.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: DLL Inject / Eject

Beitrag von Josh »

Hi Thorium,

danke für deine Infos. Was mich noch interessieren würde, im AttachProcess deklariere ich ja meine globalen Variablen. Was passiert mit dem Speicher den meine globalen Variablen belegen, wenn ich die DLL entlade? Oder noch mal anders, wenn ich einen Speicher allociere und nicht freigebe, wird dieser beim entladen der DLL freigegeben?

Danke
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: DLL Inject / Eject

Beitrag von Thorium »

Josh hat geschrieben: Was mich noch interessieren würde, im AttachProcess deklariere ich ja meine globalen Variablen. Was passiert mit dem Speicher den meine globalen Variablen belegen, wenn ich die DLL entlade? Oder noch mal anders, wenn ich einen Speicher allociere und nicht freigebe, wird dieser beim entladen der DLL freigegeben?
Globale Variablen dürften automatisch freigegeben werden, da sie zur Datasection (un/initialisierte Daten) gehöhren.
Manuell alloziertes wird nicht freigegeben. Wobei ich mir nicht sicher bin ob PB beim entladen was automatisch freigibt. Was mit API alloziert wurde wird jedenfalls nicht automatisch freigegeben.

Globale Variablen brauchst nicht in AttachProcess packen. Die können auch bei DLL's ausserhalb der Prozeduren stehen.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten