L’après-TPB: DHT, infohash et indexation

Rappel du contexte: The Pirate Bay ne répond plus suite à un raid, et vu le délai il est bien possible que TPB ait définitivement tiré sa révérence, ce qui n’est pas une mauvaise chose en soi. Car il est temps de laisser place à une indexation automatique et décentralisée de tous les fichiers torrent.

D’emblée, il faut avertir: les échanges avec le protocole BitTorrent ne sont pas chiffrés et il n’est pas difficile de déterminer qui possède un contenu et qui le télécharge. Nul besoin donc de pleurnicher sur la fonction de « modération » que permettait la centralisation autour d’un faible nombre d’indexeurs de fichiers torrent, les fichiers terroristes, pédophiles et nazis gagneront effectivement en visibilité mais aussi faciliteront grandement le travail des autorités compétentes. Et bien sûr, libre aux indexeurs de DHT de filtrer l’océan de contenus à la petite cuillère si « faciliter l’accès » à certains contenus pose des problèmes légaux et/ou moraux.

La DHT (Distributed Hash Table) de BitTorrent est un mécanisme vraiment bien conçu: avec un infohash (identifiant unique de torrent), le client lance une requête à ses pairs immédiats, lesquels retournent vers quels relais s’adresser dans le  « troupeau » immédiat, jusqu’à trouver un « troupeau » dans lequel se trouve un pair qui possède le torrent correspondant à cet infohash, et le transmette au client. À chaque torrent correspond un infohash, et à chaque infohash correspond un torrent: si vous créez un nouveau torrent à partir des mêmes fichiers, vous aurez beaucoup de mal à retrouver un même infohash: tout doit correspondre à la perfection, du nom à la taille des pièces jusqu’aux méta-données inutiles style date de création ou client+version à son origine.

Vous me demanderez: est-ce possible de récupérer le torrent correspondant à un infohash précis ? Oui, ça l’est. Aria2.

Il y a un site que j’utilise de temps en temps pour « liquéfier » des téléchargements difficiles depuis des seeds chinois par exemple:  Furk. Ce site, vous pouvez lui faire télécharger un torrent soit en lui donnant le fichier .torrent, soit en entrant un infohash ou magnet. Ça m’intriguait: je me mets en seed sur un torrent, je l’envoie sur le site, et j’observe: se connecte un serveur néerlandais tournant sous Aria2.

Aria2 est un client de téléchargement en CLI, avec de la communication RPC pour être facilement commandable, Aria2 sait faire du HTTP(S), FTP, BitTorrent, Metalink. Un petit couteau suisse. Mais surtout: il prend en charge les liens Magnet BTIH, se connecte à la DHT…..  et permet de sauvegarder juste le torrent et sortir les métadonnées sous forme de texte. Une pièce majeure de mon puzzle: Aria2 fait la transition entre un torrent de la DHT et une base de données indexant les torrents.

Ouais mais, les infohash… d’où ils viennent ? Il faut un crawler de DHT: un logiciel qui se connecte à la DHT et écoute ce que les pairs immédiats recherchent/téléchargent/partagent. J’en ai trouvé un: simDHT, écrit en Python2. C’est cool Python, sauf que j’ai jamais vraiment développé en Python pour l’instant, que c’est de la version 2, et que le script ne sort pas les résultats dans stdout. La façon de récupérer les infohash reçus est donc…  jugez plutôt:

AVANT:

class Master(object):
def log(self, infohash, address=None):
print "%s from %s:%s" % (
infohash.encode("hex"), address[0], address[1]
)

APRÈS:

class Master(object):
def log(self, infohash, address=None):
print "%s from %s:%s" % (
infohash.encode("hex"), address[0], address[1]
)
f = open("infohash/"+infohash.encode("hex"),'w')
f.close()
)

(ouais WordPress défonce l’indentation)

Cool cool. Bon. simDHT reçoit dans les 80 infohash par minute, jusque là ça va. Je fourre les infohash dans un fichier, et j’en nourris Aria2:

aria2c -j 10 --dht-listen-port=6881 --bt-stop-timeout=30 --bt-metadata-only=true --bt-save-metadata=true -i infohash.list

Les paramètres:

  • -j (jobs) indique les téléchargements parallèles à réaliser.
  • --dht-listen-port indique le port UDP à utiliser pour communiquer avec la DHT. Aria2 n’ayant pas de fonction uPnP, il faut ouvrir ce port dans votre box pour un meilleur résultat
  • --bt-stop-timeout c’est le temps en secondes durant lequel Aria2 va attendre: si au bout de ce délai il n’y a aucune connexion, Aria2 laisse tomber
  • --bt-metadata-only et --bt-save-metadata indiquent qu’Aria2 ne doit pas télécharger les fichiers, juste sauvegarder les métadonnées (= le fichier torrent)

Ça donne quoi ? Bah. Ça montre surtout que la DHT est polluée par du spamflood: sur 200 infohash, vous aurez genre 2-5 « vrais torrents ». Ou alors il n’y avait aucun pair qui a le torrent. Ou alors trop loin ou trop lent pour le délai de 30 secondes. Mais on va pas laisser tourner Aria2 pendant une heure puisque, logiquement, Aria2 rediffuse le spam dans la DHT quand il tente d’en avoir le torrent.

Mais voilà, on a des .torrent ! On peut afficher les métadonnées ainsi:

aria2c -S fichier.torrent

À ce stade, j’ai fait un petit script PHP pour (tenter de) parser les métadonnées obtenues et en faire du JSON, qu’on peut alors brancher à du SQLite ou MariaDB ou tout autre SGBD au centre d’un moteur de recherche de torrent sur le web… mais puisque je me sens ridicule avec mon PHP tout moisi qui sait pas array_search(), je vais limiter mes ambitions. Mais les fichiers torrent sont là, traitables, indexables.

Donc amusez-vous à expérimenter vous-même la récupération et identification d’infohashes dans la DHT 🙂  Mon script:

#!/bin/bash
echo "## finding infohashes..."
timeout 60 python2 simDHT.py
count=$(ls infohash | wc -l)
echo "## processing $count infohashes..."
cd "infohash"
for file in *; do
echo "magnet:?xt=urn:btih:$file&tr=udp%3a%2f%2ftracker.publicbt.com%3a80%2fannounce" >> ../infohash.list;
rm "$file"
done
cd ..
aria2c -j 10 --dht-listen-port=6881 --bt-stop-timeout=30 --bt-metadata-only=true --bt-save-metadata=true -i infohash.list
rm 'infohash.list'
for file in *.torrent; do
aria2c -S $file >> "infohash/$file.metadata"
mv $file "db/"
done
php parse.php


À titre d’info, voilà ce que j’ai pu avoir avec ~4 minutes de fonctionnement:

57e3eee00b3ba637ead378c0a91821a28a3af840: Chelovek.Nojabrja.2014.Dc.Eng.HDRip.avi
281f90d4314fb29c0501209f3397349a875dce1c: Once Upon a Time S04E06 HDTV x264-LOL[ettv]
595900a6b58a30cd8b8ff999faae60f0616f873f: The.Daily.Show.2014.12.08.Norman.Lear.HDTV.x264-BATV.mp4
a7f5eec587bd3f31532e20b0e1603524d02bfe9e: [www.Cpasbien.pe] Marvels.Agents.Of.S.H.I.E.L.D.S01E20.FRENCH.LD.BDRip.XviD-RNT
b51c7241d26584cf4bf2c4cf7fab84acb6082866: Deliver Us from Evil (2014)
f10aea5762918b80b2a303d827c04c13eb9af125: Lager.X-Ray.2014.P.WEB-DLRip.1400MB.avi
86fdc07104a5524d2976264b24ca0a7126565c8f: The Walking Dead - Temporada 5 [HDTV][Cap.508][Español Castellano]


 

Addendum, 13 décembre:

Oh je me rappelle d’une chose: Tribler. Ce client BitTorrent a une fonction de recherche de torrent intégrée, et pour ce faire il enregistre les torrents qui circulent dans la DHT ! Vous pouvez trouver dans le répertoire de téléchargement un dossier appelé « collected_torrent_files », contenant les miniatures, fichiers de métadonnées et les torrents eux-mêmes. N’ayez pas peur d’avoir des dizaines de milliers de fichiers à cet endroit, Tribler est vraiment bien conçu !

7 pensées sur “L’après-TPB: DHT, infohash et indexation”

  1. Il faut enlever le ) de fin dans ta modif python.

    Il manque un « mkdir infohash » dans ton bash script, sinon, mais une condition pour le rm par pitié…

  2. Tres sympa tout ça.. en ajoutant une indexation dans un elasticsearch, on a vite quelquechose de sympa.

    je vais me pencher la dessus, merci pour l’article!

  3. je me suis interessé un peu au truc

    et bien effectivement on voit passer enormement de « bazar » pour pas grand chose.

    Sur windows un :

    simDHT.py >nom_fichier

    fonctionne

Les commentaires sont fermés.