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

CORBA Discussion :

UnMarshalling manuel c/c++


Sujet :

CORBA

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 17
    Points
    17
    Par défaut [Résolu] UnMarshalling manuel c/c++
    Bonjour,
    je cherche à réaliser un programme dont le but est d'intercepter (et d'exploiter dans un temps relativement court) certains messages Corba sur un réseau. Je suis capable de capter et d'identifier les messages (requêtes et réponses) dont j'ai besoin.

    Je lis les entêtes GIOP sans soucis. Je cherche plus particulièrement à décoder le corps du message de la réponse et je souhaiterais éviter de le faire "à la main".

    Je travaille en C/C++ et je dispose du fichier IDL que j'ai compilé avec omniidl. Ce dernier me permet de disposer de la structure d'accueil de l'objet que je cherche a reconstituer.

    Est-il possible de (et sauriez vous comment) détourner les fonctions de la lib omniorb et du fichier idl compilé pour réaliser manuellement cette opération d'unmarshalling (désérialisation) ?

    Merci d'avance,
    Cédric.

    PS : je ne souhaite pas utiliser wireshark qui m'obligerait à travailler en temps différé.

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 219
    Points : 302
    Points
    302
    Par défaut
    Je n'ai jamais utilisé OmniORB, mais puisqu'il est open source, je pense qu'en étudiant la manière dont marche le stub (peut-être avec un debugger, en remontant une stacktrace) vous pourriez voir comment il effectue le demarshalling.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Ca ne me dérange pas d'utiliser autre chose qu'OmniOrb. Peut être que d'autres implémentations du Corba permettent de réaliser cela plus facilement.

  4. #4
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Bonjour,

    Pour avoir la main à un plus haut niveau qu'en manipulant la trame GIOP/IIOP, as-tu regardé du côté des fonctionnalités standard CORBA:
    - les intercepteurs : ils doivent te permettre de faire des traitements sur les messages de manière transparente pour l'application.
    - le DSI :dynamic skeleton interface, qui te permet d'analyser le message et de créer dynamiquement une réponse adéquate. Applicable si tu as la possibilité d'intervenir dans l'application elle-même.

    Question performances ça peut le faire, en fonction de la qualité d'implémentation de l'ORB.
    [Edit]
    Je constate en parcourant la doc Omniorb que :
    - omniorb vit encore (MAJ en 2008), incroyable, quelques vieux mohicans CORBA sont encore là
    - omniorb propose des intercepteurs spécifiques qui donnent la main sur les structures internes de message OmniOrb, à divers moment du processus de réception/émission. Chapitre 10, p93 du PDF OmniORB 4.1.3. Ce ne sont pas des intercepteurs standard CORBA.

    Ca semble coller à ce que tu veux faire, mais c'est spécifique à cet ORB. Tout dépend de ton objectif.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Je te remercie beaucoup pour tes recherches. Je suis pas du tout un spécialiste du CORBA donc je vais creuser le sujet en suivant ta piste. Pour les intercepteurs, j'avais cru comprendre qu'il fallait les déclarer au niveau du serveur, ce que je ne peux absolument pas faire (pas de modif de code serveur ni client). Peux t'on se passer de ces déclarations si l'on travaille à un haut niveau ?
    Je récupère des messages qui transitent sur le réseau en me branchant sur un port de mirroring du switch (je n'envoie aucune donnée). Les infos que je cherche à récuperer sont des structures de données. Les données ne sont pas fragmentées.
    D'autre part, ca ne me dérange pas d'adopter une solution spécifique à une ORB donnée. L'application développée est un besoin spécifique qui ne sera pas entretenue sur le long terme.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Bon j'ai un tout petit peu avancé, . Les Skeletons construits avec omniidl ont des opérateurs qui prennent en entrée les objets de la classe cdrStream dont une classe fille est nommée cdrMemoryStream. Un des constructeurs de cette dernière prend en entrée le buffer pointant vers les données. Elle dispose d'une méthode pour selectionner Big ou Little Endian ainsi que des opérateurs pour désérialiser les objets de base (Long, Short, etc.).

    Par contre, pour l'alignement mémoire, elle tient contient de l'adresse réelle en mémoire et ne prends pas 0 comme comme référence pour le premier élement du buffer.

    Dur dur de trouver de la doc sur l'implémentation de cdrStream d'omniORB.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Ayé !!
    le problème est réglé, il suffit d'aligner le buffer correctement et les opérateurs définis dans le skeleton permettent la déserialisation automatique de l'object complet désiré par l'intermédiaire du cdrMemoryStream.

    Hip Hip Hip !

  8. #8
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 219
    Points : 302
    Points
    302
    Par défaut
    Bravo !!

    Fais juste attention à bien reconstituer le buffer qui peut parfois être fragmenté (voir désordonné) entre plusieurs paquets TCP (en cas de fort trafic ou de message très long)...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Effectivement, je pensais que mes données n'étaient pas fragmentées. J'ai eu tort car certaines réponses le sont au niveau TCP. Du coup, maintenant je cherche à reconstruire les flux TCP.
    J'ai testé la librairie libnids mais elle ne permet de reconstruire que les sessions complètes. Elle me permet au moins d'obtenir des packets IP défragmentés.

    Va encore falloir fouiner...

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/06/2004, 10h44
  2. ecrire manuellement dans une dbgrid
    Par neness dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/06/2004, 11h14
  3. Man signal, man scanf => pas de manuel
    Par weed dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 17/05/2004, 16h31
  4. [SQL] Ma requête m'oblige à saisir des valeurs manuellement
    Par bossun dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/10/2003, 13h29
  5. Assemblage manuel
    Par syraks dans le forum Assembleur
    Réponses: 4
    Dernier message: 01/06/2003, 00h08

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