+ All Categories
Home > Documents > Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

Date post: 03-Apr-2015
Category:
Upload: zoe-bellec
View: 128 times
Download: 0 times
Share this document with a friend
Popular Tags:
45
jc/md/lp-01/05 Communication inter processus co rrigé 1 Communication inter process Corrigé
Transcript
Page 1: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 1

Communication inter process

Corrigé

Page 2: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 2

Objectif du chapitre

• Notions de mémoire locale, publique et partagée• Passage d’adresses entre deux process

Page 3: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 3

INTER_DE.h

#include <Pkfuncs.h>

typedef struct

{

DWORD dwProcPermissions;

WCHAR *MapPtr;

}BUFFERINFORMATION;

Page 4: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 4

INTER_D (1)

// INTER_D.cpp : Defines the entry point for the application.

#include "stdafx.h"

#include "INTER_DE.h"

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

Page 5: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 5

INTER_D (2)

WCHAR wcBuffer[256] = {_T("JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE

INTER_D !!!")};

BUFFERINFORMATION BufferInformation;

HANDLE hFileMapping;

LPVOID lpMappedMemAddress;

PROCESS_INFORMATION process_info_INTER_E;

DWORD dwExitCode_INTER_E;

Page 6: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 6

INTER_D (3)

// Création du nom de partage

hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0,1024, _T("POUR_ACCES_MEMOIRE_PRIVEE"));

if(hFileMapping == NULL)

{

RETAILMSG(1,(TEXT("INTER_D: Pb Création POUR_ACCES_MEMOIRE_PRIVEE.\n")));

return ExitProcess(0);

}

Page 7: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 7

INTER_D (4)

// Récupération de l'adresse utilisable pour communiquer

lpMappedMemAddress = MapViewOfFile( hFileMapping,FILE_MAP_WRITE,0,0,0);

if(lpMappedMemAddress == NULL){

RETAILMSG(1,(TEXT("INTER_D: Pb adresse mémoire de communication\n")));

return ExitProcess(0);}

Page 8: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 8

INTER_D (5)

// Édition de messages

RETAILMSG(1,(TEXT("INTER_D: Adresse du buffer: %x\n"),wcBuffer));

RETAILMSG(1,(TEXT("INTER_D: Information à transférer: %s\n"),wcBuffer));

RETAILMSG(1,(TEXT("INTER_D: Adresse mémoire pour la communication:%x\n"), lpMappedMemAddress));

Page 9: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 9

INTER_D (6)

// Récupération des permissionsBufferInformation.dwProcPermissions = GetCurrentPermissions();

// Mappage de l'adresseBufferInformation.MapPtr =

(WCHAR *)MapPtrToProcess( wcBuffer,GetCurrentProcess());if(BufferInformation.MapPtr == NULL){ RETAILMSG(1,(TEXT("INTER_D: Pb adresse mappée du buffer\n"))); return 0;}

Page 10: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 10

INTER_D (7)

// Édition de l’adresse après mappage

RETAILMSG(1,(TEXT("INTER_D: Adresse du buffer après mappage:%x\n"), BufferInformation.MapPtr));

// Écriture en mémoire physique

memcpy(lpMappedMemAddress,&BufferInformation, sizeof(BUFFERINFORMATION));

Page 11: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 11

INTER_D (8)

// Création du processus INTER_Eif(!CreateProcess(_T("INTER_E.exe"),NULL,NULL, NULL,NULL,0,NULL,NULL,NULL, &process_info_INTER_E)){

RETAILMSG(1,(TEXT("INTER_D: Pb création du processus INTER_E.exe\n")));

UnmapViewOfFile(lpMappedMemAddress);return ExitProcess(0);

}

Page 12: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 12

INTER_D (9)

// Attente de la fin du processus INTER_E.

while(GetExitCodeProcess( process_info_INTER_E.hProcess, &dwExitCode_INTER_E), dwExitCode_INTER_E == STILL_ACTIVE)

Sleep(0);

RETAILMSG(1,(TEXT("INTER_D: Code de retour fourni par le processus INTER_E = %d\n"),

dwExitCode_INTER_E));

Page 13: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 13

INTER_D (10)

// Libération des ressources

UnmapViewOfFile(lpMappedMemAddress);

UnMapPtr(BufferInformation.MapPtr);

RETAILMSG(1,(TEXT("INTER_D: Fin du processus INTER_D\

n")));

return ExitProcess(0);

}

Page 14: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 14

INTER_E (1)

// INTER_E.cpp : Defines the entry point for the application.

#include "stdafx.h"

#include "INTER_DE.h"

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

Page 15: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 15

INTER_E (2)

// Déclarations

HANDLE hFileMapping;

LPVOID lpMappedMemAddress;

BUFFERINFORMATION BufferInformation;

DWORD dwProcPermissions;

Page 16: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 16

INTER_E (3)

// Ouverture du handle vers la zone de mémoire partagée

hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,0,1024, _T("POUR_ACCES_MEMOIRE_PRIVEE"));

// Vérifier que le handle n’est pas nul et que le nom choisi existe bien

if(hFileMapping==NULL || !(GetLastError() == ERROR_ALREADY_EXISTS)){

RETAILMSG(1,(TEXT("INTER_E: Pb création mémoire partagée.\n")));

return ExitProcess(10000);}

Page 17: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 17

INTER_E (4)

// Récupération de l'adresse mémoire utilisable pour communiquer

lpMappedMemAddress = MapViewOfFile(hFileMapping, FILE_MAP_READ,0,0,0);if(lpMappedMemAddress == NULL){ RETAILMSG(1,(TEXT("INTER_E: Pb adresse mémoire partagée.\n"))); return ExitProcess(20000);}

Page 18: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 18

INTER_E (5)

RETAILMSG(1,(TEXT("INTER_E: Adresse mémoire pour la communication: %x\n"),lpMappedMemAddress));

// Récupération et visualisation des informations passées dans la mémoire partagée

memcpy(&BufferInformation,lpMappedMemAddress, sizeof(BUFFERINFORMATION));

RETAILMSG(1,(TEXT("INTER_E: Adresse du buffer en absolu: %x\n"),BufferInformation.MapPtr));

RETAILMSG(1,(TEXT("INTER_E: Permissions du processus INTER_D: %04x\n"), BufferInformation.dwProcPermissions));

Page 19: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 19

INTER_E (6)

// Sauvegarde des permissions courantes de ce processus

dwProcPermissions = GetCurrentPermissions();

RETAILMSG(1,(TEXT("INTER_E: Permissions du processus INTER_E: %04x\n"), dwProcPermissions));

// Remplacement des permissions d'accès par celles du process INTER_D

SetProcPermissions( BufferInformation.dwProcPermissions);

Page 20: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 20

INTER_E (7)

// Lecture et visualisation du buffer du process INTER_D

RETAILMSG(1,(TEXT("INTER_E: Lecture du buffer dans INTER_D: %s\n"), BufferInformation.MapPtr));

// Restauration des permissions antérieures du process INTER_E

SetProcPermissions(dwProcPermissions);

Page 21: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 21

INTER_E (8)

// Libération du lien

UnmapViewOfFile(lpMappedMemAddress);

RETAILMSG(1,(TEXT("INTER_E: Fin du processus INTER_E\n")));

// Libération des ressources et retour

return ExitProcess(12345);

}

Page 22: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 22

Exécution de INTER_D

1724860 PID:e2db71aa TID:e2de9fae INTER_D: Adresse du buffer: 1202f9f41724860 PID:e2db71aa TID:e2de9fae INTER_D: Information à transférer: JE SUIS UN

BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!1724880 PID:e2db71aa TID:e2de9fae INTER_D: Adresse mémoire pour la

communication: 46d000001724880 PID:e2db71aa TID:e2de9fae INTER_D: Adresse du buffer après mappage:

1202f9f41724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Adresse mémoire pour la

communication: 46d000001724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Adresse du buffer en absolu: 1202f9f41724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Permissions du processus INTER_D:

01011724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Permissions du processus INTER_E:

02011724980 PID:c2f25b52 TID:c2f7cb8a INTER_E: Lecture du buffer dans INTER_D: JE

SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!1734990 PID:c2f25b52 TID:c2f7cb8a INTER_E: Fin du processus INTER_E1735000 PID:e2db71aa TID:e2de9fae INTER_D: Code de retour fourni par le processus

INTER_E= 123451735000 PID:e2db71aa TID:e2de9fae INTER_D: Fin du processus INTER_D

Page 23: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 23

Essai de Remote Process Viewer

• Remote Process Viewer est un outil qui permet d’obtenir des informations sur les processus en cours d’exécution : identificateur de processus (PID), priorité, slot affecté, etc.

• C’est un instantané des processus pris à l’instant de lancement de l’outil ou quand effectue un rafraîchissement.

• Nous voulons utiliser cet outil pour examiner les slots de chargement des processus.

Page 24: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 24

Modification de INTER_E (1)

• Pour avoir le temps de faire un rafraîchissement des informations pour Remote Process Viewer, après lancement de INTER_D nous arrêtons le processus INTER_E par une demande de confirmation dans une boîte de message. Sinon, l’exécution est finie avant le rafraîchissement.

• Rafraîchissement– Se placer dans la fenêtre Remote Process Viewer– Menu Connection→Refresh– Touche de fonction F5

Page 25: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 25

Modification de INTER_E (2)

• À placer juste avant le message de fin :

MessageBox(NULL, _T("cliquer sur 'OK‘ pour terminer"), _T("Communication inter processus"), MB_OK);

• Refaire l’exécutable INTER_E.exe• Refaire l’image à télécharger

Page 26: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 26

Essai de INTER_D

• Télécharger l’image dans la cible• Appeler l’outil « Remote Process Viewer »• Choisir la cible par défaut (émulateur)• Examiner les processus en cours• Lancer le processus INTER_D• Observer les messages dans la fenêtre de sortie • Exploiter les résultats

– Slots en mémoire– Permissions   

Page 27: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 27

Après chargement de l’image

Page 28: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 28

Appel de Remote Process Viewer

Page 29: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 29

Choix de la cible par défaut

Page 30: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 30

Processus en cours d’exécution

Ni INTER_D ni INTER_E ne sont présents. Il n’y a que les processus en cours avant le

lancement de INTER_D.

Page 31: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 31

Actualisation Remote Process Viewer

Page 32: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 32

Après lancement de INTER_D

INTER_D et INTER_E sont actifs

Page 33: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 33

Messages

31650 PID:2db719a TID:2db7092 INTER_D: Adresse du buffer: 1602f9f431650 PID:2db719a TID:2db7092 INTER_D: Information à transférer: JE SUIS

UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!31650 PID:2db719a TID:2db7092 INTER_D: Adresse mémoire pour la

communication: 46c0000031650 PID:2db719a TID:2db7092 INTER_D: Adresse du buffer après

mappage: 1602f9f431740 PID:a2db7d12 TID:a2db7c72 INTER_E: Adresse mémoire pour la

communication: 46c0000031740 PID:a2db7d12 TID:a2db7c72 INTER_E: Adresse du buffer en absolu:

1602f9f431740 PID:a2db7d12 TID:a2db7c72 INTER_E: Permissions du processus

INTER_D: 040131740 PID:a2db7d12 TID:a2db7c72 INTER_E: Permissions du processus

INTER_E: 080131750 PID:a2db7d12 TID:a2db7c72 INTER_E: Lecture du buffer dans

INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!

Page 34: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 34

Détails

INTER_D: Adresse du buffer: 1602f9f4INTER_D: Information à transférer: JE SUIS UN BUFFER

EN MEMOIRE PRIVEE DE INTER_D !!!INTER_D: Adresse mémoire pour la communication:

46c00000INTER_D: Adresse du buffer après mappage: 1602f9f4INTER_E: Adresse mémoire pour la communication:

46c00000INTER_E: Adresse du buffer en absolu: 1602f9f4INTER_E: Permissions du processus INTER_D: 0401INTER_E: Permissions du processus INTER_E: 0801INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN

BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!

Page 35: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 35

Exploitation des résultats

• INTER_A a été installé en 16000000 donc slot 11 avec une clé de 400

• INTER_B a été installé en 18000000 donc slot 12 avec une clé de 800

• Pendant l’exécution les permissions passent à 401 et 801 donc accès en plus au slot 1 qui correspond au noyau NK.exe

Page 36: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 36

Clé d’accès à un slot

03 1 8 71 6 1 52 4 2 3

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

E xem p le : C lé 0 x1 0 0 N ° d e slo t p o u vant être accéd é: 9

N ° d e b it d u m asq u e

Masque sur 32 bits : un bit pour 32 slots de 1 à 32

Page 37: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 37

Place en mémoire des processusINTER_E sera en 16000000INTER_D sera en 14000000

N ° S lo t

9

8

7

6

5

4

3

2

1

0

se rv ic e .e x e

e x p lo re r .e x e

c e e m u la to r.e x e

g w e s .e x e

d e v ic e .e x e

sh e ll.e x e

f ile sy s .e x e

P ro c e ss U se rB a se A d d re s s

0 x 0 6 0 0 0 0 0 0

0 x 0 0 0 0 0 0 0 0

0 x 0 2 0 0 0 0 0 0

0 x 0 4 0 0 0 0 0 0

0 x 0 8 0 0 0 0 0 0

0 x 0 A 0 0 0 0 0 0

0 x 0 C 0 0 0 0 0 0

0 x 0 E 0 0 0 0 0 0

0 x 1 0 0 0 0 0 0 0

0 x 1 2 0 0 0 0 0 0

S lo t 0

C lé

1 0 0

8 0

4 0

2 0

1 0

8

4

2

1

Page 38: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 38

INTER_F (1)

• Nous indiquons les modifications à apporter dans INTER_D

• De plus, il faut supprimer la déclaration de wcBuffer devenue inutile

• Ensuite, il faut régénérer INTER_F.exe puis refaire l’image

Page 39: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 39

INTER_F (2)

WCHAR *lpBuffer;

BUFFERINFORMATION BufferInformation;

HANDLE hFileMapping;

LPVOID lpMappedMemAddress;

PROCESS_INFORMATION process_info_INTER_E;

DWORD dwExitCode_INTER_E;

// Allocation dynamique d'espace et remplissage

lpBuffer = (WCHAR*)malloc(256*sizeof(WCHAR));

wcscpy(lpBuffer,_T("Je suis un buffer de l'INTER_F !!!"));

Page 40: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 40

INTER_F (3)

// Édition de messages

RETAILMSG(1,(TEXT("INTER_F: Adresse du buffer: %x\n"),lpBuffer));

RETAILMSG(1,(TEXT("INTER_F: Information à transférer: %s\n"),lpBuffer));

RETAILMSG(1,(TEXT("INTER_F: Adresse mémoire pour la communication:x\n"), lpMappedMemAddress));

// Récupération des permissions

BufferInformation.dwProcPermissions = GetCurrentPermissions();

Page 41: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 41

INTER_F (4)

// Mappage de l'adresse

BufferInformation.MapPtr = (WCHAR *)

MapPtrToProcess(lpBuffer,GetCurrentProcess());if(BufferInformation.MapPtr == NULL){ RETAILMSG(1,(TEXT("INTER_F: Pb adresse mappée du buffer\n"))); return 0;}

Page 42: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 42

INTER_F (5)

// Libération des ressources

free(lpBuffer);

UnmapViewOfFile(lpMappedMemAddress);

UnMapPtr(BufferInformation.MapPtr);

RETAILMSG(1,(TEXT("INTER_F:

Fin du processus INTER_F\n")));

return ExitProcess(0);

}

Page 43: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 43

Exécution de INTER_F

INTER_F: Adresse du buffer: 30050INTER_F: Information à transférer: Je suis un buffer de l'INTER_F !!!INTER_F: Adresse mémoire pour la communication: 46c00000INTER_F: Adresse du buffer après mappage: 16030050INTER_E: Adresse mémoire pour la communication: 46c00000INTER_E: Adresse du buffer en absolu: 16030050INTER_E: Permissions du processus INTER_D: 0401INTER_E: Permissions du processus INTER_E: 0801INTER_E: Lecture du buffer dans INTER_D: Je suis un buffer de

l'INTER_F !!!INTER_E: Fin du processus INTER_EINTER_F: Code de retour fourni par le processus INTER_E = 12345INTER_F: Fin du processus INTER_F

Page 44: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 44

Mappage de l’adresse

• On voit ici que la fonction MapPtrToProcess dans INTER_F a bien son utilité :

– Avant mappage :Adresse du buffer: 30050

– Après mappage :Adresse du buffer après mappage: 16030050

• INTER_E pourra récupérer la zone qui avait été allouée dynamiquement dans INTER_F

Page 45: Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

jc/md/lp-01/05 Communication inter processus corrigé 45

Conclusion

• Exemples pratiques de communication d’information entre plusieurs process situés chacun dans un espace privé.


Recommended