lecture de trame

lecture de trame - C - Programmation

Marsh Posté le 13-01-2010 à 18:20:49    

Bonsoir tout le monde.

 

Je suis entrain de faire un projet portant sur le décodage de trames Ethernet/TCP-IP et son diagnostic de vulnérabilité.

 

Bon pour faire simple je vais vous copier/coller le "travail à réaliser"

 

Travail à réaliser:

 

Pour établir les connexions et enregistrer les trames de réponse les programmes "portscan2" et "wiredump" sont mis à votre disposition. Ils s'occupent de sauvegarder les trames dans les fichiers "dump.txt" et "dump.pcap". Normalement le programme "portscan2" est appelé par le script "scriptdelancement". Vous n'avez donc pas à l'utiliser directement. En fait vous devez écrire l'équivalent du programme "decode" (appelé lui aussi dans le "scriptdelancement" ) qui lit les trames dans le fichier "dump.txt" et les décode afin de savoir si c'est une trame indiquant une connexion acceptée sur le port spécifié. Ce fichier est au format texte, il se compose d'une trame par ligne, chaque octet est écrit sous sa forme hexadécimale et séparé des autres par un espace.

 

Fichier dump.txt :

 

00 0c 29 80 83 2f 00 50 56 f8 98 7c 08 00 45 00 00 28 60 8f 00 00 80 06 9b 2b 4a 7d 4d 68 c0 a8 e6 87 00 4f 8d f4 2c 06 3b a5 f7 4d 97 c8 50 10 fa f0 f0 c8 00 00 00 00 00 00 00 00
00 0c 29 80 83 2f 00 50 56 f8 98 7c 08 00 45 00 00 28 60 90 00 00 80 06 9b 2a 4a 7d 4d 68 c0 a8 e6 87 00 4f 8d f4 2c 06 3b a5 f7 4d 97 c8 50 10 fa f0 f0 c8 00 00 00 00 00 00 00 00
00 0c 29 80 83 2f 00 50 56 f8 98 7c 08 00 45 00 00 28 60 91 00 00 80 06 9b 29 4a 7d 4d 68 c0 a8 e6 87 00 4f 8d f4 2c 06 3b a5 f7 4d 97 c8 50 14 fa f0 f0 c4 00 00 00 00 00 00 00 00

 


VOILA MON TRAVAIL QUE J'AI COMMENCE AUJOURD'HUI (et que je dois rendre demain dans l'apres midi ) :

 


Code :
  1. /*Procedure qui enleve les espaces*/
  2. void enleveespaces (const char trameAvecEspace[])
  3. {
  4.  int i,j,n = strlen(trameAvecEspace);
  5.  for (i = 0 ; i <= n ; i++)
  6.    {
  7.      if (trameAvecEspace[i]==' ')
  8.        {
  9.          for(j = i ; j <= n ; j++)
  10.            {
  11.              trameAvecEspace[j]=trameAvecEspace[j+1];
  12.            }
  13.        }
  14.    }
  15. }
  16.  
  17. /*Fonction "decoupe" qui d\u00e9coupe "trame"*/
  18.  
  19. char *decoupe (const char *trameAvecEspace, unsigned int debut, unsigned int fin)
  20. {
  21.  char *new_trameAvecEspace = NULL;
  22.  int i;
  23.  if (trameAvecEspace != NULL && debut< fin)
  24.    {
  25.  
  26.      new_trameAvecEspace = malloc (sizeof (*new_trameAvecEspace) * (fin - debut * 2));
  27.  
  28.      if (new_trameAvecEspace != NULL)
  29.        {
  30.          for (i = debut; i <=fin; i++)
  31.            {
  32.              new_trameAvecEspace[i-debut] = trameAvecEspace[i];
  33.            }
  34.          new_trameAvecEspace[i-debut] = '\0';
  35.        }
  36.    }
  37.  
  38.  return new_trameAvecEspace;
  39. }
  40.  
  41.  
  42. int main()
  43. {
  44.  const char *IP, *TCP, *ethernet;
  45.  const char *trameAvecEspace;
  46.  
  47.  /*Partie ethernet*/
  48.  const char *Adresse_source1, *Adresse_destination1, *Protocole1;
  49.  
  50.  
  51.  /*Partie IP*/
  52.  const char *Version_IP, *Long_entete, *Type_service, *Long_total, *Identification, *Flag1, *TTL, *Protocole2, *Checksum1, *Adresse_source2, *Adresse_destination2;
  53.  
  54.  
  55.  /*Partie TCP*/
  56.  const char *Port_source, *Port_destination, *Num_sequence, *Num_acquittement, *Taille_entete, *Flag2, *Taille_fenetre, *Checksum2;
  57.  const char *ACK;
  58.  
  59.  
  60.  
  61.  
  62.  /*decoupage de la trame*/
  63.  ethernet = decoupe(trameAvecEspace, 0, 42);
  64.  IP = decoupe(trameAvecEspace,42 , 102);
  65.  TCP = decoupe(trameAvecEspace,102 , 180);
  66.  
  67.  
  68.  
  69.  
  70.  /*decoupage des champs*/
  71.  
  72.  /*Ethernet*/
  73.  Adresse_destination1 = decoupe(ethernet, 0,18);
  74.  Adresse_source1 = decoupe(ethernet, 18,36);
  75.  Protocole1 = decoupe(ethernet, 36,42);
  76.  
  77.  printf(">>Partie Ethernet<<\n\n" );
  78.  printf("Adresse de destination : %s\n", Adresse_destination1);
  79.  printf("Adresse source : %s\n" , Adresse_source1);
  80.  printf("Protocole : %s\n\n", Protocole1);
  81.  
  82.  /*Partie IP*/
  83.  Version_IP = decoupe(IP, 0,1);
  84.  Long_entete = decoupe(IP, 2,3);
  85.  Type_service = decoupe(IP, 3,6);
  86.  Long_total = decoupe(IP, 6,12);
  87.  Identification = decoupe(IP, 12,18);
  88.  Flag1 = decoupe(IP, 18,24);
  89.  TTL = decoupe(IP, 24,26);
  90.  Protocole2 = decoupe(IP, 27,30);
  91.  Checksum1 = decoupe (IP, 30,36);
  92.  Adresse_source2 = decoupe(IP, 36,48);
  93.  Adresse_destination2 = decoupe(IP, 48,60);
  94.  
  95.  /*Partie TCP*/
  96.  Port_source = decoupe(TCP, 0,6);
  97.  Port_destination = decoupe(TCP, 6,12);
  98.  Num_sequence = decoupe(TCP, 12,24);
  99.  Num_acquittement = decoupe(TCP, 24,36);
  100.  Taille_entete = decoupe(TCP, 36,39);
  101.  Flag2 = decoupe(TCP, 39,42);
  102.  Taille_fenetre = decoupe(TCP, 43,48);
  103.  Checksum2 = decoupe(TCP, 48,54);
  104.  
  105.  
  106.  
  107.  /*Convertir en d\u00e9cimal*/
  108.  unsigned long decPort_source, decPort_destination, decFlag2, decTaille_fenetre;
  109.  
  110.  decPort_source = strtoul(Port_source,0,16);
  111.  decPort_destination = strtoul(Port_destination,0,16);
  112.  decFlag2 = strtoul(Flag2,0,16);
  113.  decTaille_fenetre = strtoul(Taille_fenetre,0,16);
  114.  
  115.  
  116.  
  117.  /*Convertir en binaire Flag2*/
  118.  int i;
  119.  int bin[8] = {0};
  120.  
  121.  for (i=0; i<8 ; i++)
  122.    {
  123.      bin[i] = decFlag2 % 2;
  124.      decFlag2 = decFlag2 /2;
  125.    }
  126.  
  127.  
  128.  printf(">>Partie TCP<<\n\n" );
  129.  printf("Port source : %d\n", decPort_source);
  130.  printf("Port destination : %d\n" , decPort_destination);
  131.  printf("Numero de sequence : %s\n", Num_sequence);
  132.  printf("Numero d'acquittement : %s\n", Num_acquittement);
  133.  printf("Taille de l'entete : %s\n" , Taille_entete);
  134.  printf("Taille de la fenetre : %d\n", decTaille_fenetre);
  135.  printf("Checksum : %s\n\n\n", Checksum2);
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  const int MTU = 1500;
  148.  const int MAXchar = 1500*2+1500+2;
  149.  
  150.  typedef char t_filename[1024];
  151.  
  152.  
  153.  void lecture(t_filename fichier){
  154.    FILE *fd;
  155.    char str[MAXchar];
  156.    if ((fd = fopen(fichier,"r" )) == NULL)
  157.      fprintf(stderr,"ERREUR DE CHARGEMENT DE FICHIER\n" );
  158.    else {
  159.      while (!feof(fd)){
  160.        fgets(str,MAXchar,fd);
  161.        printf("%s <BR>\n",str);
  162.      }
  163.      fclose(fd);
  164.    }
  165.  }
  166.  
  167.  
  168. #define TAILLE_MAX 1000
  169.  
  170.  int main(int argc, char *argv[])
  171.  {
  172.    FILE* fichier = NULL;
  173.    char chaine[TAILLE_MAX] = "";
  174.    char new_chaine[TAILLE_MAX];
  175.    fichier = fopen("dump.txt", "r" );
  176.  
  177.    if (fichier != NULL)
  178.      {
  179.        while(!feof(fichier))
  180.          {
  181.            fgets(chaine, TAILLE_MAX, fichier);
  182.            enleveespaces(chaine);
  183.            printf("%s", chaine);
  184.          }
  185.  
  186.        fclose(fichier);
  187.      }
  188.  
  189.    return 0;
  190.  }


Mais voilà il y a un probleme avec ma procédure "eneleveespaces"...
Voila ce que ca m'affiche en le compilant:

 


Citation :

In function 'enleveespaces':
ligne 16:erreur: assignment of read-only location


Je pense que c'est mon "trameAvecEspace" qui pose problème...(en espérant qu'il soit résolu rapidement!! )

 

PS: mince!! je viens de voir que la mise en page n'était pas terrible,avec un manque de couleur et une mauvaise pagination :s(surement du à un mauvais copier/coller )


Message édité par gilou le 13-01-2010 à 20:45:41
Reply

Marsh Posté le 13-01-2010 à 18:20:49   

Reply

Marsh Posté le 13-01-2010 à 18:35:40    

utilise les balises [ cpp ]


---------------
last.fm
Reply

Marsh Posté le 13-01-2010 à 20:14:13    

les balises [ cpp ] ...je suis encore un novice dans ce domaine...pourrais-tu m'expliquer rapidement...(ou me passer un liens portant sur ce sujet:p)

Reply

Marsh Posté le 13-01-2010 à 20:55:57    

J'ai mis les bonnes balises et indenté ce code illisible sinon.

Citation :

const char trameAvecEspace[]

trameAvecEspace est donc un array de char non-modifiables, or justement, tu essayes de modifier leur valeur dans la fonction avec le code trameAvecEspace[j]=trameAvecEspace[j+1]
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-01-2010 à 22:27:54    

ok merci beaucoup!
je viens de voir que c'est assez "débile" d'avoir mis "const char" alors que je veux le modifier... mais si je le change cela ne perturberas pas le  découpage de la trame :
#
/*decoupage de la trame*/
#
 ethernet = decoupe(trameAvecEspace, 0, 42);
#
 IP = decoupe(trameAvecEspace,42 , 102);
#
 TCP = decoupe(trameAvecEspace,102 , 180);
#
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed