Fremdes Fenster Close Button Deaktivieren / Entfernen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Beitrag von Mok »

Thorium hat geschrieben:Dazu musst du einen Window Hook für das Fenster installieren
Besteht dadurch nicht die Gefahr, dass das Programm von einem AntiVirus als Keylogger indiziert wird? Ich selbst hab mich auch schon mit Hooks gespielt, welche zwar nicht als Keylogger erkannt wurden, eigentlich komisch...

Edit: Was ich damit sagen will: Hooks kann man ganz einfach für nicht so legale Zwecke missbrauchen, werden aber trotzdem nicht vom AV weggefegt.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Beitrag von Thorium »

Sollte eigentlich von keinem AV angemeckert werden, für nen keylogger brauch man keinen window hook. Geht mit GetAsyncKeystate viel einfacher und unauffälliger. Aber wer weis die schlagen ja bei so manchem an, was völlig harmlos ist.
Window Hooks sind nix schlimmes, die werden ganz offiziell von Windows unterstützt und es gibt ettliche gute Anwendungsmöglichkeiten.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Beitrag von Thorium »

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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

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