Una volta avviato, un client BitTorrent genera un identificatore di 20 byte chiamato peer_id
, costituito da ClientIdentifierClientVersion-RandomNumbers
. Certo, ClientIdentifier
e ClientVersion
non forniscono alcuna identificazione, ma il RandomNumbers
potrebbe essere usato per identificare un cliente, e ci sono alcune cose che devono essere capite:
-
Il peer_id
potrebbe essere qualsiasi cosa desideri dai clienti, quindi inviare. Il protocollo non definisce come dovrebbe essere generato, né definisce come dovrebbe essere strutturato.
-
Il client assegna il suo peer_id
a chi lo richiede (fa parte dell'handshake).
-
L'impostazione del flag no_peer_id
consente che la comunicazione avvenga senza la necessità di rivelare peer_id
.
-
Il peer_id
viene generato ogni volta che viene riavviato il client. uTorrent 3.3 genera anche un nuovo peer_id
mentre è in esecuzione di tanto in tanto.
Tuttavia, BitTorrent utilizza un DHT chiamato Kademlia , che è un'ottima notizia per le ricerche sulla sicurezza (stalker dell'AKA). Qualche tempo fa, ho analizzato uTorrent e Transmission, entrambi usano la crittografia per DHT / PEX (se abilitata e forzata).
Quando un client entra nella "rete" DHT esegue il bootstrap connettendosi ad un server bootstrap. Questo di solito accade la prima volta che si esegue un nuovo client. Ma questa non è l'unica cosa che succede quando si avvia Kademlia.
Quando un client si unisce alla rete, viene assegnato un identificatore generato in modo casuale chiamato node ID
. Questo ID di nodo viene scelto casualmente dallo stesso spazio a 160 bit degli "hash di informazioni" di BitTorrent. In qualsiasi momento, puoi cancellare le tue informazioni DHT e ricongiungerti alla rete, il che ti darebbe un nuovo identificatore. Poiché non molti utenti lo fanno, puoi contare su di esso come identificatore.
Per ottenere node ID
di un cliente è sufficiente inviare loro un messaggio% d_di% DHT, e risponderà con il suo ID
ping
"}}
-
{"t":"T_ID", "y":"q", "q":"ping", "a":{"id":"THE_SENDER_ID
è ID transazione, identifica il messaggio e viene rinviato con la risposta
-
t
è il tipo di messaggio e il valore y
indica che si tratta di una query.
-
"q"
è il è il tipo della query e qui è una query ping.
-
q
rappresenta gli argomenti della query. Qui contiene semplicemente l'ID del nodo del mittente.
Un client risponderà
Response = {"t":"T_ID", "y":"r", "r": {"id":"MY_ID"}}
il valore a
per "r"
significa che questa è una risposta.
Questi sono principalmente i due modi per identificare un client fornito dal protocollo stesso.