VB/VB.Net Projet: MITM aide aux chasses au trésor

Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#1
Bonjour,

je suis tout nouveau dans le monde du bot, donc j'ai certainement beaucoup de lacunes...
Je demande donc un peu d'indulgence :)

Voilà mon projet:

Description:
Un outil fonctionnant en MITM. Le principe sera que, lorsqu'on lance une chasse au trésor,
il devra mettre la position de l'indice sur la carte.

+ Lorsqu'un indice n'est pas dans la base de donnée, mais est validé à la fin d'une étape, il faut l'ajouter (tout en évitant les gens mal intentionnés qui voudront ajouter des fausses positions d'indices)
+ Je pense qu'il est possible de détecter si un Phoreur est sur une map, donc il faut mettre une petite alerte lorsqu'on passe sur la bonne map.


(+) éventuellement, remplir une base de donnée pour savoir où les indices ne sont pas (à défaut de avoir où il sont, au début), c.à.d. début en pos [0,0] on trouve l'indice en [0,5] donc l'indice n'est pas en [[0,1],[0,4]].
(+) Je pense que c'est faisable aussi: lorsqu'on se déplace, si on est dans une zone aggro, le bot modifie notre déplacement pour éviter les groupes de mobs qui agressent.


Et là on devrait avoir un plutôt bon outil bien pratique

Je suis ouvert à tout conseil, toute aide, toute critique
N'hésitez pas :D
 
Inscrit
22 Octobre 2011
Messages
34
Reactions
0
#2
J'avais fait un MITM pour les chasses au trésor quand elles étaient encore dans leur première version (sans phoreur etc), en faisant des requêtes vers beta.dofusmap.fr, qui avait une base de données des indices. Ça marchait plutôt bien, mais la base de données n'était pas complète donc il y avait des risques d'erreur, et puis par la suite ils ont un peu changé le fonctionnement des chasses, rendant le site inutilisable (d'ailleurs je viens de constater qu'il n'existe plus).

Je me suis souvent demandé s'il y avait moyen de répertorier les indices uniquement en lisant les fichiers binaires des maps du client, et je pense que oui. Tu devrais chercher dans cette direction, ça permettrait d'avoir quelque chose qui fonctionne à coup sûr, et surtout qui n'a pas besoin d'un serveur externe pour fonctionner.
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#3
ça pourrait être une excellente solution, jvais creuser la question en m'intéressant à comment les maps sont affichées (faut bien commencer quelque part :p)
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#4
Tout compte fait, je ne pense pas que ça soit utile
Notamment parce qu'on peut trouver certains indices sous plusieurs formes (ex. Pierres précieuse),
et parce qu'à certaines formes peuvent correspondre plusieurs indices (ex. Fourche => Outil, Fourche)
Donc si jamais on arrivait à extraire les éléments d'une map, il faudrait traiter tous les éléments de D.
et leur assigner le nom de tous les indices auxquels ils peuvent correspondre...

J'vais me pencher sur la partie MITM pour l'instant,
c'est tout nouveau pour moi et il y a plusieurs points que je ne comprends pas trop,
mais bon, je fais ce projet pour apprendre hein ? :)

Déjà j'ai trouvé un cours sur l'injection DLL: http://xevia.webege.com/old/atoray/2010/06180.php
Ensuite j'ai trouvé l'article de Sorrow sur les Hook: https://yann.voidmx.net/blog/post/minih ... lternative

C'est assez difficile de tout comprendre, je n'ai jamais fait de C/C++, et vu que ça va sans doute être un de mes cours
au semestre prochain, j'vais aller voir ce qu'on peut faire avec ces langages ^^
 
Inscrit
22 Octobre 2011
Messages
34
Reactions
0
#5
Oui c'est le principe, mais ça sera toujours mieux qu'une base de données communautaire car a priori, avec un peu de temps et de travail derrière, tu auras moyen d'être exhaustif.

Tu n'as pas besoin de savoir explicitement comment fonctionne l'injection de DLL pour contourner les sécurités du client, il suffit que tu utilises les outils déjà faits distribués par Sorrow par exemple.
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#7
Yep je sais, je l'ai déjà téléchargée,
c'est juste que ça m'embête assez d'utiliser des outils que je comprends pas/peu ^^

Modération: Merci de ne pas citer le dernier message du sujet.
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#8
J'ai bidouillé un peu, j'ai réussi à faire un injecteur automatique, j'arrive à patcher le client et récupérer la connexion, le client se connecte,
mais par contre c'est après que j'ai un problème:
Voici ce que je fais:

Le client se connecte, j'accepte la connexion, j'instancie ma form 'gestion des comptes', qui elle même instancie la classe 'GestionNetwork' qui prends en argument la socket crée à l'acceptation
Dans ma classe gestion network je paramètre la connexion au serveur D. puis j'écoute le client et j'écoute le serveur dans 2 threads différents.
à chaque fois que je reçois un paquet du serveur je l'envoie au client, et quand je reçois un paquet du client je l'envoie au serveur..

Et ça ne marcheu pas . . . ^^

Je pense comprendre que ça vient du fait qu'il doit y avoir un changement de serveur ou un truck du genre, nope ?
OU alors, vu que je viens d'apprendre les Sockets, il y a un surement un truck que j'ai pas bien compris (et qui peut être flagrant pour qqn avisé)
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#9
Tu as vu juste, il y a un changement de serveur à faire, pour pouvoir travaillé plus facilement, va sur Dofus, ouvre les petites options en dessous du bouton "Jouer" Et sélectionne "Choix du serveur".

Il va falloir que tu modifie un packet. Je te laisse réfléchir un petit peux, si tu as une question hésite pas :)
ps : Regarde le code source de dofus, il te permettra de comprendre la structure des packets
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#10
Edit: j'ai compris ce que tu voulais dire


C'est le paquet 42 où il faut récupérer IP et port du serveur c'est ça ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#11
Ahah, attention au tiquet il est crypté en AES-256.
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#12
Il fait un MITM, on s'en fous du ticket, le client se charge de tous :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#13
Oui c'est vrai mais en laissant le client faire tu ne peux pas associer un client login a un client game.
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#14
J'ai pas beaucoup avancé ce week end,
mais j'ai quand même une question:

Edit: avant lecture du code: ce qu'il faut remarquer, c'est que je déclenche les évènements dans "compteNetwork"
dans des sub que j'appelle dans des threads différents parce que ce sont elles qui écoutent le serveur et le client
Ce qui fait que les sub sont aussi exécutées dans les threads, et du coup je suis obligé d'utiliser des delegate (Me.Invoke)


D'un côté j'ai ma classe 'CompteNetwork'
avec:
Code:
Private Sub _listeningThreadClient()
        Dim buffer() As Byte
        Dim receiverbuffer() As Byte
        Dim bufferSize As Integer

        While (True)
            ReDim receiverbuffer(1000)
            bufferSize = socketClient.Receive(receiverbuffer)
            'Là je sais que je dois fermer la connexion si bufferSize==0
            'Mais j'ai pas encore fait la méthode qui ferme la connexion
            ReDim buffer(bufferSize)
            Array.Copy(receiverbuffer, 0, buffer, 0, bufferSize)
            RaiseEvent packetServerReceived(buffer)
        End While
    End Sub

    Private Sub _listeningThreadServer()
        Dim buffer() As Byte
        Dim receiverbuffer() As Byte
        Dim bufferSize As Integer

        While (True)
            ReDim receiverbuffer(1000)
            bufferSize = socketServeur.Receive(receiverbuffer)
            'idem ici
            ReDim buffer(bufferSize)
            Array.Copy(receiverbuffer, 0, buffer, 0, bufferSize)
           RaiseEvent packetClientReceived(buffer
        End While
    End Sub
   Public Event packetClientReceived(b() As Byte)
    Public Event packetServerReceived(b() As Byte)
Et d'un autre côté j'ai ma form

Code:
Public Class Compte
    Private WithEvents myAccount As CompteNetwork
    Public Delegate Sub atPacketClientReceived(b() As Byte)
    Public Delegate Sub atPacketServeurReceived(b() As Byte)

    Sub New(ByVal s As Socket)
        ' Cet appel est requis par le concepteur.
        InitializeComponent()
        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        myAccount = New CompteNetwork(s)
        myAccount.Start()
    End Sub

    Private Sub packetReceivedFromClient(b() As Byte) Handles myAccount.packetClientReceived
      Me.Invoke(New atPacketClientReceived(AddressOf doAtPacketClientReceived), b)
    End Sub
    Private Sub packetReceivedFromServer(b() As Byte) Handles myAccount.packetServerReceived
       Me.Invoke(New atPacketServeurReceived(AddressOf doAtPacketServeurReceived), b)
    End Sub

    Public Sub doAtPacketClientReceived(b() As Byte)
        myAccount.sendToServer(b)
    End Sub
    Public Sub doAtPacketServeurReceived(b() As Byte)
        myAccount.sendToClient(b)
    End Sub
End Class
ça fonctionne, mais les Delegate là, c'est pas propre,
j'aimerais pouvoir utiliser les fonctions qui écoutent les évènements de la classe sans avoir à passer par une autre fonction,
et je sais pas du tout comment faire ^^
(en gros là les fonctions qui écoutent les évènements, elles sont appelées dans les threads qui écoutent serveur et client, du coup ya des erreurs)
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#15
Salut, pour résoudre simplement ton "problème" :

L'async ( https://msdn.microsoft.com/en-us/librar ... 8(v=vs.110).aspx )
ça ne résoudra pas le problème de "propreté" qui n'en n'est pas vraiment un, le code est propre (sauf while true).
Enfin, tu pourrais utilisé un seul Delegate vu qu'ils ont la même signature, mais c'est du chipotage ça :)

Bonne chance
 
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#16
J'ai bloqué sur l'architecture.. je ne m'y connais pas encore assez pour faire un truck propre sans bugs ..
Gérer les combats, l'IA, les informations sur le compte et 'petites actions' (supprimer item, tchat, etc..), gérer les chasses (activer/désactiver/paramétrer) je sais pas comment modéliser ça.
En + j'ai changé d'école et je ne fais plus d'informatique pour l'instant (enfin si ... du PHP / SQL (et un peu d'UML), mais ça suffit pas, c'est survolé),
et le rythme est assez soutenu du coup j'ai plus trop le temps de faire ce projet (ni l'envie en fait :/)

Mais en attendant j'ai chopé une BDD d'indices de chasse au trésor avec pas mal d'indices,
il y a beaucoup de fausses positions et il en manque pas mal du coup j'ai fait un petit outil pour pouvoir
avoir les indices sous la main et je corrige petit à petit la BDD.

D'ailleurs si qqn veut un projet jpeux filer la BDD pour faire ça (j'ai environ 15000 indices référencés, et ça fonctionne plutôt pas mal actuellement, taux d'exactitude à environ 75/80 %)
1/ S'enregister zaap Champs Bonta

2/ Aller chercher Chasse (4/5 actions)

3/ Déterminer zaap le plus proche du début(en fonction des zaap connus, et de quelques exceptions,
ou sinon on remarque que les maps de départ sont +- les mêmes tout le temps, il doit y avoir 30 spots max)

4/ Utiliser potion de rappel et utiliser le zaap pour se rendre au zaap déterminé en (3)

5/ Déterminer un trajet pour aller à l'emplacement de départ (ou pas, cf.(3))

6/ Trouver l'indice dans la BDD, y aller (il y a 2-3 exceptions à gérer genre château amakna sortie nord, sortie sud bonta, etc..)
Si pas d'indice ou erreur: soit-> Tenter aléatoirement ; ou -> demander à l'utilisateur de trouver l'indice : ajouter à la BDD si trouvé, et éventuellement supprimer l'ancien indice. Si l'indice est un phorreur : aucune idée >< mais je suppose que l'info doit être dans un paquet envoyé au chargement d'une map, donc il suffit de bouger dans la direction indiquée

8/ Combat assez chaud donc je pense qu'il faut laisser l'utilisateur faire le combat
L'IA est assez difficile:
il faut se rapprocher du coffre tout le temps et le taper si possible (sauf si la vie de notre personnage est inférieur à (NbToursAvantRecons*DegatsFinDeTour + DegatsDuSortSurLeCoffre), mais si la map est bizarre et que le coffre a plus de PM que notre personnage, bah ça devient plus compliqué, puisqu'il va falloir déterminer la meilleure façon de se rapprocher du mob sachant qu'il va toujours s'éloigner de nous.. je ne m'y connais pas trop en IA, mais ça ressemble pas mal à de l'essai/echec
 
Haut Bas