Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1053 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Devinette Serialisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Devinette Serialisation

n°2297567
sylargh
Posté le 10-03-2017 à 21:41:04  profilanswer
 

Hello,
 
j ai un tp avec plusieurs exercice par rapport aux attaques de securite en JAVA,
Parmis ceux la, il y en a un qui m embête beaucoup,
 
Voici 3 classes  
 

Code :
  1. package core;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectOutputStream;
  5. import java.io.PipedOutputStream;
  6. public class Execice1 implements Runnable{
  7.  
  8. public void run(){
  9.  Voiture v= new Voiture();
  10.  //le joueur joue et essaie d'acélérer autant qu'il peut.  
  11.  v.accelerer(17);
  12.  //envoyer sa voiture au serveur.
  13.  PipedOutputStream pipedOut;
  14.  try {
  15.   pipedOut = new PipedOutputStream(Jeu.pipedIn);
  16.   Jeu.pipedOut=pipedOut;
  17.   //cré l'objet sérialisé
  18.          ByteArrayOutputStream baos = new ByteArrayOutputStream();
  19.             ObjectOutputStream oos2 = new ObjectOutputStream( baos );
  20.          oos2.writeObject(v);  //<-crée l'Objet serialisé
  21.             oos2.close();
  22.            
  23.             //to byteArray (pas nécéssaire mais plus facile à manipuler)
  24.             byte[] yourBytes = baos.toByteArray();
  25.                        
  26.            
  27.             pipedOut.write(yourBytes);//envoie l'Objet serializé dans le pipe
  28.             pipedOut.close();
  29.            
  30.          
  31.        
  32.         } catch (IOException   e) {
  33.   e.printStackTrace();
  34.  }
  35.  
  36. }
  37. //pourrait etre utile pour tester
  38. private static void printByteArray(byte[] byteArray)
  39. {
  40.         for(int i=0;i<byteArray.length;i++)
  41.          System.out.print(String.format("%02X ",  byteArray[i]));
  42. }
  43. }


 

Code :
  1. package core;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ObjectInputStream;
  4. import java.io.PipedInputStream;
  5. import java.io.PipedOutputStream;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. public class Jeu {
  9.   static PipedOutputStream pipedOut = new PipedOutputStream();
  10.   static PipedInputStream pipedIn = new PipedInputStream();
  11. public static void main(String [ ] args) {
  12.  //run le joueur  
  13.  //pour l'exercice 1:
  14.  new Thread(new Execice1()).start();
  15.  //pour l'exercice 2 et l'exercice 3. commenter la ligne précédente et décommenter la ligne suivante
  16.  //new Thread(new Execice2()).start();
  17.  byte[] ByteArray=new byte[350];
  18.  try {
  19.   Thread.sleep(400);
  20.   int i=0,c=0;
  21.   while((i=pipedIn.read())!=-1){
  22.    //System.out.print((char)i);
  23.    ByteArray[c]=(byte) i;
  24.    c++;
  25.    }
  26.   pipedIn.close();
  27.        
  28.         ByteArrayInputStream in = new ByteArrayInputStream(ByteArray);
  29.         ObjectInputStream is = new ObjectInputStream(in);
  30.         Voiture voitureDuJoueur = (Voiture) is.readObject();
  31.   if (voitureDuJoueur!=null)
  32.   {
  33.    if(voitureDuJoueur.record())
  34.     System.out.println("c'est un record" );//vous devez faire executer cette ligne, sans modifier la classe courrante ou la classe Voiture
  35.   }
  36.  }
  37.  catch(Exception e){
  38.   System.out.println(e);
  39.   }
  40. }
  41. }


 

Code :
  1. package core;
  2. public final class Voiture implements java.io.Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private int vitesse;
  5. Voiture()
  6. {
  7.  vitesse=0;
  8. }
  9. public void accelerer(int v)
  10. {
  11.  if(vitesse + v> 20)
  12.   crach();
  13.  else
  14.   vitesse = vitesse+v;
  15. }
  16. private void crach()
  17. {
  18.  vitesse=0;
  19. }
  20. public boolean record()
  21. {
  22.  return (vitesse>20);
  23. }
  24. public int getVitesse()
  25. {
  26.  return vitesse;
  27. }
  28. }


 
 
Le but de l exercice est de faire en sorte que :
 
À la fin de la partie, l’objet voiture est sérialisé et envoyé au serveur (jeu.java). Ce dernier vérifie si la vitesse atteinte dépasse 20 km/h. Si oui, la ligne « c'est un record» est affiché à l’cran.  
 
Votre première objectif est de faire afficher cette ligne dans la console d’exécution sans modifier les classes jeu.java ou Voiture.java d’aucune façon (puisque vous supposer qu’elles sont exécuté sur le serveur).  Vous devez simplement modifier l’objet sérialisé pour qu’il contienne une valeur « impossible », puis envoyer cet objet au serveur.
 
 
Ce que j ai compris :
 

Code :
  1. Voiture v= new Voiture();
  2.  //le joueur joue et essaie d'acélérer autant qu'il peut.  
  3.  v.accelerer(17);
  4.  //envoyer sa voiture au serveur.
  5.  PipedOutputStream pipedOut;
  6.  try {
  7.   pipedOut = new PipedOutputStream(Jeu.pipedIn);
  8.   Jeu.pipedOut=pipedOut;
  9.   //cré l'objet sérialisé
  10.          ByteArrayOutputStream baos = new ByteArrayOutputStream();
  11.             ObjectOutputStream oos2 = new ObjectOutputStream( baos );
  12.          oos2.writeObject(v);  //<-crée l'Objet serialisé
  13.             oos2.close();
  14.            
  15.             //to byteArray (pas nécéssaire mais plus facile à manipuler)
  16.             byte[] yourBytes = baos.toByteArray();


 
Sur la ligne 3, je dois changer la valeur que contient mon objet voiture qui est serialisé par la suite de manière a ce que dans jeu.java vitesse+v soit inferieur a 20 pour pas faire appel a la fonction crash()
 
Mais que "v" seulement soit superieur a 20 pour que le record s affiche. Sauf que je ne dois effectuer des modifications uniquement dans la classe exercice 1.  
 
Je n ai aucun setVitesse dans la classe voiture pour modifier la valeur de vitesse qui est initalisé a 0.
 
J ai pensé pouvoir jouer avec les bornes min et max d un int "-32 767" lorsque v+vitesse sont associés, puis passer en valeur positive une fois que vitesse serait enlever. Mais je me retrouve encore dans une impasse car mon iterateur vitesse=0. Et si je ne dis pas de betise je n effectue la boucle qu une seule fois.
 
 
Si vous avez une idee de la resolution du probleme je serais ravis
 
cldt  
 

mood
Publicité
Posté le 10-03-2017 à 21:41:04  profilanswer
 

n°2297587
Soileh
Lurkeur professionnel
Posté le 11-03-2017 à 12:23:53  profilanswer
 

sylargh a écrit :

Hello,
 
j ai un tp avec plusieurs exercice par rapport aux attaques de securite en JAVA,
Parmis ceux la, il y en a un qui m embête beaucoup,
 
[...]
 
 
Si vous avez une idee de la resolution du probleme je serais ravis
 
cldt  
 


 :hello:  
La réponse est en fait dans la question :

Citation :


Vous devez simplement modifier l’objet sérialisé


Dans la mesure où tu ne peux pas modifier directement l'objet, tu es forcément obligé de modifier l'objet sérialisé. De plus, on te donne une petite indication en l.33  [:cupra]  

Citation :


//to byteArray (pas nécéssaire mais plus facile à manipuler)


Maintenant, il ne te reste plus qu'à voir comment retrouver la valeur de la vitesse dans l'objet sérialisé et à la modifier  [:cupra]  
 
 :jap:


---------------
And in the end, the love you take is equal to the love you make
n°2297615
sylargh
Posté le 12-03-2017 à 19:25:51  profilanswer
 

Bonjour merci de votre réponse,
 
J'admet que je n'ai jamais vu la sérialisation et les diapo du profs ne m'aident pas vraiment car y a très peu d'exemple de code,
 
Ici pour récuperer les valeurs je peux utiliser la ligne suivante :  
 
printByteArray(yourBytes) pour récupérer la valeur de v mais ducoup :
 
1. Si je modifie avant l'envoie de l'objet serializé , qu'elle différence si je changerai directement la valeur de v au début?
2. Il suffit de changer la taille du tableau "yourBytes" pour changer la valeur de V?
3. Je suis totalement dans le faux et je m'enfonce encore plus
 
Habituellement je programme en C++, et je n'ai jamais vu de serialisation, Auriez vous un exemple, ou une piste car je suis totalement perdu sur ce coup
 
Cdlt :heink:

n°2297617
Soileh
Lurkeur professionnel
Posté le 12-03-2017 à 21:52:04  profilanswer
 

sylargh a écrit :

Bonjour merci de votre réponse,
 
J'admet que je n'ai jamais vu la sérialisation et les diapo du profs ne m'aident pas vraiment car y a très peu d'exemple de code,
 
Ici pour récuperer les valeurs je peux utiliser la ligne suivante :  
 
printByteArray(yourBytes) pour récupérer la valeur de v mais ducoup :
 
1. Si je modifie avant l'envoie de l'objet serializé , qu'elle différence si je changerai directement la valeur de v au début?
2. Il suffit de changer la taille du tableau "yourBytes" pour changer la valeur de V?
3. Je suis totalement dans le faux et je m'enfonce encore plus
 
Habituellement je programme en C++, et je n'ai jamais vu de serialisation, Auriez vous un exemple, ou une piste car je suis totalement perdu sur ce coup
 
Cdlt :heink:


 
Si je ne dis pas de bêtise, le principe de sérialisation est de coder un objet en mémoire sous forme d'octets, pour ensuite être transmis à un processus par réseau :

  • Création de l'objet ;
  • Sérialisation ;
  • Transmission de la suite d'octets ;


Ensuite, dans le processus recevant les données :

  • Réception des données ;
  • Désérialisation ;
  • Création de l'objet à partir des données reçues.


Pour répondre à l'énoncé, tu ne peux pas modifier directement l'objet en appelant la méthode accelerer() : en effet, elle est codée de telle sorte que tu ne peux pas fixer une valeur supérieure à 19.
Par contre, ce que tu peux faire, c'est modifier le tableau d'octets que tu vas transmettre vu qu'il n'y a aucun contrôle : c'est ce que ton professeur veut te montrer par cet exercice.
Pour cela, je ne savais pas trop où chercher, donc j'ai affiché directement le tableau, puis j'ai repéré à quel indice était la vitesse : en fin de tableau.
 
En espérant avoir éclairci certains points  :jap:  
 


---------------
And in the end, the love you take is equal to the love you make
n°2297661
sylargh
Posté le 13-03-2017 à 21:04:43  profilanswer
 

Donc si j'ai accès à la valeur vitesse en fin de tableau, je peux la modifié en vitesse=1?
de cette façon si ma valeur v=32 767 (Borne max int)  
v+vitesse=-32 767 donc sa reste en dessous de 20,
et v tout seul est supérieur à 20 donc sa envoie le message de nouveau record.  Est ce cela? Sinon je crois que je vais abandonner , car je le rend demain x)  
 
Merci en tout cas

n°2297663
sylargh
Posté le 13-03-2017 à 21:42:21  profilanswer
 

Ducoup...
j'ai mit  

Code :
  1. v.accelerer(32767);


 
j'ai créer une méthode :  

Code :
  1. //Changer la valeur du dernier indice du tableau
  2. private static void changeByteArray(byte[] byteArray)
  3.  for(int i=0;i<byteArray.length;i++)
  4.  {
  5.   if(i=byteArray.length-1)
  6.    byteArray[i]=1; // changement de la valeur vitesse.
  7.  }


 
et je l'appel précédemment
 

Code :
  1. //ON VEUT VOIR LE CONTENU DE NOTRE TABLEAU D OCTET "yourBytes"
  2.   printByteArray(yourBytes);
  3.   changeByteArray(yourBytes);


 
 
 
Je n'ai pas réussit à afficher le tableau, sa m'embête vraiment d'être passer au Java car j'ai des erreurs de compilation bizarre et je suis pas adepte d'Eclipse, ducoup pour cette réponse qui peut être totalement décalé ou folle si ce n'est vraiment pas sa, je me suis référé à votre dernier post :" l'indice de vitesse est a la fin du tableau", et c'est la seule idée qui me suis venu
 
Cdlt  
 
Après ce TP je retourne C++  :lol:  :lol:  :lol:  :lol:  :bounce:

n°2297674
Soileh
Lurkeur professionnel
Posté le 13-03-2017 à 23:33:06  profilanswer
 

sylargh a écrit :

Donc si j'ai accès à la valeur vitesse en fin de tableau, je peux la modifié en vitesse=1?
de cette façon si ma valeur v=32 767 (Borne max int)  
v+vitesse=-32 767 donc sa reste en dessous de 20,
et v tout seul est supérieur à 20 donc sa envoie le message de nouveau record.  Est ce cela? Sinon je crois que je vais abandonner , car je le rend demain x)  
 
Merci en tout cas


Vu que tu ne peux pas modifier directement la vitesse dans ton objet Java, tu modifies la vitesse dans ton tableau d'octets. Donc cela donne :

Code :
  1. yourBytes[yourBytes.length-1] = 30;


 

sylargh a écrit :

Ducoup...
j'ai mit  

Code :
  1. v.accelerer(32767);


 
j'ai créer une méthode :  

Code :
  1. //Changer la valeur du dernier indice du tableau
  2. private static void changeByteArray(byte[] byteArray)
  3.  for(int i=0;i<byteArray.length;i++)
  4.  {
  5.   if(i=byteArray.length-1)
  6.    byteArray[i]=1; // changement de la valeur vitesse.
  7.  }


 
et je l'appel précédemment
 

Code :
  1. //ON VEUT VOIR LE CONTENU DE NOTRE TABLEAU D OCTET "yourBytes"
  2.   printByteArray(yourBytes);
  3.   changeByteArray(yourBytes);


 
 
 
Je n'ai pas réussit à afficher le tableau, sa m'embête vraiment d'être passer au Java car j'ai des erreurs de compilation bizarre et je suis pas adepte d'Eclipse, ducoup pour cette réponse qui peut être totalement décalé ou folle si ce n'est vraiment pas sa, je me suis référé à votre dernier post :" l'indice de vitesse est a la fin du tableau", et c'est la seule idée qui me suis venu
 
Cdlt  
 
Après ce TP je retourne C++  :lol:  :lol:  :lol:  :lol:  :bounce:


 
Pour afficher ton tableau, soit tu fais une boucle, soit tu utilises la méthode Arrays.toString() :

Code :
  1. for( byte b : yourBytes)
  2.   System.out.println(b);


Code :
  1. System.out.println(Arrays.toString(yourBytes));


 
 :jap:


---------------
And in the end, the love you take is equal to the love you make
n°2297678
sylargh
Posté le 14-03-2017 à 01:42:24  profilanswer
 

Merci beaucoup :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Devinette Serialisation

 

Sujets relatifs
Débutant python dictionnaire sérialiséOutil de (dé)sérialisation en ligne
serialisation d'un objetHéritage + sérialisation
Sérialisation - Spécifier un attribut de classe comme optionnelProblème copie d'objet et serialisation
[WS Axis] Problème de sérialisationSérialisation de la classe parente.
serialisation pour transfert d'un cube de donnéesProbleme Webservice serialisation AXIS --> Client .Net C#
Plus de sujets relatifs à : Devinette Serialisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR