tazman59
Salut, déjà depuis pas mal de versions il est impossible de modifier les Ip et les Ports du serveur de connexion depuis le fichier de configuration.
- Tu peux déjà chercher dans les sources quelle classe connecte le client et changer les paramètres de la fonction connect() en mettant en ip de connection "120.0.0.1" par exemple (pour du MITM). Voilà un premier patch possible.
- Un second patch, toujours pour la connexion, serait de supprimer la vérification de la clef (je ne me souviens plus de son nom) qui se trouve dans la config et qui empêche de modifier les Ip et Ports.
Néanmoins fais attention si tu patch un client à jour et que tu essayes de te connecter, car Ankama punit le fait de modifier ses fichiers :teeth:
Bonjour,
Pour patch la vérification de la signature, j'ai essayé de m'attaquer a la fonction verify() du module de crypto mais c'est vraiment vraiment galère (elle est subdivisé en 3 fonction verify, verifyV1 et verifyV2). Du coup j'ai été check la fonction process() de la frame AuthentificationFrame et plus précisément la case LoginValidationAction. J'ai réussi a me bloquer l'access au serveur Ankama mais pas à ouvrir l'access au mien.
De ça:
case msg is LoginValidationAction:
lva = LoginValidationAction(msg);
GuestModeManager.getInstance().isLoggingAsGuest = lva is LoginValidationAsGuestAction;
if(this._lastLoginHash != MD5.hash(lva.username))
{
this._streamingBetaAccess = false;
UiModuleManager.getInstance().isDevMode = XmlConfig.getInstance().getEntry("config.dev.mode");
}
this._lastLoginHash = MD5.hash(lva.username);
connexionPorts = new Array();
ports = XmlConfig.getInstance().getEntry("config.connection.port");
for each(porc in ports.split(","))
{
connexionPorts.push(int(porc));
}
connectionHostsEntry = XmlConfig.getInstance().getEntry("config.connection.host");
if(BuildInfos.BUILD_TYPE < BuildTypeEnum.INTERNAL)
{
connectionHostsSignatureEntry = XmlConfig.getInstance().getEntry("config.connection.host.signature");
output = new ByteArray();
try
{
signedData = Base64.decodeToByteArray(connectionHostsSignatureEntry);
}
catch(error:Error)
{
_log.warn("Host signature has not been properly encoded in Base64.");
commonMod.openPopup(I18n.getUiText("ui.common.error"),I18n.getUiText("ui.popup.connectionFailed.unauthenticatedHost"),[I18n.getUiText("ui.common.ok")]);
KernelEventsManager.getInstance().processCallback(HookList.SelectedServerFailed);
return false;
}
signedData.position = signedData.length;
signedData.writeUTFBytes(connectionHostsEntry);
signedData.position = 0;
signature = new Signature(SignedFileAdapter.defaultSignatureKey);
validHosts = signature.verify(signedData,output);
if(!validHosts)
{
_log.warn("Host signature could not be verified, connection refused.");
this.commonMod.openPopup(I18n.getUiText("ui.common.error"),I18n.getUiText("ui.popup.connectionFailed.unauthenticatedHost"),[I18n.getUiText("ui.common.ok")]);
KernelEventsManager.getInstance().processCallback(HookList.SelectedServerFailed);
return false;
}
}
connexionHosts = connectionHostsEntry.split(",");
...
Je peux passer a ça très facilement mais apparemment c'est pas suffisant:
validHosts = signature.verify(signedData,output);
if(false)
{
_log.warn("Host signature could not be verified, connection refused.");
this.commonMod.openPopup(I18n.getUiText("ui.common.error"),I18n.getUiText("ui.popup.connectionFailed.unauthenticatedHost"),[I18n.getUiText("ui.common.ok")]);
KernelEventsManager.getInstance().processCallback(HookList.SelectedServerFailed);
return false;
}
}
Merci en tout cas pour la réponse.