Bonsoir à tout le monde!
EDIT: comme l'a fait remarquer DrBrooklyn dans sa réponse, la méthode utilisée ici n'est pas vraiment la "bonne" méthode. Ça devrait fonctionner, mais il existe des méthodes bien plus pratiques et efficaces sur le forum. Je laisse quand même le post original pour ceux qui sont intéressés.
Développant 100% sous Linux et commençant à m'intéresser à l'écosystème de Dofus, je suis tombé sur le besoin d'avoir la possibilité de récupérer les messages envoyés/reçus par le client sous Linux. Chose pensée chose faite, j'ai développé """l'équivalent""" (il y a beaucoup de guillemets, voir paragraphe suivant) de No.Ankama.dll mais pour Linux.
N'ayant pour l'instant uniquement besoin de pouvoir lire les messages entrants/sortants du client, le hook partagé ici n'est pas vraiment un équivalent de No.Ankama.dll: il ne fait que dupliquer les messages pour les envoyer autre part, sans toucher aux messages reçus/envoyés par le client.
Sans plus attendre, le lien vers le dépôt Gitlab. Tout est expliqué dans le README, en gros le hook duplique et envoie:
- les messages reçus par le client vers 127.0.0.1:53453.
- les messages envoyés par le client vers 127.0.0.1:53452.
Il vous suffit d'avoir un programme qui écoute sur ces ports pour recevoir tous les messages envoyés/reçus par le client hooké.
Quelques remarques en vrac:
- Vous ne pouvez pas hooker 2 clients en même temps en laissant la bibliothèque comme ça. Il faudra modifier les ports dans le code source et re-compiler une autre version de la bibliothèque afin d'avoir 2 versions de la bibliothèque avec des ports différents pour éviter que les messages des 2 clients se mélangent.
- Les ports comme l'adresse IP sont au tout début du fichier source. Vous pouvez les changer pour mettre les valeurs que vous voulez (attendez-vous néanmoins à des problèmes si vous vous amusez à mettre 22 ou 80 - les ports réservés aux protocoles SSH et HTTP).
- Je n'ai pas testé, mais théoriquement il est possible de mettre une adresse IP externe et donc d'envoyer les messages dupliqués à un autre programme qui va écouter sur une machine différente, en passant par le réseau Internet. Je suis preneur de retours si quelqu'un teste.
- Ca a été testé/compilé avec GCC 9.3, GCC 8.3 (il me semble), clang 9 et clang 11. Ne cherchez pas à compiler ça sur Windows, ça utilise des headers système de Linux qui sont absents de Windows.
- Je n'ai pas encore filtré les messages avec les IPs des serveurs de connexion et de jeu. Ça signifie que tous les messages envoyés/reçus par le client seront transférés. Je crois qu'il y a quelques messages qui ne viennent ni du serveur de jeu ni du serveur de connexion au tout début de la connexion, mais je n'ai pas vérifié correctement (on voit du JSON dans le hexdump de mémoire).
- Il n'est pas nécessaire de lancer le serveur qui va écouter sur les ports avant le client hooké. Si aucun programme n'écoute sur les ports, le hook écrira un message de log sur la sortie standard (qui normalement n'est pas visible quand vous lancez le client) et essaiera de nouveau de se connecter au prochain message.
- Pas besoin de changer vos habitudes, vous lancez le client avec le launcher, comme d'habitude. Vous pouvez même garder le hook H24 sur le client et jouer normalement sans avoir un serveur qui va écouter les ports. Tout est complètement transparent (modulo la modification initiale et unique d'une ligne). Néanmoins je n'ai aucune idée de si le fichier est checké par le client. Quelqu'un pourra peut-être m'éclairer sur ce point?
Merci à @Turing#4686 (Papa Ising) pour l'aide!