windows - 使用调试器如何从父进程获取子进程的 PID

标签 windows debugging winapi windbg pydbg

我想知道,使用 windbg 或任何其他调试器如何获取父进程创建的子进程的 PID。

示例:

附加到任意运行的“进程 A”的调试器。

当调试器附加到进程 A(父进程)时,进程 A 使用 kernel32!CreateProcess* 或 kernel32!CreateProcessInternal 创建另一个子进程(进程 B)。

那么如何从进程A获取进程B的PID呢??

主要是我想用 pydbg 来做,但如果我知道如何使用 windbg 手动实现这个,我希望我能用 pydbg 做同样的事情。

提前致谢

最佳答案

在 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 是子进程的进程ID。如果进程没有立即死亡,可以使用.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

关于windows - 使用调试器如何从父进程获取子进程的 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24352074/

相关文章:

delphi - 如何在Delphi中正确使用IFileOperation删除文件夹中的文件

windows - Windows 上同一个 bat 文件中的多个命令?

windows - 有没有办法在 Windows 7/8 中关闭 Windows 显示驱动程序模型 (WDDM)?

html - 为什么导航栏元素在尝试将其移动到左侧时会与 Logo 一起移动?

debugging - 代码执行过程中上报信息 : best design

c++ - 使用 ws_ex_transparent active c++ 注册鼠标点击

c - 有没有办法从组框内的按钮获取消息?

windows - 在 Visual Studio Code 中更改工作区目录

c++ - 可执行错误 : Can't start program

c# - 捕获 OutOfMemoryException 使调试变得困难