Autre Hash_Function 2.34

Inscrit
10 Mai 2015
Messages
357
Reactions
55
#1
Bonjour tout le monde, hier soir après avoir fait la mise à jour, j'essaie de me déplacer et je vois que le hash_Function est définitif.
Tout simplement en enregistrant les logs j'obtient une erreur :

[21:35:23:730] [ServerControlFrame] Bytecode len: 5927, hash: 59902655bf3fe033444a7b339eb6b5be
[21:35:23:741] [ServerControlFrame] Signature incorrecte
[21:35:23:742] [ConnectionsHandler] Resume connection

Je décide donc de TENTER de m'attaquer à cette sécurité :

Je regarde où s’exécute le RawDataMessage, je trouve ceci :

JavaScript:
      public function process(param1:Message) : Boolean
      {
         var _loc2_:RawDataMessage = null;
         var _loc3_:ByteArray = null;
         var _loc4_:Signature = null;
         var _loc5_:URLOpenMessage = null;
         var _loc6_:Url = null;
         var _loc7_:TrustStatusMessage = null;
         var _loc8_:Loader = null;
         var _loc9_:LoaderContext = null;
         var _loc10_:URLRequest = null;
         var _loc11_:MiscFrame = null;
         var _loc12_:OptionalFeature = null;
         switch(true)
         {
            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_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
               {
                 [B] _log.error("Signature incorrecte");[/B]
               }
               return true;
            case param1 is URLOpenMessage:
               _loc5_ = param1 as URLOpenMessage;
               _loc6_ = Url.getUrlById(_loc5_.urlId);
               switch(_loc6_.browserId)
               {
                  case 1:
                     _loc10_ = new URLRequest(_loc6_.url);
                     _loc10_.method = _loc6_.method == ""?"GET":_loc6_.method.toUpperCase();
                     _loc10_.data = _loc6_.variables;
                     navigateToURL(_loc10_);
                     return true;
                  case 2:
                     KernelEventsManager.getInstance().processCallback(HookList.OpenWebPortal,WebLocationEnum.WEB_LOCATION_OGRINE);
                     return true;
                  case 3:
                     return true;
                  case 4:
                     if(HookList[_loc6_.url])
                     {
                        _loc11_ = Kernel.getWorker().getFrame(MiscFrame) as MiscFrame;
                        _loc12_ = OptionalFeature.getOptionalFeatureByKeyword("game.krosmasterGameInClient");
                        if(Boolean(_loc11_ && _loc12_) && Boolean(!_loc11_.isOptionalFeatureActive(_loc12_.id)) && HookList.OpenKrosmaster == HookList[_loc6_.url])
                        {
                           _log.error("Tentative de lancement de Krosmaster, cependant la feature n\'est pas active");
                           return true;
                        }
                        KernelEventsManager.getInstance().processCallback(HookList[_loc6_.url]);
                     }
                     return true;
                  default:
                     return true;
               }
            case param1 is TrustStatusMessage:
               _loc7_ = param1 as TrustStatusMessage;
               SecureModeManager.getInstance().active = !_loc7_.trusted;
               PlayerManager.getInstance().isSafe = _loc7_.certified;
               return true;
            default:
               return false;
         }
      }
On retrouve mon erreur dans les logs.
J'ai alors decompiler le RawDataMessage

et je me suis interréssé à la fonction addencryptedHash

JavaScript:
  public function addCryptedHash(param1:ByteArray) : void
      {
         var _loc5_:Object = null;
         var _loc6_:ByteArray = null;
         if(!this._hashKey)
         {
            _loc5_ = getDefinitionByName(§_a_-_---§.§_a_--_--§(-1820302812));
            _loc6_ = new ByteArray();
            _loc7_["writeUTF"](!!_loc5_["getInstance"]()["gameServerTicket"]?_loc5_["getInstance"]()["gameServerTicket"]:"");
          [B]  this._hashKey = HumanCheck["hash"](_loc6_);[/B]
         }
         var _loc2_:ByteArray = new ByteArray();
         _loc2_["writeBytes"](HumanCheck["hash"](param1));
         _loc2_["position"] = 0;
         var _loc3_:_SIHHGXMLXX = new _SIHHGXMLXX();
         var _loc4_:_SMEXDOWIEM = new _SMEXDOWIEM(new _SMDXWXGLMM(new _SEDMDWDHGEE(this._hashKey),_loc3_));
         _loc3_["setBlockSize"](_loc4_["getBlockSize"]());
         _loc4_["encrypt"](_loc2_);
         param1["position"] = param1["length"];
         param1["writeBytes"](_loc2_);
      }
Sachant que je suis en MITM il me semble que this._hashKey = HumanCheck["hash"](_loc6_); est assez important pour mon hash
JavaScript:
 if(HASH_FUNCTION != null)
         {
            HASH_FUNCTION(_loc2_);
         }

public static var HASH_FUNCTION:Function;

Mais je ne trouve pas ou cette fonction est assigné.

Et je ne comprends pas pourquoi quand je désérialise ce que le CLIENT envoie j'ai les bonnes valeurs.
 
Dernière édition:
Inscrit
18 Février 2015
Messages
228
Reactions
7
#2
J'ai patché le raw data pour eviter d'avoir ce probleme


tu dois retirer la condition et mettre la loc3 = à loc2.content
pour pouvoir executer ce que tu envoi via le RawDataMessage

à retirer :
JavaScript:
if(Kernel.getWorker().contains(AuthentificationFrame))
               {
                  _log.error("Impossible de traiter le paquet RawDataMessage durant cette phase.");
                  return false;
               }
à retirer aussi :
Code:
if(_loc4_.verify(_loc2_.content,_loc3_))
               {
}
ça aussi

JavaScript:
               else
               {
                 [B] _log.error("Signature incorrecte");[/B]
               }
et tu change ça
JavaScript:
_loc3_ = new ByteArray();
par ça
Code:
_loc3_ = _loc2_.content;
 
Dernière édition:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#3
Merci pour ta réponse mais tu modifies le client et il me semble que les modos peuvent trouver ça.
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#5
Je sais pas bien mais je sais qu'ils ont acces à ces infos et toutes façons même en faisant ça je n'arrive pas à me déplacer. j'ai regardé de mes logs je n'ai rien. et apres le click souris impossible de se déplacer egalement je dois me deconnecter/reconnecter comme avant (même effet).
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#6
Les modos peuvent envoyer des "CheckFileRequestMessage" demandant le hash MD5 de la taille d'un fichier ou du contenu du fichier. Si tu as modifié ce fichier, il le détectera et te bannira. Mais les modos sont assez peu souvent connectés (du moins sur le serveur sur lequel je fais mes tests) et il est possible de les éviter.
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#7
Ok mais personne sait pourquoi ce que le client envoie j'arrive à le lire même apres le hashfunction effectué par le client
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Les modos peuvent envoyer des "CheckFileRequestMessage" demandant le hash MD5 de la taille d'un fichier ou du contenu du fichier. Si tu as modifié ce fichier, il le détectera et te bannira. Mais les modos sont assez peu souvent connectés (du moins sur le serveur sur lequel je fais mes tests) et il est possible de les éviter.
Exactement sachant que les modérateurs ont des outils qui demandent automatiquement le CheckFileRequestMessage à chaque joueur qu'il rencontre.
 
Haut Bas