Bonjour à tous, je suis actuellement en stage sur une technologie de BitTorrent, et une de mes missions consiste à récupérer les handshake des connexions. Pour cela j'ai le programme ci-dessous. Ici j'ai un programme permettant de sniffer les paquets et un piece_request_re qui contient la data commune à tout les handshake afin de les comparer et de les filtrer. Ainsi je le compare par la suite aux paquets sniffés pour savoir si oui ou non se sont des handshake pour tester mon programme. Cependant cela ne fonctionne pas et je n'arrive pas à résoudre la question du pourquoi malheureusement c'est ainsi que je sollicite votre aide.

Mon second problème est que le CTRL-C ne fonctionne pas sous bash et je ne peux pas interrompre le programme automatiquement avec CTRL-Z je suis obligé d'executer une commande kill par la suite, j'aimerais rajouter une ligne dans mon code qui renvoie vers sniffer.stop() lorsque je fais un CTRL-Z mais je ne sais malhereusement pas comment faire .

Merci d'avance de votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
import pcapy
import dpkt
from threading import Thread
import re
import binascii
 
 
piece_request_re = re.compile('13426974546f7272656e742070726f746f636f6c(?P<reserved>\w{8})(?P<info_hash>\w{20})(?P<peer_id>\w{20})')
 
 
class PieceRequestSniffer(Thread):
    def __init__(self, dev='eth0'):
        Thread.__init__(self)
 
        self.expr = 'udp or tcp'
 
        self.maxlen = 65535  # max size of packet to capture
        self.promiscuous = 1  # promiscuous mode?
        self.read_timeout = 100  # in milliseconds
        self.max_pkts = -1  # number of packets to capture; -1 => no limit
 
        self.active = True
        self.p = pcapy.open_live(dev, self.maxlen, self.promiscuous, self.read_timeout)
        self.p.setfilter(self.expr)
 
 @staticmethod
    def cb(hdr, data):
 
        eth = dpkt.ethernet.Ethernet(str(data))
        ip = eth.data
 
        #Select only TCP protocols
        if ip.p == dpkt.ip.IP_PROTO_TCP:
            tcp = ip.data
 
            try:
                #Return hexadecimal representation
                hex_data = binascii.hexlify(tcp.data)
            except:
                return
 
            print
            return
 
            handshake = piece_request_re.findall(hex_data)
            if handshake:
                 print "handsheck filtered"
 
    def stop(self):
        #logging.info('Piece Request Sniffer stopped...')
        self.active = False
 
    def run(self):
        while self.active:
            self.p.dispatch(0, PieceRequestSniffer.cb)
 
 
sniffer = PieceRequestSniffer()
sniffer.start()