Java RawDataMessage, antibot, etc

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Salut, bien que je sois inscrit depuis 2012, ça fait uniquement 3 jours que je code un bot, donc soyez indulgent envers mon ignorance. :3

Dans les échanges avec le serveur, tout est gérable jusqu'au packet 6253 (RawData). À ce que j'ai compris, c'est juste un swf signé:
Code:
_loc2_ = param1 as RawDataMessage;
if(Kernel.getWorker().contains(AuthentificationFrame))
{
    _log.error("Impossible de traiter le paquet RawDataMessage durant cette phase.");
    return false;
}
_loc3_ = new ByteArray();
_loc4_ = new Signature(SIGNATURE_KEY_V1,SIGNATURE_KEY_V2);
_log.info("Bytecode len: " + _loc2_.content.length + ", hash: " + MD5.hashBytes(_loc2_.content));
_loc2_.content.position = 0;
if(_loc4_.verify(_loc2_.content,_loc3_))
{
    _loc8_ = new Loader();
    _loc9_ = new LoaderContext(false,new ApplicationDomain(ApplicationDomain.currentDomain));
    AirScanner.allowByteCodeExecution(_loc9_,true);
    _loc8_.loadBytes(_loc3_,_loc9_);
}
else
{
    _log.error("Signature incorrecte");
}
Pour passer cette protection, est-ce une solution viable de:
  • Décompiler le bytecode avec JPEXS
  • Le parser avec un Lexer as3 minimalist
  • L’exécuter dans l'environnement Java (avec un contrôle total sur tous les appels, et accès aux variables)

Aussi, ce swf change-t-il vraiment régulièrement ? Je le reçois qu'à la connexion. Toujours rien après 4 heures de sniffage et il ne change pas après reco. :s
Quelqu'un a essayé d'envoyer le RawData à un vrai client Dofus et de copier la réponse (CheckIntegrity) ?
Comment gérer cette partie là:
Code:
public function autoSeed() : void
{
    var _loc3_:Font = null;
    var _loc1_:ByteArray = new ByteArray();
    _loc1_.writeUnsignedInt(System.totalMemory);
    _loc1_.writeUTF(Capabilities.serverString);
    _loc1_.writeUnsignedInt(getTimer());
    _loc1_.writeUnsignedInt(new Date().getTime());
    var _loc2_:Array = Font.enumerateFonts(true);
    for each(_loc3_ in _loc2_)
    {
        _loc1_.writeUTF(_loc3_.fontName);
        _loc1_.writeUTF(_loc3_.fontStyle);
        _loc1_.writeUTF(_loc3_.fontType);
    }
    _loc1_.position = 0;
    while(_loc1_.bytesAvailable >= 4)
    {
         this.seed(_loc1_.readUnsignedInt());
    }
}
 
Dernière édition par un modérateur:

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#2
Non, ta solution ne fonctionne pas, essaye et tu verras pourquoi.
Et oui, il est possible de l'envoyer à un vrai client Dofus, et de récupérer la réponse. Le problème réside dans la HASH_FUNCTION que le RDM initialise dans le client lors de son exécution.
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#3
L'idée serais de simuler le client dofus (en AS3) pour calculer la réponse.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
La hashKey change a chaque RawDataMessage.
 
A

Anonymous

Invité
#5
Je suis troublé, j'aimerais pouvoir faire un bot tournant sous linux ne nécessitant pas flash. ;-;
Mais c'est vraiment impossible ? Vu qu'avec cette solution on peut mentir sur l'environnement, en théorie ce genre de bout de code ne devrait pas être un problème:
Code:
dofusInstance = ApplicationDomain["currentDomain"]["getDefinition"]("Dofus")["getInstance"]()["stage"]["loaderInfo"]["applicationDomain"]["getDefinition"]("Dofus")["getInstance"]();
...
var dofusClassDesc:XML = describeType(dofusInstance);
Remarque, il existait une machine virtuelle flash en Java (2010). Ca peut servir de base.
BlueDream a dit:
La hashKey change a chaque RawDataMessage.
Il n'y a que le hashkey qui change ? J'ai toujours pas pu obtenir un RawData qui soit "différent" de ceux d'avant. u.u
 
Dernière édition par un modérateur:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Tout se trouve dans le constructeur, il y a un ensemble de WriteByte un peu partout avec des valeurs différentes à chaque fois.
Il s'agit de la HashKey qui permet le cryptage.

Sinon ton idée n'est pas mauvaise.
 
A

Anonymous

Invité
#7
Je vois, d'ailleurs c'est pas si difficile à faire car il est possible d'utiliser directement l'API de JPEXS sans passer par le code généré (par jFlex).
Je vous tiendrai informé. :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Tiens je ne connaissais pas l'API, merci du partage.
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#9
Moi non plus je ne la connaissais pas, je pensais qu'il fallait absolument passer par JPEX.
 
A

Anonymous

Invité
#10
C'est pas vraiment une API, en théorie. En pratique, JPEXS est open-source et peut facilement être intégré dans un projet Java.
https://www.free-decompiler.com/flash/d ... .1_lib.jar

Il n'y a même pas de documentation.. Voici un exemple d'utilisation de la librairie:
Java:
SWF swf = new SWF(Files.newInputStream(Paths.get("integrity", "2015-08-04-12-41_DE81BBF8CCFE52A2ABE8C6601095A6C7.swf")), progress -> System.out.println("Loading " + progress + "%"), false);
swf.deobfuscate(DeobfuscationLevel.LEVEL_RESTORE_CONTROL_FLOW); // Level max
List<ScriptPack> packs = swf.getAS3Packs();
ScriptPack humanCheck = packs.stream().filter(pack -> pack.getName().equals("HumanCheck")).findFirst().get(); // Cherche le fichier "HumanCheck"
System.out.println(humanCheck.abc.findBodyByClassAndName("HumanCheck", "sendTicket")); // Affiche le bytecode de la méthode sendTicket
 
Dernière édition par un modérateur:
A

Anonymous

Invité
#11
Finalement, je laisse tomber cette idée là. J'ai pas trouvé comment avoir certaines informations sur le client Dofus :/
Je m'y connais pas trop en injection
 
Haut Bas