Contexte et objectifs

Un jeu de données de 5,6 milliards de vidéos TikTok a récemment été publié sur Hugging Face, révélant l’intérêt d’une collecte massive de métadonnées. La méthode officielle, qui repose sur un navigateur ou un émulateur, aurait coûté plusieurs dizaines de milliers de dollars. L’auteur a donc cherché à reproduire le processus en s’appuyant sur Hermes Agent, le dépôt open‑source Reverse Engineer Anything (REA) et le modèle GLM 5.3 hébergé sur OpenRouter, afin de découvrir le « secret sauce » derrière l’accès à l’API privée de TikTok.

Architecture de l’ingénierie inverse

Le workflow combine trois couches : un LLM (GLM 5.3) qui orchestre les actions, Hermes qui expose les outils REA via un serveur MCP, et REA qui invoque automatiquement les programmes classiques de rétro‑ingénierie (Ghidra, Hopper, IDA, jadx pour le bytecode Android, adb pour le contrôle du dispositif, TShark pour l’analyse de paquets). Après installation avec npx rea‑agents setup, l’agent sélectionne le bon outil, exécute la tâche et renvoie le résultat accompagné d’une preuve d’exécution. En complément, Frida est attaché à l’émulateur rooté pour intercepter les appels natifs, et mitmproxy capture le trafic réseau.

Analyse du mécanisme de signature

TikTok ne répond pas aux requêtes API privées avec des codes d’erreur classiques ; un HTTP 200 vide indique simplement que l’une des quatre vérifications a échoué. Ces vérifications sont : (1) l’identité du dispositif délivrée par TikTok, (2) la signature générée par une bibliothèque native, (3) le point d’accès régional correct, et (4) une empreinte réseau imitant un téléphone. L’absence de messages d’erreur oblige à juger le succès uniquement sur la taille du corps de réponse. Le code suivant, extrait du projet, montre le filtre appliqué :

def classify(http_status: int, body: bytes) -> Outcome:
    if http_status != 200:
        return Outcome(False, f"upstream HTTP {http_status}",
                       retry_would_help=(http_status == 429))
    if len(body) < MIN_BODY_BYTES:
        return Outcome(False, f"empty upstream body ({len(body)} bytes)",
                       retry_would_help=True)
    ...

Le premier passage de REA a consisté à décompiler le bytecode avec jadx, révélant le nom de la bibliothèque de signature et les en‑têtes associés. L’étape suivante a utilisé Frida pour placer un hook au point où le code Java invoque les fonctions natives. L’observation clé : la signature réelle n’est jamais générée à ce niveau‑de‑transition, mais directement par le réseau interne de l’application, à l’intérieur du code natif. Ainsi, le hook Java ne capture aucune donnée pertinente, confirmant que la logique de signature est confinée au module natif.

Limites et perspectives

Cette approche montre qu’une combinaison d’IA (GLM 5.3) et d’outils REA peut automatiser la découverte de mécanismes complexes sans accès direct au code source. Cependant, la dépendance à un émulateur rooté et à des bibliothèques natives rend le processus sensible aux mises à jour de TikTok : toute modification du binaire ou du protocole de signature nécessite une nouvelle passe d’analyse. De plus, l’absence de messages d’erreur empêche une validation granulaire des quatre contrôles, obligeant les chercheurs à recourir à des essais itératifs. Malgré ces contraintes, la méthode prouve qu’il est possible de contourner les protections anti‑bot de TikTok pour extraire des métadonnées à grande échelle, ouvrant la voie à des solutions de scraping plus économiques que les services payants existants.