Используя Debugger, как получить PID дочернего процесса от Parent
Я хочу знать, используя windbg или любой другой отладчик, как я могу получить PID дочернего процесса, созданного родительским процессом.
Пример:
Отладчик подключен к произвольно запущенному "процессу А".
Когда отладчик подключен к процессу A(родительский), процесс A создает другой дочерний процесс (процесс B), используя kernel32!CreateProcess* или kernel32!CreateProcessInternal.
Так как я могу получить PID процесса B из процесса A??
В основном я хочу сделать это с помощью pydbg, но если я узнаю, как сделать это вручную с помощью windbg, я надеюсь, что смогу сделать то же самое с помощью pydbg.
Заранее спасибо,
2 ответа
В WinDbg есть и команда .childdbg 1
так что вы просто отлаживаете все дочерние процессы.
Вот более длинная версия с использованием точек останова при отладке в пользовательском режиме:
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
это идентификатор процесса дочернего процесса. Если процесс не умирает сразу, вы можете использовать .tlist
перепроверить.
Если у вас нет символов, вы все равно можете сбросить память
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
Вы можете использовать команду handle windbg для поиска Process с флагом 0xf, чтобы получить pid дочернего процесса
код скомпилирован с помощью cl /Zi /nologo /W4 / анализировать%1% / ссылка /RELEASE
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
Процесс, запущенный выше, работает следующим образом (обратите внимание на pid или parent and child)
tlist -t показывает вид дерева **
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
откройте приглашение windbg или cdb, присоедините его к родительскому процессу и получите все дескрипторы типа Process и.detach из родительского процесса (сравните pids, извлеченные с помощью tlist и cdb)
C:> cdb -c "! Handle 0 f Process;.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:\>