J'ai des problèmes sur la conception d'un bot MITM

Inscrit
25 Octobre 2018
Messages
9
Reactions
0
#1
Bonjour Cardernis,

Pour commencer, un super merci à tout votre forum qui m'a permis de comprendre des concepts tels qu'un sniffeur, le MITM, le socket et j'en passe!

J'ai toujours un problème lorsque j'imagine comment faire mon bot...

Je vous explique, j'aimerai juste pouvoir interagir avec mon client en faisant appel à une fonction en Javascript (Node.Js). Même s'il faut que j'utilise un wrapper en C++ pour pouvoir hooker le .exe ce n'est pas grave, mais c'est ma finalité.
Si j'ai bien compris, il me faut d'abord utiliser un sniffeur afin de savoir comment appeler certaines actions, prenons le déplacement comme exemple.
Une fois que j'ai trouve que le déplacement serait admettons 386 comment je fais? Je suis perdu à partir de là.
J'aimerai pouvoir faire déplacer mon personnage tout simplement!

J'ai aussi un point à éclaircir, j'ai cru entendre parler de fichier .as, qui serait les fonctions sur jeux? Mais alors je peux les appeler directement? Sans passer par une lecture et un envoi de flux au serveur?

Merci d'avance,

Izio.
 

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
149
Reactions
27
#2
MITM = Man In The Middle (L'Homme au milieu)

Ce qui veut dire que ton programme se place sur le trafic entre le client et le serveur.
Pour cela, il faut faire connecter le client à un serveur en local (127.0.0.1) qui lui même se connectera au serveur de Dofus.

Client <=> Serveur
Client <=> Ton programme <=> Serveur

De la sorte, le client croit, en étant connecté à ton programme, être connecté sur le serveur officiel.
Et inversement, le serveur croit qu'il a à faire à un client authentique.

Le Hook de la méthode native Connect se fait au lancement du client, c'est ce qui permet de faire connecter le client en Localhost.
Tu peux hooker la méthode ou patcher directement la surcouche Connect dans le client.

Les classes ".as" ne sont rien d'autre que les sources de Dofus décompilées (Dofus étant écrit en ActionScript). On les utilise pour comprendre comment le client réagit à la réception d'un paquet X (très pratique dans le cas d'un bot).

Comment faire déplacer un personnage ? Plus haut j'ai dit que le serveur croyait avoir à faire à un client authentique alors qu'il communiquait en fait directement avec notre programme. Il faut donc jouer de ça et envoyer des paquets de déplacement directement du programme vers le serveur.

Enjoy !
 
Inscrit
25 Octobre 2018
Messages
9
Reactions
0
#3
Merci pour ton aide Tazman, j'ai pu réaliser le fameux programme! C'est une superbe expérience.

En revanche, je rencontre un autre problème...
Je hook à l'aide d'un programme donné par un membre de la communauté: NoAnkama (disponible sur Github), je redirige le traffic vers un serveur Socket fait en Node.js.
J'ai créer deux classes, une pour le client et une pour le serveur. Je fais très simple pour le moment, j'affiche le buffeur envoyé par le client et par le serveur, et je les redistribue comme cela devrait se passer.

JavaScript:
const { ClientSocket } = require("./Net/client.js");
const { ServerSocket } = require("./Net/server.js");

var client = new ClientSocket();
var server = new ServerSocket();

server.on("s-data", (datas) => {
  console.debug("[SERVEUR]: ", datas.toString('hex').match(/../g).join(' '));
  client.send(datas);
})

client.on("c-data", (datas) => {
  console.debug("[CLIENT] sended :\n", datas.toString('hex').match(/../g).join(' '));
  server.send(datas);
})
Jusque là tout va bien, donc je suis content, et je test un peu, donc j'essaye avec un mot de passe qui ne fonctionnera pas (un faux quoi!) et là j'ai bien le message identifiants incorrects.
Par contre, si je met le bon mot de passe, j'ai tout un tas d'échange qui se produit et là, le client ne répond plus après 4 infos lâchés par le serveur...

Je vous laisse un screen des derniers échanges (on dirai presque le début d'une enquête :D)



Je ne comprend pas pourquoi le client bloque, y'a même pas le petit sablier, c'est juste mort, et si je regarde la liste des processus, la mémoire ne bouge pas, rien...
Je vais continuer de chercher mais si vous avez une idée avant moi je suis preneur!

Je peux donner les sources si besoin!

EDIT: Après avoir durement travaillé sur le programme, je me suis dit que peut être je parse mal les paquets, et qu'il faut les découper, ou alors les rallonger... Mais non, même le premier paquets: "ProtocolRequired", ID: "00 05" affiche un longueur de (2052 - 4).
J'attend pourtant d'autre données, mais rien n'arrive, comment est-ce possible?

Code:
this.client.on('data', (data) => {
       console.debug("[SERVEUR]: ", data.toString('hex').match(/../g).join(' '));
});
Le programme principal: https://hastebin.com/bamobesasa.js
La class Serveur: https://hastebin.com/talesorudu.js
La class Client: https://hastebin.com/zezuleyine.js


EDIT : Résolu! Le soucis était le suivant. Je lisais mal la longueur d'un message. Maintenant il bloque toujours mais j'imagine que je dois changer de serveur donc tout va bien! :)

Ce n'est pas très propre pour le moment, mais si ça peut d'un côté aider certaine personne à comprendre le MITM et d'un autre côté à m'aider via vous.. :)


Merci d'avance.
 
Dernière édition:

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#4
il faudra que tu fasses attention au message 42 (ou 6469 car d'apres ce que j'ai vu sur un autre post le 42 existe plus , faut vraiment un jour que je me mette a jour , enfin tu verras) qui va arriver du serveur car il contient l'IP du serveur (de jeu) , pour que le client s'y connecte mais ce n'est pas ce que tu veux , tu veux que le client se connecte sur 127.0.0.1 (sur ton programme en fait) et que ton programme se connecte lui par contre sur l'IP du serveur de jeu , il faut donc recuperer cette IP (pour que ton programme s'y connecte) et modifier le message 42 avec une IP locale (donc sa longueur change , etc) avant de le renvoyer a ton client
 
Dernière édition:
Haut Bas