Seite 2 von 2

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 22.02.2011 12:04
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.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 22.02.2011 14:28
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.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 22.02.2011 18:31
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.