jc/md/lp-01/05communication inter processus corrigé1 communication inter process corrigé
TRANSCRIPT
jc/md/lp-01/05 Communication 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
jc/md/lp-01/05 Communication inter processus corrigé 3
INTER_DE.h
#include <Pkfuncs.h>
typedef struct
{
DWORD dwProcPermissions;
WCHAR *MapPtr;
}BUFFERINFORMATION;
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)
{
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;
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);
}
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);}
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));
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;}
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));
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);
}
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));
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);
}
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)
{
jc/md/lp-01/05 Communication inter processus corrigé 15
INTER_E (2)
// Déclarations
HANDLE hFileMapping;
LPVOID lpMappedMemAddress;
BUFFERINFORMATION BufferInformation;
DWORD dwProcPermissions;
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);}
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);}
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));
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);
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);
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);
}
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
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.
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
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
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
jc/md/lp-01/05 Communication inter processus corrigé 27
Après chargement de l’image
jc/md/lp-01/05 Communication inter processus corrigé 28
Appel de Remote Process Viewer
jc/md/lp-01/05 Communication inter processus corrigé 29
Choix de la cible par défaut
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.
jc/md/lp-01/05 Communication inter processus corrigé 31
Actualisation Remote Process Viewer
jc/md/lp-01/05 Communication inter processus corrigé 32
Après lancement de INTER_D
INTER_D et INTER_E sont actifs
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 !!!
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 !!!
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
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
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
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
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 !!!"));
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();
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;}
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);
}
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
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
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é.