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 :
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
{
_log.error("Signature incorrecte");
}
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
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"]:"");
this._hashKey = HumanCheck["hash"](_loc6_);
}
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
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.