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 ()