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

Langage C++ Discussion :

Espion de pipe sous windows


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Espion de pipe sous windows
    Bonjour à tous,

    J'aurai besoin d'écouter les messages passant par une pipe.
    Il s'agit d'une pipe nommée, dont je connais le nom: j'ai pu observer qu'elle existait bien et que des échanges avaient effectivement lieu dans cette pipe grâce au logiciel FileMon, mais j'aurais besoin de connaître les messages exacts qui transitent dans cette pipe pour pouvoir prendre la place d'un des deux programmes qui utilisent la pipe en question.
    (il n'est pas question de piratage à deux francs si sous mais de pouvoir communiquer avec une caméra 3D...)

    Vu que je peux obliger un des deux programmes à écrire dans une pipe différente, je comptais espionner tout ce qui passait en construisant une sorte de "pipe intermédiaire" : je lançait le programme A en lui disant d'écrire dans la pipe Pipe_A, je récupérait le message, et le renvoyait inchangé dans Pipe_B qui était donc relié à mon programme B. Hélas j'ignore les erreurs que je commets mais le programme B réagit mal en me disant que j'effectue à chaque fois une erreur. Si jamais j'essaie d'afficher les messages récupérés, je tombe sur des choses incompréhensibles (genre... un smiley...)


    Voilà, j'ai recherché des choses existantes pour m'aider mais toutes les solutions que j'ai trouvées sont sous Linux. D'autre part, je suis pénalisée par le fait que tous les sites microsoft, msdn et compagnie me sont refusés d'accès à cause d'un petit excès de zèle de la direction des systèmes informatiques de l'endroit où je travaille.

    Toutes vos idées sont les bienvenues (y compris pour des choses qui ne seraient pas en C++) et je vous remercie d'avance pour votre aide.

  2. #2
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    Je dis peut etre une bétise, mais je crois que si tu reçois des smileys, c'est parce qu'en fait, ce sont des données binaires.
    Dans ce cas, il faudrait être sur que ces messages binaires ne subissent aucune modification quand tu les retransmets.

    Ensuite pour comprendre ce qui est transmit, il faudrait pouvoir désérialiser les messages... sans information sur le mode de sérialisation, ça risque d'être compliqué...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    oui j'ai effectivement pensé au fait que les données ne serait pas "lisibles" telles quelles, j'ai essayé d'afficher en binaire, même en hexa (sait on jamais) mais rien n'était très parlant.
    Au final vu que je ne cherche pas à intrépréter les messages mais juste à les connaître pour les transmettre à volonté, j'ai essayé en prenant le message de A et en le remettant tel quel dans la pipe pour B et c'est là que j'obtiens mon erreur. C'est pour cela que je pense qu'il y a de ma part une incompréhension du fonctionnement des pipes qui fait que je dois déformer le message avant de le transmettre à B.

    Mon but final est en fait de connaitre ce que B donne comme ordres à A pour pouvoir le faire à sa place (démarre la caméra, arrête la caméra, commence à envoyer les données....)

    Je te remercie en tous cas de tes propositions; actuellement j'essaie de nettoyer mon code pour le montrer, peut-être que certains d'entre vous pourrez m'en indiquer les erreurs.

  4. #4
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    En fait, les "modifications" peuvent être multiple à ce niveau.

    Tu reçois un message inconnu avec ton programme du milieu.
    Comment lit il le message dans le pipe? lecture de flux binaire? Mais comment détermines tu la fin d'un message?
    En cas de lecture de texte par exemple, il se peut que ton programme reçoive un charactere qu'il comprendra comme une fin de message alors que ce n'est pas le cas, juste du binaire qui serait mal interprété.
    Comment stocke tu le message en attendant de le renvoyer? buffer binaire?
    La "methode" de stockage peut aussi altéré le message.

    Qu'on me corrige si je dis des bétises biensur.

    Je pense que ton code pourrait en effet aider à voir où ça ne va plus.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    désolée de répondre si tardivement. J'ai remporté le code chez moi et l'ait travaillé plus à tête reposée; En changeant des paramètres dans la construction de la pipe, j'ai réussi à ne plus "modifier" le code renvoyé et maintenant B réagit bien, du moins au début, aux échanges faits avec A. J'arrive à récupérer le numéro de série de la caméra et à lui donner l'ordre de débuter; mais au bout d'un moment les ordres ne semblent plus bien passer et je n'en trouve pas l'origine.

    Sunsawe> en fait normalement si j'ai bien compris comment cela marche, il ne semble pas y avoir de caractère de fin qui spécifie le moment où untel a fini de parler ; je demande la réception d'un message, et dès qu'un message (normalement complet) est arrivé, je réceptionne et renvoie.

    Merci pour votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    	HANDLE hPipeB, hPipeA;
     
    	//Création de la Boîte aux Lettres pour communiquer avec le programme B
    	MakeSlot("\\\\.\\mailslot\\coordinate_engine");
    	if (hSlot == INVALID_HANDLE_VALUE)
    	{	cout<<"Echec ouverture pipe B \n"<<endl;
    		return 0;
    	}
    	else
    	{ 	//La boîte est créée ; on attend l'arrivée d'un message
    		cout<<"Mail Server cree \n"<<endl;
    		// création d ela pipe pour le programme B
    		hPipeB = CreateNamedPipe( "\\\\.\\pipe\\coordinate_engine", // pipe name 
    							PIPE_ACCESS_DUPLEX, // read/write access 
    							PIPE_TYPE_MESSAGE , 
    							1,
    							1024, // output buffer size 
    							1024, // input buffer size 
    							2000, // client time-out 
    							NULL);
     
    		// création de la pipe pour le programme B
    		hPipeA = CreateFileA( "\\\\.\\pipe\\coordinate_engine_input", // pipe name 
    							GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     
    		// Mise en pause pour me laisser le temps d'ouvrir le programme B....
    		Sleep(4000);	
    		if (hPipeA == INVALID_HANDLE_VALUE)
    		{	cout<<"Echec ouverture pipe B \n"<<endl;	}
    		else
    		{	cout<<"Pipe A OK \n"<<endl;	
     
    			DWORD cbRead;							// Va stocker le nombre de bits recus
    			bool fSuccessA=false, fSuccessB=false;	// Lorsque fSuccessA = true, on a reçu correctement un message sur la pipe A; idem pour fSuccess B
    			TCHAR messageB [MAX_PATH];				// Tableaux de TCHAR qui vont nous permettre de stocker les messages reçus respectivement par A et B
    			TCHAR messageA [MAX_PATH];
     
    			//** On passe les pipes en mode non-bloquant: on ne sera pas obligés d'attendre si une pipe ne reçoit pas de message
    			DWORD dw = PIPE_NOWAIT;	
    			SetNamedPipeHandleState(hPipeA, &dw, NULL, NULL);
    			SetNamedPipeHandleState(hPipeB, &dw, NULL, NULL);
     
    			//**Les deux pipes sont connectées, passées en mode non bloquant: on peut commencer. 
    			while (1)	
    			{	// Tant qu'on a pas reçu de message sur A OU sur B, on boucle. 
    				//Je fais ainsi car A et B peuvent envoyer des messages n'importe quand, cela ne semble pas fonctionner au "chacun son tour"
    				do {		// On essaie d elire un message sur B...
    							fSuccessB = ReadFile(hPipeB, // pipe handle
    										messageB ,// buffer to receive reply
    										sizeof(messageB), // size of buffer
    										&cbRead, // number of bytes read
    										NULL); // not overlapped
     
    							// On essaie de lire un message sur A...
    							fSuccessA = ReadFile(hPipeA, // pipe handle
    								messageA ,// buffer to receive reply
    								sizeof(messageA), // size of buffer
    								&cbRead, // number of bytes read
    								NULL); // not overlapped
    			}while (!fSuccessA && !fSuccessB); 
     
    			//** Cas où A a reçu un message
    			if (fSuccessA)
    			{	// On essaie de l'afficher... Avec t_printf qui est censé afficher correctement un TCHAR si je ne m'abuse
    				cout<<"Contenu du message A:"<<endl;	
    				_tprintf("%s\n ",TEXT(messageA));
     
    				// On l'écrit tel quel dans la pipe B
    				WriteFile(  hPipeB,  messageA,sizeof(messageA),&cbRead, NULL); 
    			}
     
    			//** Cas où B a reçu un message: exactement la même que pour A
    			if (fSuccessB)
    			{	cout<<"Contenu du message B:"<<endl;	
    				_tprintf("%s\n ",TEXT(messageB));
     
    				// On l'écrit tel quel dans la pipe A
    				WriteFile(  hPipeA,  messageB, 	sizeof(messageB),&cbRead, NULL); 
    			}
    		}
    	}

Discussions similaires

  1. Probleme de pipe et de process pere-fils sous Windows
    Par Ipone dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 14/04/2010, 12h52
  2. [Aide] Named Pipes sous windows
    Par azalsup dans le forum Visual C++
    Réponses: 3
    Dernier message: 28/01/2008, 16h39
  3. pipe() sous windows
    Par youp_db dans le forum Windows
    Réponses: 1
    Dernier message: 30/08/2006, 14h16
  4. Pipe sous windows via Perl
    Par Dubitatif dans le forum Langage
    Réponses: 3
    Dernier message: 14/04/2006, 09h40
  5. Communication par pipe sous Windows.
    Par Pragmateek dans le forum Windows
    Réponses: 9
    Dernier message: 05/04/2006, 15h22

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