Forums Développement Multimédia

Aller au contenu

Protéger swf des injections

injection swf serveur as3

10 réponses à ce sujet

#1 Kazuichi

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 24 August 2016 - 19:10 PM

Salut,

Je possède un jeu en ligne, et le client est un swf. Je sais que Flash coule, que le html5 prend la relève, etc, mais j'aurais quand même besoin d'une solution autre que "change de plateforme" lol...

Il existe un logiciel, "charles", qui permet de remplacer un swf de mon site par un swf local. Celui-ci s’exécute.
J'ai tenté de placer une sécurité qui mesure le poids du swf, ce qui permet de continuer ou non l'exécution, mais elle a été contournée (par une fausse variable de poids envoyée dans le client modifié)... Et rien ne permet à mon serveur de savoir si le client a été remplacé ou pas.

Je ne peux pas utiliser d'obfuscateurs, car mon swf fait le lien avec d'autres swf pour recevoir des données, et une fois les noms obfusqués, ils ne peuvent plus communiquer entre eux.

Quelqu'un aurait-il déjà été confronté à ce problème ?

Merci.

#2 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 25 August 2016 - 15:04 PM

bonjour et bienvenue sur mediabox
je ne sais pas ce que fait ton jeu mais pour un jeu en ligne, que ce soit en flash, javascript, java, c++.......
ce n'est jamais le client qui envoie les scores, objets gagnés....
c'est toujours le serveur qui fait le calcul, qui dis si oui ou non c'est possible, tu fait un jeu type pokemon go, ce n'est pas le client qui dis si tu as attrapé ou non le pokemon, c'est le serveur.
dernierement j'ai fait un jeu en JS, le gardien de but envoie aléatoirement des ballons ou des obsatcles, les ballons te rapporte des points, les obstacles t'en font perdre.
Sauf que le jeu n'est pas du tout aléatoire, le serveur m'envoie un chiffre qui me permet via une fonction mathématique de générer des nombre pseudo-aléatoire, lorsque le client joue le calcul des points se fait coté client, sauf que j'enregistre tout les click de la souris
à la fin j'envoie au serveur le score et l'ensemble des clicks
coté serveur, comme je connais le nombre de départ qui m'a permis de générer mon niveau et que je connais tous les cliks user, je peux refaire toute la partie et verifier que je retombe sur le même score dans des bonnes conditions (il ne peux pas finir le niveau en 1s)

et sinon au moins vérifier que ce qu'envoie le client est plausible

a+

#3 Kazuichi

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 25 August 2016 - 20:24 PM

Salut, et merci pour ta réponse !
Je pense que je me suis fait mal comprendre lol.
Ne t'en fais pas, mon jeu fonctionne parfaitement bien depuis quelques années déjà.
Je reformule : comment éviter l'injection swf ?
J'ai bien essayé une vérification qui pèse le poids en byte du client (dans le client), qui donne l'autorisation de continuer son chargement ou non
while (_loc4_ < 10) {
         if(infoLoader.bytes[458500 + _loc4_] != _loc2_[_loc4_]) {
                  _loc3_ = false;
                  break;
         }
}
Donc en gros, on vérifie si le poids du loader est différent de certaines valeurs de l'Array _loc2_, choisies par _loc4_, dans une boucle. _loc3_ permet de continuer ou non.
Le soucis, c'est qu'une fois le client décompilé, des personnes mal intentionnées se contentent simplement de faire ceci :
while (_loc4_ < 10) {
         if(infoLoader.bytes[458500 + _loc4_] != _loc2_[_loc4_]) {
                  _loc3_ = true;
                  break;
         }
}
 
La vérification est alors inutile...

Comment faire pour vérifier que le client n'a pas été modifié ? Par n'importe quel moyen, php éventuellement, je ne sais pas...

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7004 messages

Posté 25 August 2016 - 22:20 PM

Bonsoir,

Citation

J'ai bien essayé une vérification qui pèse le poids en byte du client (dans le client)

Si tu fais tes tests de sécurités dans le client, aucune protection ne sera réellement fiable.

Pour la partie injection, il faut voir comment fonctionne le soft ("charles") et ce qu'il fait réellement.

Pour la partie protection du client, en dehors de l’obfuscation je ne sais pas si il existe une solution fiable, mais des pistes pour brouiller :

Le client peut être un swf vide dans lequel on charge le vrai client dont le nom (et/ou le poids) est stocké en base de données et communiqué par un php, mais il faut que l'exécution seule du php ne retourne pas le nom. Tu peux aussi renommer régulièrement ton client sur le serveur.

La vérification de la taille du fichier peut servir de double vérification, mais la elle doit se faire au niveau du serveur pour autoriser ou non le chargement du fichier.

Si le poids et le nom du swf dans la page ne sont pas les bons, on charge un swf d'alerte et pas le vrai client.

Tu peux aussi fouiller dans le DOM de la page html, en vérifiant si le SWF est chargé localement ou sur ton serveur, un peu de javascript et d'AJAX totalement obfusqué peut faire la blague. Tu interroge un php via AJAX pour récupérer l'autorisation et si tu l'as tu reload juste le client dans la page.

Au niveau du client, les noms de variables du genre : _loc2_, _loc3_, _loc4_, ..., sont générés par certains décompilateur en replacement des noms d'origine, une fois recompilé ces noms sont conservés ? Si oui tu peux tenter un test sur l'existence de "_loc1_" dans le programme. Le client peut aussi renvoyer une liste de variables au serveur, si "_loc1_" est dedans tu bloque l'accès au vrai client.

#5 Kazuichi

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 25 August 2016 - 22:31 PM

Bonsoir Monsieur Spi,
Je te remercie beaucoup pour ta réponse !

Charles fonctionne en remplacent simplement un fichier SWF présent sur un site web par un swf sur ton pc.

Pour ce qui est du SWF vide qui appellerait un swf dont le nom serait caché, ça m'a l'air d'être une bonne idée. Je vais travailler ça et je reviendrai pour dire ce que ça donne :smile: .

Cependant, j'ai un serveur codé en C++, et je ne vois pas du tout comment vérifier le poids d'un SWF depuis celui-ci ..? Tu aurais une idée pour y parvenir ?

Je vais aussi voir ce que je peux faire côté AJAX/PHP.

Pour les noms en _loc2_,_loc3_, etc... J'ai fait exprès de ne pas donner de noms explicites ici. J'aimerais éviter que l'on retrouve ce topic par après et qu'on l'identifie à mon jeu, car les noms des variables contiennent le nom de celui-ci lol ...
Un test d'existence de cette variable ? Au niveau du serveur tu veux dire ?

Merci encore.

PS : Je ne pensais juste pas qu'ils trouveraient si rapidement où est la sécurité dans le loader du client... Ce ne sont pas vraiment des gens avec un très haut niveau d'as3. Il leur a quand même fallu un petit temps pour y parvenir !

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7004 messages

Posté 25 August 2016 - 22:39 PM

Citation

Cependant, j'ai un serveur codé en C++, et je ne vois pas du tout comment vérifier le poids d'un SWF depuis celui-ci ..? Tu aurais une idée pour y parvenir ?

Quand je dis "au niveau du serveur" je veux dire en php... : http://php.net/manua...on.filesize.php
Tu stocke le poids du client en BD et tu fais la même chose qu'avec le nom.

#7 Kazuichi

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 25 August 2016 - 22:41 PM

Voir le messageMonsieur Spi, le 25 August 2016 - 22:39 PM, dit :

Quand je dis "au niveau du serveur" je veux dire en php... : http://php.net/manua...on.filesize.php
Tu stocke le poids du client en BD et tu fais la même chose qu'avec le nom.

Ah ok oups... Je m'occupais surtout de la partie as3 et du serveur à vrai dire, mais en effet ça m'a l'air d'être une bonne idée. Merci, je teste ça et je reviens donner les résultats :)

#8 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7004 messages

Posté 25 August 2016 - 23:00 PM

Ceci peut sans doute t'aider : http://www.developpe...telechargement/

#9 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 29 August 2016 - 16:17 PM

re
la solution reste de ne pas croire le client
j’étais tombé sur un soft qui permettait de ciblé le logiciel que l'on voulait (en l’occurrence le plug in flash) et d'avoir accès à toutes les adresses mémoires utilisées. Après on cherche la bonne (c'est laborieux) et on écrit ce que l'on veux dedans. Du coup ton teste sur le poid du swf devient inutile

a+

#10 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7004 messages

Posté 29 August 2016 - 21:12 PM

+1 paodao, et hello au passage ;)

#11 Kazuichi

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 29 August 2016 - 21:27 PM

Salut,
Je colle ta réponse à mon MP, Monsieur Spi :

Citation


index.php
charge la page (DOM)
récupère l'url du vrai client dans la BD
charge le client vide et passe lui l'url a charger
charge un fichiers ajax : verification.js


verification.js
quand la page est chargée
parcours le DOM de la page
recupere l'url et le nom du swf
recupere le poids du client chargé
interroge la page autorisation.php (en ajax)


autorisation.php
récupère le chemin le poids et le nom du vrai client (en BD)
vérifie si les valeurs correspondent au poids passé par verification.js
si les valeurs sont erronées, enregistre le joueur comme tricheur dans la BD
déconnecte le joueur et change le nom du client (pour le prochain chargement)

Je pense que je vais m'en tenir à ça pour le moment. Mon problème est en stand-by, je dois m'occuper d'autre chose, et je prends note de tes conseils Paodao.

Merci beaucoup pour vos réponses ! :smile:



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP