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é:
Cliquez pour révéler
Cliquez pour masquer
_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à:
Cliquez pour révéler
Cliquez pour masquer
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());
}
}