Proces Parent ID ciudat

Acest forum este dedicat intrebarilor de Windows API, folosing C/C++
Post Reply
User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Proces Parent ID ciudat

Post by Silviu Ardelean » 11 Jan 2014, 19:20

Incercam sa ma dau recursiv printr-un tree construit pe baza proceselor din memorie si ajungand la o blucla infinita (implicit stack overflow) am ajuns sa verific mai cu atentie inputul si trebuie sa recunosc ca imi scapa de ce ajung sa am o legatura circulara processID <--> parentID.
Pe concret, de jos in sus ar fi bucla de la procesul cu PID 260 la 588 si hop inapoi.
  • PID: 436 Name: svchost.exe ParentPID: 588
    PID: 532 Name: wininit.exe ParentPID: 436
    PID: 588 Name: services.exe ParentPID: 532
    PID: 260 Name: svchost.exe ParentPID: 588
Acelasi lucru daca plec de la 444 sau orice child al procesului 588, etc.

Modul cum enumar procesele (inputul) este obtinut asa:

Code: Select all

bool EnumProcessList()
{
   HANDLE hProcessSnap, hProcess;
   PROCESSENTRY32 pe32;

   // Take a snapshot of all processes in the system.
   hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
   if( hProcessSnap == INVALID_HANDLE_VALUE )
   {
      _tprintf( _T("CreateToolhelp32Snapshot (of processes)") );
      return false;
   }

   // Set the size of the structure before using it.
   pe32.dwSize = sizeof( PROCESSENTRY32 );

   if( !Process32First( hProcessSnap, &pe32 ) )
   {
      _tprintf( _T("Process32First") ); // show cause of failure
      CloseHandle( hProcessSnap );          // clean the snapshot object
      return false;
   }

   FILE* pFile = _tfopen(_T("detected_results.txt"), _T("w+"));
   if (nullptr == pFile) {
      CloseHandle( hProcessSnap );         
	   return false;
    }
 
   do
   {      
      hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
   
      _ftprintf( pFile, TEXT("\n  PID: %d \t Name: %s \t\t ParentPID: %d"), pe32.th32ProcessID, pe32.szExeFile, pe32.th32ParentProcessID ); 

   } while( Process32Next( hProcessSnap, &pe32 ) );

   CloseHandle( hProcessSnap );

   fclose(pFile);

   return true;
}
Atasamentul contine un fisier detected_results.txt cu rezultatele obtinute pe masina mea si aici e un screenshot din ce-mi prezinta Process Explorer.
Imi scapa de se intampla aceea situatie si ma gandesc ca va trebui sa tratez intr-un mod special procesul services.exe (PID 588).
testProcessesEnumeration.zip
(6.09 KiB) Downloaded 256 times



Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

Re: Proces Parent ID ciudat

Post by Viorel » 12 Jan 2014, 00:47

Multe articole menționează reutilizarea identificatoarelor PID atunci cînd un proces își termină existența și nu mai este referit. Prin urmare coloana th32ParentProcessID ar putea să se refere la un proces care nu e părintele adevărat, pentru că părintele corect a fost terminat anterior și nici nu e în listă. Dacă procesul A pornește procesul B, apoi A se încheie, apoi B pornește procesul C care reutilizează PID-ul lui A, atunci rezultă un ciclu între B și C.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Proces Parent ID ciudat

Post by Silviu Ardelean » 12 Jan 2014, 12:41

Viorel wrote:Multe articole menționează reutilizarea identificatoarelor PID atunci cînd un proces își termină existența și nu mai este referit. Prin urmare coloana th32ParentProcessID ar putea să se refere la un proces care nu e părintele adevărat, pentru că părintele corect a fost terminat anterior și nici nu e în listă. Dacă procesul A pornește procesul B, apoi A se încheie, apoi B pornește procesul C care reutilizează PID-ul lui A, atunci rezultă un ciclu între B și C.
Chiar daca fac un snapshot al proceselor din sistem, situatia descrisa de tine Viroel are sens si pentru a vedea cum se comporta Process Explorer am intreprins un test creeand un proces mspaint.exe din aplicatia de test.
process_before_and_after_parent_died.png
process_before_and_after_parent_died.png (24.47 KiB) Viewed 4833 times
Dupa cum se poate observa, in momentul in care procesul parent a murit, ramura lui mspaint.exe a fost distrusa si procesul apare ca proces legat de radacina.

Numai ca in cazul cu bucla infinita enuntat mai sus mi-e teama ca avem de-a face cu o situatie mai delicata.
Pe concret, cazul proceselor mai sus mentionat e actual in PE (PID: 260 Name: svchost.exe ParentPID: 588... etc).
process_explorer_case.png
process_explorer_case.png (10.58 KiB) Viewed 4833 times
Imi scapa de ce wininit.exe (pid 532) ar avea th32ParentProcessID = 436.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

Re: Proces Parent ID ciudat

Post by Viorel » 12 Jan 2014, 13:32

În Process Explorer se poate afișa Properties pentru fiecare proces, de ex. pentru wininit.exe. Dacă acolo scrie „Parent: <Non-existent Process> (436)”, înseamnă că părintele a fost terminat, iar PID-ul 436 a fost atribuit unui alt proces lansat mai tîrziu. De aici o modalitate simplă de a verifica dacă th32ParentProcessID e sigur: http://m-a-tech.blogspot.com/2010/05/pr ... ndows.html

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Proces Parent ID ciudat

Post by Silviu Ardelean » 12 Jan 2014, 14:17

Viorel wrote:În Process Explorer se poate afișa Properties pentru fiecare proces, de ex. pentru wininit.exe. Dacă acolo scrie „Parent: <Non-existent Process> (436)”, înseamnă că părintele a fost terminat, iar PID-ul 436 a fost atribuit unui alt proces lansat mai tîrziu. De aici o modalitate simplă de a verifica dacă th32ParentProcessID e sigur: http://m-a-tech.blogspot.com/2010/05/pr ... ndows.html
Make sense. :thumbup:
Deci nu ne putem baza doar pe PROCESSENTRY32.th32ParentProcessID ci mai e nevoie si sa verificam cu GetProcessTimes() timpul de creeare al procesului parent pentru a sti daca PIDul sau inca mai e valabil.

Post Reply