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 :

[C#]La marshallisation de structure semble buggable. [Infos]


Sujet :

C#

  1. #1
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut [C#]La marshallisation de structure semble buggable.


    Je suis tombé, par hasard sur quelque chose d'un peu intéréssant :
    si j'ai une structure comme celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [StructLayout(LayoutKind.Sequential)]
    struct DateOfBirth2
    {
       //Normalement, il faudrait utiliser MarshalAs...
       public string Day;
       public string Mounth;
       public int Year;
    }
    Si l'on marshalle cette structure, les string ne sont pas enregistrés.
    Mais ce sont les addresse des valeurs qui le sont, et celà fait que si on
    s'arrange bien on peut même corrompre le CLR en cours d'éxécution.

    L'endroit où j'avais utilisé cette structure à provoqué un crash de
    l'application, crash non déboggable (puisque c'est le kernel qui se plante)
    et donc difficile à identifier.

    N'y a-t-il pas une sécurité dans .NET qui empêche ce genre de surprises ?

    PS:
    Dans mon cas j'avais fait encore mieux, car la classe chargée de
    marshaller la valeur était générique, et apparament j'ai permis de
    contourner la limitation de sizeof

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    D'après mes rapides recherches (2 minutes sur Google, c'es tpas bcp mais bon, je suis mort ), tu peux tout à fait marshaller une structure.

    Ex:

    http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/52766842d455ebdf/b01307796bd1af2e?lnk=st&q=Marshal+%2Bstruct+%2BC%23&rnum=1&hl=en#b01307796bd1af2e

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
    public struct _tagHHP_DECODE_MSG
    {
         public UInt32 dwStructSize; // Pas marshaller
     
         [MarshalAs(UnmanagedType.LPStr, SizeConst=MAX_LEN)]
         public string chCodeID;      // Ici, on marshal
     
    ...
    }

    A étudier je pense, car je garantie rien

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Oui certes, mais imaginons que tu aies oublié, ou encore qu'un illuminé veuille faire un code mallicieux, qu'est-ce qui l'en empèche avec la méthode du marshalling de corompre l'application en cours ? ( et peut être plus )

    Sinon pour mashaller des chaines simplement il suffit de faire [MarshalAs(UnmanagedType.ByValTStr,SizeConst=255)]

  4. #4
    DrQ
    DrQ est déconnecté
    Membre expérimenté
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Points : 1 515
    Points
    1 515
    Par défaut
    Le marshalling te permet de descendre d'un niveau et donc d'accéder "directement" à des zones mémoire : donc on revient à ce qui est possible en C++.
    Une faille de sécurité ? Non on ne pas vraiment dire : tu sors de l'utilisation simple du framework. Le problème est similaire quand tu fais du C++ managé combiné avec du C++ standard et que tu pin pas certaines variables alors il te reste plus qu'à jouer avec les zones mémoire sur lesquelles tu es

    Si c'est l'injection de code malicieux que tu crains, le système de noms forts est là pour éviter ce genre de chose. Maintenant si tu veux te hacker toi même, tu peux
    1)http://www.developpez.com/cours/
    2)Recherche
    3)Posez votre question en suivant les règles
    _oOo-DrQ-oOo_

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Mon utilisation des structs est faite pour immiter le WriteBlock de Delphi ( je défini un header en une struct, et non pas 25 appels à ReadInt32 ) et donc écrire un pointer dans un fichier est une mauvaise idée car si on l'ouvre depuis une autre instance de l'application -> possibilité de crash aléatoire.

    Dans ce cas, existe-t-il une méthode pour voir exactement ce que contient la struct en cours de marshalling ? c-à-d vérifier qu'elle ne contienne pas de Pointer ?

    encore un ps:
    La zone mémoire du CLR n'est pas séparée de la zone mémoire des assemblies ?

Discussions similaires

  1. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  2. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  3. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 11h09
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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