C# Patch le dofus invoker

Inscrit
17 Avril 2015
Messages
119
Reactions
0
#1
Bonjour,

J'aimerais me lancer dans l’émulation. J'ai donc créé une base pour la connexion au client & base de données. Mais il se trouve que dans le IdentificationMessage les creditials sont encodé en RSA.

Donc si j'ai bien compris, pour décrypter il faut la clef priver que je stock et donc créer à partir d'elle un publique que j'envoie.

La version du client est 2.45

J'ai donc essayer ce code là :

C#:
        public byte[] RsaEncryptWithPrivate()
        {
            var publicKey = @"-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCB37S6s7qBiND8N7njOFJRhrAB
QoIKWeMqSZpkJj90+E1Dw+h6nCliAoJMxB1mWJxY6VLvN8muOCjTndYGRcIOLV5H
da/DaTn4yGIPq01Z47XkplIaozHjpk+6R7bAYUJVraeG2mh5Y61B6ChoHuIexdD+
q49DGoK7379HMW6WQQIDAQAB
-----END PUBLIC KEY-----";
            var privateKey = @"-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCC51pxd4zO9HFxCgl6ely+6R/lZ01S7orDBbYAfx7QLVMQCDWt
tAYv//wAcsrwD6wOs4kDYhnF8GF6niehlTc7+2yiF74sUBr1d8bczffXLF+URL8h
N1KFGwz+d8gVmz8X1yMA5WdpcKQ/ptJwmqCmcT/Q1r5HYPimvZ4boANBZQIDAQAB
AoGAOm4UM9OeGX6I6GEHjBD0Nw8N+rLak+sAKz7wV1ZmpZulmOFhPHC/1ksX7AdR
SEhmj4VZ4hW21WCP0lCn9fsJ1OYmgUzSM6excyedPGLI2BwyMOP52DKwSaNk9Kmo
tJsCMAKRWiZbo2888OrpoShilBUevmOe8TRoCUew47clcz0CQQDuV34zLOjFT8P4
LNMEadiPovOj+avygR0ZlOinJU+xZ0j0XQZjaFTbFIIN78cZ/apu9X0x8DBKxK9r
vdBLzMqPAkEAjJojOZKUw2nPlsoA90TlenShWBp1FJOwjmlNypFoiA73kFDl76j4
U9qY7AsrxfdeVyuNjCra1xQEn8T6Y3A+ywJBAOLlnBiv6jDczN0YHxMWiLnFEVjL
OOw2CjPuVMW6eXGTuBoZ7Rj5m76seVs3Jz4RBQ142uSNmguzzqQtIXznyvUCQA9v
FBLLzlytDsaEohqCi5Ynm1ZqgROjKqxXTty/nXPiALbsynDGYYwC4Op4R3PRtZ9n
/n+2bJNTdTZ8jue/eIUCQQCMUqnmiYlpNOC1ngSLz7MYwhTO+OOJEJ9t4zWFQZ5S
S8m4+WDFZUrUOX0Kuxk9r8r9PqDG2cJZZclk3EvdYnpM
-----END RSA PRIVATE KEY-----";

            var partial =
    publicKey.Remove(publicKey.IndexOf("-----END PUBLIC KEY-----", StringComparison.Ordinal))
        .Remove(0, "-----BEGIN PUBLIC KEY-----\n".Length);

            var bytesToEncrypt = Convert.FromBase64String(partial);


            var encryptEngine = new Pkcs1Encoding(new RsaEngine());

            using (var txtreader = new StringReader(privateKey))
            {
                var keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();

                encryptEngine.Init(true, keyPair.Private);
            }

            var encrypted = encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length);
            return encrypted;
        }
Mais le client me donne une erreur sur la clef.
Je suis totalement bloqué, je ne comprends vraiment pas pourquoi puisque normalement cette clef est de la bonne taille si je me trompe pas.
Si une personne voit mon erreur ? :)
Merci​
 
Dernière édition:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#2
Tu es certains d'avoir patch la clef public du client? Sinon montres nous la façon dont tu génères le HelloConnectMessage.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#3
J'ai finalement décidé de modifier le dofusinvoker pour envoyer les identifiants en clair.
Simplement j'ai vue que je pouvais le faire en les passants dans le paramètre lang
Code:
public function getIdentificationMessage() : IdentificationMessage
      {
         var _loc2_:IdentificationMessage = null;
         var _loc3_:String = null;
         var _loc4_:Array = null;
         var _loc5_:IdentificationAccountForceMessage = null;
         var _loc1_:uint = BuildInfos.BUILD_VERSION.buildType;
         if(AirScanner.isStreamingVersion() && BuildInfos.BUILD_VERSION.buildType == BuildTypeEnum.BETA)
         {
            _loc1_ = BuildTypeEnum.RELEASE;
         }
         if(this._lva.username.indexOf("|") == -1)
         {
            _loc2_ = new IdentificationMessage();
            if(this._lva is LoginValidationWithTicketAction || this.nextToken)
            {
               _loc3_ = !!this.nextToken?this.nextToken:LoginValidationWithTicketAction(this._lva).ticket;
               this.nextToken = null;
               this.ankamaPortalKey = this.cipherMd5String(_loc3_);
               _loc2_.initIdentificationMessage(_loc2_.version,XmlConfig.getInstance().getEntry("config.lang.current"),this.cipherRsa("   ",_loc3_,this._certificate),this._lva.serverId,this._lva.autoSelectServer,this._certificate != null,true);
            }
            else
            {
               this.ankamaPortalKey = this.cipherMd5String(this._lva.password);
               _loc2_.initIdentificationMessage(_loc2_.version,this._lva.username + "@" + this._lva.password,this.cipherRsa(this._lva.username,this._lva.password,this._certificate),this._lva.serverId,this._lva.autoSelectServer,this._certificate != null,false);
            }
            _loc2_.version.initVersionExtended(BuildInfos.BUILD_VERSION.major,BuildInfos.BUILD_VERSION.minor,BuildInfos.BUILD_VERSION.release,BuildInfos.BUILD_REVISION,BuildInfos.BUILD_PATCH,_loc1_,!!AirScanner.isStreamingVersion()?uint(ClientInstallTypeEnum.CLIENT_STREAMING):uint(ClientInstallTypeEnum.CLIENT_BUNDLE),!!AirScanner.hasAir()?uint(ClientTechnologyEnum.CLIENT_AIR):uint(ClientTechnologyEnum.CLIENT_FLASH));
            return _loc2_;
         }
         this.ankamaPortalKey = this.cipherMd5String(this._lva.password);
         _loc4_ = this._lva.username.split("|");
         _loc5_ = new IdentificationAccountForceMessage();
         _loc5_.initIdentificationAccountForceMessage(_loc5_.version,XmlConfig.getInstance().getEntry("config.lang.current"),this.cipherRsa(_loc4_[0],this._lva.password,this._certificate),this._lva.serverId,this._lva.autoSelectServer,this._certificate != null,false,0,null,_loc4_[1]);
         _loc5_.version.initVersionExtended(BuildInfos.BUILD_VERSION.major,BuildInfos.BUILD_VERSION.minor,BuildInfos.BUILD_VERSION.release,BuildInfos.BUILD_REVISION,BuildInfos.BUILD_PATCH,_loc1_,!!AirScanner.isStreamingVersion()?uint(ClientInstallTypeEnum.CLIENT_STREAMING):uint(ClientInstallTypeEnum.CLIENT_BUNDLE),!!AirScanner.hasAir()?uint(ClientTechnologyEnum.CLIENT_AIR):uint(ClientTechnologyEnum.CLIENT_FLASH));
         return _loc5_;
      }
Mais maintenant le client reçoit le packet mais ne répond rien
Je suis totalement bloqué.
 
Haut Bas