C/C++ Message antibot id 6253

A

Anonymous

Invité
#1
Bonjour à tous,

J'aurai besoin d'aide pour essayer de passer cette sécurité antibot.
Je reçois donc ce message et je sauvegarde ce fichier SWF sur le disque et une grosse deception est arrivée
lorsque j'ai essayé de l'ouvrir avec JPEXS qui m'a dit que le fichier était corrompu :'( .

Je voudrais donc avoir quelques informations supplémentaires et si possible une petite aide sur comment passer cette sécurité !
Je sais déjà que ce message est de type RawDataMessage et qu'il faut répondre par un CheckIntegrityMessage ( merci le forum pour ça :) ).

Étant donné que je n'arrive pas à ouvrir le code du swf, je ne sais pas vraiment ce qu'il fait et comment simuler ce qu'il fait pour ensuite envoyer un CheckIntegrityMessage vu que je pense qu'il faut renvoyer les données créées par le swf non ?

Je vous remercie d'avance pour l'aide, car là, je bloque sur ce message vu que j'obtiens un swf corrompu :/

PS : Au cas où si ça peut aider, mon fichier swf fait 49 957 octets. Peut être me manque-t-il des choses pour le rendre non corrompu ?
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#2
Salut wamilou (et salut à tous en passant, ça fait un bail), ton fichier SWF n'est pas corrompu en fait, c'est juste qu'il est obfusqué. Moi j'arrive à le lire avec Free Flash Decompiler, mais le contenu est illisible (sous forme de données binaires). Je suis dans l'embarras aussi, je voulais d'ailleurs créer un topic là dessus mais tu m'as devancé. J'aimerais savoir comment le client arrive à exécuter ce SWF alors que nous, nous ne pouvons même pas le lire...
 
A

Anonymous

Invité
#3
Est-ce qu'il y aussi un moyen de bypass l'exécution du swf et ainsi crée quelque chose qui fait les mêmes opérations que ce swf ?
Parce que là je manque d'idée. Normalement, si on connait l'algo pour obsifier, on peut normalement faire l'inverse (tout du moins en Java, je sais que c'est possible mais en AS3 ?!)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
@NicoChefMaster le fichier ne s'ouvre pas parce qu'il est obfusqué mais parce qu'il est signé par ankama. Il suffit de retirer la signature pour pouvoir le lire.
 
A

Anonymous

Invité
#5
Retirer la signature ? Est-ce que ça a un rapport avec la classe SignatureKey et la signature (en binaire) dans les sources Dofus ?
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#6
Un fichier SWF commence par le magic header "CWS", je t'invite a utiliser un éditeur hexa pour vérifier ton fichier (HxD fait très bien l'affaire ici).
Si ce n'est pas le cas, retire toutes les valeur fichier jusqu’à commencer par "CWS".
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#7
Code:
AmaknaCore.Common.IO.BigEndianReader reader = new AmaknaCore.Common.IO.BigEndianReader(data);

            reader.ReadUTF();
            reader.ReadShort();
            reader.ReadBytes(reader.ReadInt());

            System.IO.File.WriteAllBytes(@"C:\Users\Alexandre\Desktop\RolePleyFrame.swf", reader.ReadBytes((int)(data.Length - reader.Position)));
 
A

Anonymous

Invité
#8
C'est le code (en C#) pour avoir le swf, c'est ça ? En retirant manuellement le début du avant le header du swf, j'obtiens en parti le swf mais il reste un peu obsifié mais c'est déjà un bon début.
D'ailleurs, cette partie que j'ai retiré avant le CWS, c'est quoi exactement ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#9
C'est une signature ajouté au début du fichier pour pas que n'importe quel swf soit exécuté par le client.
Enfin c'est très facile à contourner.

Voila comment ankama signe un fichier swf, tu comprendras pourquoi il est nécessaire de faire des reads.

Code:
public function sign(param1:IDataInput, param2:Boolean = true) : ByteArray
      {
         var _loc3_:ByteArray = null;
         if(!this._key.canSign)
         {
            throw new Error("La clef fournit ne permet pas de signer des données");
         }
         else
         {
            if(param1 is ByteArray)
            {
               _loc3_ = param1 as ByteArray;
            }
            else
            {
               _loc3_ = new ByteArray();
               param1.readBytes(_loc3_);
               _loc3_.position = 0;
            }
            var _loc4_:uint = _loc3_["position"];
            var _loc5_:ByteArray = new ByteArray();
            var _loc6_:uint = Math.random() * 255;
            _loc5_.writeByte(_loc6_);
            _loc5_.writeUnsignedInt(_loc3_.bytesAvailable);
            var _loc7_:Number = getTimer();
            _loc5_.writeUTFBytes(MD5.hash(_loc3_.readUTFBytes(_loc3_.bytesAvailable)));
            trace("Temps de hash pour signature : " + (getTimer() - _loc7_) + " ms");
            var _loc8_:uint = 2;
            while(_loc8_ < _loc5_.length)
            {
               _loc5_[_loc8_] = _loc5_[_loc8_] ^ _loc6_;
               _loc8_++;
            }
            var _loc9_:ByteArray = new ByteArray();
            _loc5_.position = 0;
            this._key.sign(_loc5_,_loc9_,_loc5_.length);
            var _loc10_:ByteArray = new ByteArray();
            _loc10_.writeUTF(ANKAMA_SIGNED_FILE_HEADER);
            _loc10_.writeShort(1);
            _loc10_.writeInt(_loc9_.length);
            _loc9_.position = 0;
            _loc10_.writeBytes(_loc9_);
            if(param2)
            {
               _loc3_.position = _loc4_;
               _loc10_.writeBytes(_loc3_);
            }
            return _loc10_;
         }
      }
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#10
D'accord, donc d'après ce que j'ai compris, il suffit de faire l'opération inverse pour déchiffrer le SWF. Merci beaucoup pour cette piste !

En passant, wamilou tu auras besoin de ce bout de code important situé dans ServerControlFrame.as (si tu ne l'as pas déjà vu) :
Code:
case param1 is RawDataMessage:
               _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);
               _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");
               }
               return true;
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#11
Non le reste ne sert a rien. C'est propre à l'action script.
Tout ce que ta a savoir c'est la signature a retire et le swf a executer.
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#13
En passant, @wamilou, tu me donne la définition de "obsifié" ? ><
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#16
Le reste c'est tout ce qui est après la signature.
 
A

Anonymous

Invité
#17
Donc si j'ai bien compris, on "déchiffre" le swf, on l'exécute puis on récupère les valeurs qu'il produit dans sa "console" de sortie ?
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#18
Si seulement c'était aussi simple qu'une exécution... :D
Monsieur veut exécuter du flash en C++ ?
Et pas besoin de le déchiffrer.
 
A

Anonymous

Invité
#19
Justement, je demande comment il fait pour récupérer les données à envoyer, parce que j'ai 2 solutions :
- Soit c'est la sortie "console", dans ce cas-là j'exécute le swf dans un processus de flash player
- Soit c'est par un autre moyen et là je suis un chouilla emmerdé x)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#20
T'es un chouilla emmerdé :)

Mais ya encore une autre solution mais comme je suis sadique je ne la citerais pas
 
Haut Bas