IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probl�me Nullchars. Eviter l'interpretation des \0


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Avril 2007
    Messages
    115
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 115
    Par d�faut Probl�me Nullchars. Eviter l'interpretation des \0
    [MOD : Cette discussion d�vie rapidement sur le C++, d'o� le d�placement]

    Bonjour.

    Voil�, j'ai un gros probl�me avec l'interpr�tation du \0 en C.
    Alors je vous explique :

    Tout d'abord je fais un client en C/C++ avec winsock2 et socket.h sous linux (pour que le client soit portable. Le protocol du serveur est aussi �crit en C, mais je ne peux pas le modifier. Alors, le protocol a pour format @auth.pseudo.pass pour la connexion. Donc, la chaine a envoyer � la connexion est @auth\0pseudo\0pass, parce que le serveur se sert de nullchars comme s�parateur entre les diff�rentes choses � envoyer.

    Le probl�me est que, quand j'envoie la chaine en C, le \0 est interpr�t� et la chaine que je r�cup�re au sniff c'est @authpseudopass et non pas @auth.pseudo.pass comme je devrais. La standard de nullchars en C emp�che l'envoie de la chaine en tronquant les s�parateurs

    1. A partir de l�, j'aimerais savoir si il y a une fa�on de faire que les \0 ne soient pas interpr�t�s et soient envoy�s directement au serveur � partir du client.

    2. Si non, j'aimerais savoir comment je peux convertir la chaine en hexadecimal et l'envoyer par la socket.

    3. Si quelqu'un a une id�e, je suis prenneur ^^

    En gros, le client doit envoyer @auth.pseudo.pass (@auth\0pseudo\0pass), mais en C le \0 est interpr�t� comme nullchar. Il faut que en sniffant le client, je puisse r�cup�rer @auth.pseudo.pass et les "." ou "\0" en hexa me donne "00" comme valeur.

    J'esp�re avoir �t� assez clair et que vous pourrez m'aider parce que je s�che vraiment ^^''

  2. #2
    Expert confirm�

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    D�tails du profil
    Informations personnelles :
    �ge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par d�faut
    c'est parce que l'�criture ou la lecture sur le socket se fait via un fprintf ou un fscanf..

    Si tu remplaces par un read ou write �a marchera et �a n'interp�tera pas les '\0'...

  3. #3
    Membre confirm�
    Inscrit en
    Avril 2007
    Messages
    115
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 115
    Par d�faut
    Citation Envoy� par souviron34
    c'est parce que l'�criture ou la lecture sur le socket se fait via un fprintf ou un fscanf..

    Si tu remplaces par un read ou write �a marchera et �a n'interp�tera pas les '\0'...

    Euh, tu pourrais me donner un exemple s'il te plait ? Je vois pas comment remplacer par un read ou write. En fait les \0 sont interpr�t�s dans les standards du C non ?

    C'est au niveau de la variable que �a cloche. En fait, j'ai une variable string sep = "\0" et en console le \0 vaut une fin, et n'est pas �crite.

    Enfin ce serait gentil si tu me donnais un exemple parce que je s�che

    Merci de ta r�ponse

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Citation Envoy� par JackStrieger
    En fait, j'ai une variable string sep = "\0"
    C'est du C, �a ?

    Ce qu'il faut savoir, c'est que ce n'est pas le type qui interpr�te \0 comme fin de cha�ne, mais les fonctions, notamment strlen().
    Si tu connais la longueur des donn�es par un autre moyen, tu peux tr�s bien faire tes propres fonctions d'affichage...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirm�
    Inscrit en
    Avril 2007
    Messages
    115
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 115
    Par d�faut
    Non, c'est pas du C. En fait je le fais avec un compilateur C++ pour certains avantages comme les strings l�. Mais c'est sans poo. Je voulais juste montrer le principe pour la variable. Sinon, d�sol� si je me suis tromp� de forum Je savais pas si je devais poster ici ou l� bas.

    Ce qu'il faut savoir, c'est que ce n'est pas le type qui interpr�te \0 comme fin de cha�ne, mais les fonctions, notamment strlen().
    Merci ^^ Mais donc, si dans ma variable je place \0, elle vaut toujours \0 ? c'est les fonctions qui l'interpr�tent comme une fin de chaine ? Parce que je ne passe par aucune fonction l�, je ne fais qu'envoyer ma chaine, par la socket.
    Par exemple @auth\0pseudo\0pass, il n'envoie pas �a, mais les \0 sont bien interpr�t�s. Et au sniff je r�cup�re @autpseudopass.

    Si tu connais la longueur des donn�es par un autre moyen, tu peux tr�s bien faire tes propres fonctions d'affichage...
    Euh, j'ai pas trop besoin d'afficher ma chaine. J'ai surtout besoin de pouvoir l'authentifier pour avoir une connexion au serveur. Donc aucune autre fonction que cette de winsock dans un premier temps.

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    1. Tu ne d�tailles pas assez comment tu l'envoies, ni comment tu construits tes strings.
      Tu peux essayer le constructeur de string qui prend en param�tre un const char * et une longueur:
      Ce code fonctionne correctement sous Visual Studio 2005 :
      Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
      1
      2
      3
      std::string str3("Hello\0World", 8);
      std::cout << "Longueur de string avec \\0 : " << str3.length() << std::endl;
      std::cout << "La string : \"" << str3 << "\"" << std::endl;
      Ce code affiche 8 comme longueur, et affiche bien le d�but de la string en rempla�ant le caract�re nul par un espace. Tu peux remarquer qu'� tout moment c'est string qui est utilis�, et nulle part char* (sauf au constructeur) : En effet, sous VS2005, la classe string supporte les caract�res nuls.
    2. V�rifies que ce n'est pas le sniff qui buggue. Plut�t que d'afficher les donn�es en tant que test, regarde si tu ne peux pas afficher tout en hexa. Ainsi, tu verras bien si tu as plusieurs octets nuls dans les donn�es...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. probl�me d'interpretation des makefile Photran/ubuntu
    Par frabrovitch dans le forum Eclipse
    R�ponses: 0
    Dernier message: 01/10/2007, 09h55
  2. R�ponses: 5
    Dernier message: 24/10/2005, 15h11
  3. [JAXB][XSD] Probl�me lors de la g�n�ration des classes
    Par charlot44 dans le forum Persistance des donn�es
    R�ponses: 4
    Dernier message: 22/06/2005, 16h10
  4. R�ponses: 2
    Dernier message: 20/08/2004, 17h10
  5. R�ponses: 9
    Dernier message: 17/01/2004, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo