2014-06-22 2 views
1

Je veux savoir, en utilisant windbg ou tout autre débogueur, comment puis-je obtenir le PID du processus enfant créé par le processus parent.Utilisation du débogueur Comment obtenir le PID du processus fils du parent

Exemple:

débogueur attaché au fonctionnement arbitraire "Procédé A". Lorsque le débogueur est connecté au processus A (parent), le processus A crée un autre processus enfant (processus B) à l'aide de kernel32! CreateProcess * ou kernel32! CreateProcessInternal.

Comment puis-je obtenir le PID du processus B du processus A? Principalement, je veux le faire en utilisant pydbg mais si j'arrive à savoir comment y parvenir manuellement en utilisant windbg, j'espère que je serai capable de faire la même chose en utilisant pydbg.

Merci à l'avance,

Répondre

3

Dans WinDbg, il y a aussi la commande .childdbg 1 afin que vous déboguez simplement tous les processus enfants.

est ici la version plus à l'aide des points d'arrêt lorsque vous effectuez le débogage en mode utilisateur:

0:000> .symfix e:\debug\symbols 

0:000> .reload 
Reloading current modules 
..... 

0:000> bp kernel32!CreateProcessW 

0:000> g 
Breakpoint 0 hit 
*** WARNING: Unable to verify checksum for GetChildPID.exe 
eax=00467780 ebx=7efde000 ecx=00467804 edx=00000004 esi=003af960 edi=003afa94 
eip=755c103d esp=003af934 ebp=003afa94 iopl=0   nv up ei pl zr na pe nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00000246 
kernel32!CreateProcessW: 
755c103d 8bff   mov  edi,edi 

0:000> kb 
ChildEBP RetAddr Args to Child    
003af930 0138148d 00000000 00467804 00000000 kernel32!CreateProcessW 

0:000> dp esp 
003af934 0138148d 00000000 00467804 00000000 // ReturnAddress AppName CommandLine ProcAttr 
003af944 00000000 00000000 00000000 00000000 // ThreadAttr InheritHandles CreationFlags Environment 
003af954 00000000 003afa48 003afa30 00000000 // CurrentDir StartupInfo ProcessInfo 

0:000> du 00467804 
00467804 "notepad.exe" 

0:000> dt 003afa30 PROCESS_INFORMATION 
GetChildPID!PROCESS_INFORMATION 
    +0x000 hProcess   : (null) 
    +0x004 hThread   : (null) 
    +0x008 dwProcessId  : 0 
    +0x00c dwThreadId  : 0 
0:000> ***// Empty before the call 

0:000> p;gu 
eax=00000001 ebx=7efde000 ecx=755d4964 edx=0000008b esi=003af960 edi=003afa94 
eip=0138148d esp=003af960 ebp=003afa94 iopl=0   nv up ei pl zr na pe nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00000246 
GetChildPID!wmain+0xad: 
0138148d 3bf4   cmp  esi,esp 

0:000> dt 003afa30 PROCESS_INFORMATION 
GetChildPID!PROCESS_INFORMATION 
    +0x000 hProcess   : 0x00000038 Void 
    +0x004 hThread   : 0x00000034 Void 
    +0x008 dwProcessId  : 0x102c 
    +0x00c dwThreadId  : 0xfb0 

102c est l'ID de processus du processus enfant. Si le processus ne meurt pas immédiatement, vous pouvez utiliser .tlist pour effectuer une vérification croisée.

Si vous ne disposez pas des symboles, vous pouvez toujours vider la mémoire

0:000> p;gu 
eax=00000001 ebx=7efde000 ecx=755d4964 edx=0000008b esi=003ef910 edi=003efa44 
eip=0138148d esp=003ef910 ebp=003efa44 iopl=0   nv up ei pl zr na pe nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00000246 
GetChildPID!wmain+0xad: 
0138148d 3bf4   cmp  esi,esp 

0:000> dp esp-4 L1 
003ef90c 003ef9e0 

0:000> dp 003ef9e0 L4 
003ef9e0 00000038 00000034 00000cc0 00001320 
+0

Excellent! Merci beaucoup pour cette excellente explication.Il m'a vraiment aidé. Que faire si le processus enfant est déjà en cours d'exécution et que nous ne pouvons pas définir BP @ CreateProcess *(). –

+0

read ma réponse il répond en fait à la fois votre requête d'origine dans un autre fil, ce post et le commentaire que vous postez ci-dessus demandant comment récupérer pid d'un processus enfant en cours d'exécution. – blabb

+0

@DavidA. blabb a raison. Tant que le processus parent a un handle pour le processus enfant ouvert, vous pouvez utiliser '! Handle 0 f Process'. Notez que * Process Id * et * Parent Process * sont donnés en décimal. Vous ne pouvez pas obtenir des processus enfant-enfant comme ça et vous ne serez pas en mesure de comprendre si le processus de l'enfant est mort mais l'enfant-enfant est toujours vivant. Process Explorer a le même problème. Windows ne gère pas les relations parent-enfant des processus. –

2

vous pouvez utiliser la commande de poignée de windbg pour rechercher des procédés avec 0xf de drapeau pour obtenir le pid du processus enfant

Code compilé avec cl/Zi/nologo/W4/analyser % 1%/link/dE PRESSE

C:\>type codesnips\childdbg\childdbg.cpp 
#include <stdio.h> 
#include <windows.h> 
int main (void) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 
    if(!CreateProcess("c:\\windows\\system32\\calc.exe",NULL,NULL, NULL, FALSE 
,0,NULL,NULL,&si,&pi)) 
    { 
     printf("CreateProcess failed (%d).\n", GetLastError()); 
     return 0; 
    } 
    printf("waiting and watching when calc.exe will be no more\n"); 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    printf("calc.exe no more i am free to quit watching\n"); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
    return 0; 
} 
    C:\> childdbg.exe 
waiting and watching when calc.exe will be no more 
processus

a commencé à courir au-dessus de la manière suivante (notez pid ou parent et enfant)

tlist -t montre l'arborescence **

C:\>tlist -t | grep -A 1 child 
    opera.exe (1164) windows - How Internet Explorer(IE11)Creates low Integrity child process without CreateProcess Call - Stack Overflow - Opera 
    childdbg.exe (6992) C:\codesnips\childdbg\childdbg.exe 
    calc.exe (7040) Calculator 

ouvrir un windbg ou cdb rapide attacher au processus parent récupérer toutes les poignées sont de type processus et .detach du parent (comparer les pid via tlist récupérées et cdb)

C:> cdb -c "! 0 f poignée processus; .detach; q" pn childdbg.exe

0:001> cdb: Reading initial command '!handle 0 f Process;.detach;q' 
Handle 28 
    Type   Process 
    Attributes 0 
    GrantedAccess 0x1f0fff: 
     Delete,ReadControl,WriteDac,WriteOwner,Synch 
     Terminate,CreateThread,,VMOp,VMRead,VMWrite,DupHandle,CreateProcess,Set 
Quota,SetInfo,QueryInfo,SetPort 
    HandleCount 4 
    PointerCount 18 
    Name   <none> 
    Object Specific Information 
    Process Id 7040 
    Parent Process 6992 
    Base Priority 8 
1 handles of type Process 
Detached 
quit: 

C:\> 
+0

Dans ce cas, vous auriez pu utiliser 'pi.dwProcessId' –

+0

@Ben vous ne pouvez pas utiliser Pi.dw lors de la fixation à une procédure arbitraire de windbg vous n'avez tout simplement pas le code (mon code ci-dessus est un exemple pour illustrer l'attachement pas pour utiliser des composants de niveau source – blabb

+0

Merci @blabb! –

Questions connexes