So, hier das Beispiel. Muss natürlich noch überarbeitet werden um in einem allgemeinen Programm eingesetzt zu werden aber soll ja auch nur ein Beispiel sein.
Zuerst mal die dll, welche in den betrefenden Prozess injiziert werden muss und dann dort die eigentliche Arbeit verrichtet:
Code: Alles auswählen
EnableExplicit
Global OrigWndProc.i
Procedure.i WindowHook(hWnd.i, uMsg.i, wParam.i, lParam.i)
;hier laufen jetzt alle Window Events ein
Select uMsg
Case #WM_CLOSE
;es wird versucht das Fenster zu schließen
If MessageRequester("", "Wirklich beenden?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_No
;wir setzen die Message auf 0 um sie quasie zu verschlucken
uMsg = 0
EndIf
EndSelect
;Aufruf der originalen Window Prozedur und Rückgabe des originalen Rückgabewertes
ProcedureReturn CallWindowProc_(OrigWndProc, hWnd, uMsg, wParam, lParam)
EndProcedure
ProcedureDLL AttachProcess(Instance.i)
Protected hWnd.i
;installieren des Window Hooks
;zuerst holen wir uns die hWnd des Fensters
;sollte durch eine bessere Methode ausgetauscht werden
hWnd = FindWindow_(0, "Calculator")
;dann sichern wir uns die Addresse der originalen Window Prozedur
OrigWndProc = GetWindowLongPtr_(hWnd, #GWL_WNDPROC)
;dann ändern wir die Window Prozedur auf unsere eigene
SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @WindowHook())
EndProcedure
Und hier noch ein Beispiel um die .dll zu injizieren:
Code: Alles auswählen
EnableExplicit
Procedure.i InjectDLL(hProcess.i, DllFileName.s)
Define.i FileNameLen, FileNameAddr, BytesWritten, hKernel32, LoadLibraryAAddr, hThread
FileNameLen = Len(DllFileName) + 1
FileNameAddr = VirtualAllocEx_(hProcess, 0, FileNameLen, #MEM_COMMIT | #MEM_RESERVE, #PAGE_READWRITE)
If FileNameAddr = #False
ProcedureReturn #False
EndIf
If WriteProcessMemory_(hProcess, FileNameAddr, DLLFileName, FileNameLen, @BytesWritten) = #False
ProcedureReturn #False
EndIf
If BytesWritten <> FileNameLen
ProcedureReturn #False
EndIf
hKernel32 = GetModuleHandle_("Kernel32.dll")
If hKernel32 = #False
ProcedureReturn #False
EndIf
LoadLibraryAAddr = GetProcAddress_(hKernel32, "LoadLibraryA")
If LoadLibraryAAddr = #False
ProcedureReturn #False
EndIf
hThread = CreateRemoteThread_(hProcess, 0, 0, LoadLibraryAAddr, FileNameAddr, 0, 0)
If hThread = #False
ProcedureReturn #False
EndIf
WaitForSingleObject_(hThread, #INFINITE)
VirtualFreeEx_(hProcess, FileNameAddr, 0, #MEM_RELEASE)
ProcedureReturn #True
EndProcedure
Define PId.i
GetWindowThreadProcessId_(FindWindow_(0, "Calculator"), @PId)
If InjectDll(OpenProcess_(#PROCESS_ALL_ACCESS, #False, PId), "c:\WndHook.dll")
MessageRequester("", "erfolg")
Else
MessageRequester("", "misserfolg")
EndIf
Läuft unter x86 und x64. Aber bitte beachten das als x86 kompiliert nur in x86 Prozesse injiziert werden kann und als x64 kompiliert nur in x64 Prozesse.