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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| #include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
void GetAllPrivileges()
{
HANDLE lhTokenHandle;
LUID tLuid;
TOKEN_PRIVILEGES tTokenPriv;
TOKEN_PRIVILEGES tTokenPrivNew;
unsigned long lBufferNeeded;
HANDLE hProc;
//obtient le handle de ce process
hProc = GetCurrentProcess();
//change les droits de cette application
OpenProcessToken( hProc, TOKEN_ALL_ACCESS, &lhTokenHandle );
LookupPrivilegeValue( "", SE_DEBUG_NAME, &tLuid );
//détermine le nombre de privileges à changer
tTokenPriv.PrivilegeCount = 1;
tTokenPriv.Privileges[0].Luid = tLuid;
tTokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//autorise le privilege SE_DEBUG_NAME
AdjustTokenPrivileges( lhTokenHandle, false, &tTokenPriv, sizeof( tTokenPrivNew ), &tTokenPrivNew, &lBufferNeeded );
//ferme les handles
CloseHandle( lhTokenHandle );
}
bool GetProcessId( char *Name, unsigned long *Pid )
{
HANDLE Hp;
PROCESSENTRY32 pe32;
// handle qui contient tout les handle processus
Hp = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( Hp == INVALID_HANDLE_VALUE )
{
printf( "CreateToolhelp32Snapshot\n" );
return false;
}
// rentre la taille de la structure
pe32.dwSize = sizeof( PROCESSENTRY32 );
// retrouve les informations du premier processus
// et quitte si echoue
if( !Process32First( Hp, &pe32 ) )
{
printf( "Process32First\n" );
CloseHandle( Hp );
return false;
}
// recherche les informations des processus suivant
// et quitte des qu'il n'y a plus de processus
while( Process32Next( Hp, &pe32 ) )
{
if( strcmp( pe32.szExeFile, Name ) == 0)
{
*Pid = pe32.th32ProcessID;
break;
}
}
CloseHandle( Hp );
if( strcmp( pe32.szExeFile, Name ) != 0)
{
printf( "Processus non trouver\n" );
return false;
}
return true;
}
void RetrieveMemRegions( unsigned long PID, unsigned long **lBaseAdress, unsigned long **lRegionSize, unsigned long *SizeBA, unsigned long *SizeRS)
{
HANDLE lHandle;
unsigned long lPosMem;
unsigned long lRet;
unsigned long lLenMBI;
MEMORY_BASIC_INFORMATION mbi;
SYSTEM_INFO si;
//initialise les tableaux
*lBaseAdress = (unsigned long*) malloc( sizeof( unsigned long ) );
*lRegionSize = (unsigned long*) malloc( sizeof( unsigned long ) );
//obtient le handle du processus
lHandle = OpenProcess( PROCESS_ALL_ACCESS, false, PID );
lLenMBI = sizeof(mbi); //taille de la structure
GetSystemInfo( &si ); //obtient les infos sur les adresses de début et de fin de la plage mémoire maximum
lPosMem = (unsigned long) si.lpMinimumApplicationAddress; //adresse la plus petite ==> part de là
while( lPosMem < (unsigned long) si.lpMaximumApplicationAddress ) //tant que l'adresse est inférieure à l'adresse maximale
{
mbi.RegionSize = 0;
//obtient les infos sur les régions mémoire du processus définit par son handle hProcess
lRet = VirtualQueryEx( lHandle, &lPosMem, &mbi, lLenMBI );
if( lRet == lLenMBI)
{
if( mbi.Type == MEM_PRIVATE && mbi.State == MEM_COMMIT )
{
//alors utilisé par le processus
if( mbi.RegionSize > 0 )
{
//région non nulle, alors on la stocke dans les tableaux résultats
//les redimensionne
*SizeBA = *SizeBA + 1;
*SizeRS = *SizeRS + 1;
*lBaseAdress = (unsigned long*) realloc( *lBaseAdress, sizeof( unsigned long ) * (*SizeBA) );
*lRegionSize = (unsigned long*) realloc( *lRegionSize, sizeof( unsigned long ) * (*SizeRS) );
//stocke à la fin
*lRegionSize[*SizeRS - 1] = mbi.RegionSize;
printf("taille region %d : %d\n", *SizeRS, mbi.RegionSize);
*lBaseAdress[*SizeBA - 1] = (unsigned long) mbi.BaseAddress;
printf("adresse page %d : %d\n", *SizeBA, (unsigned long) mbi.BaseAddress);
}
}
//continue la recherche des régions (ajoute la taille de la région à l'adresse de départ ==> donne la prochaine adresse de départ)
//On Error GoTo ErrCapacityGestion 'dépassement de capacité pour la dernière adresse+regiosize
lPosMem = (unsigned long) mbi.BaseAddress + mbi.RegionSize; //fait l'ajout
}
else
{
//recherche terminée
break;
}
}
//ErrCapacityGestion:
CloseHandle( lHandle ); //ferme le handle du processus
}
int main(void)
{
unsigned long Pid, *BaseAdress, *RegionSize, SizeBA = 0, SizeRS = 0;
GetAllPrivileges();
if( GetProcessId( "explorer.exe", &Pid ) )
printf( "PID : %d\n", Pid);
RetrieveMemRegions( Pid, &BaseAdress, &RegionSize, &SizeBA, &SizeRS );
return true;
} |
Partager