Использует ли ProcDump отладочную кучу?
Когда мы запускаем приложение в отладчике, таком как Visual Studio 2013 или WinDbg, Windows использует для этого кучу отладки. Однако представляется возможным отключить это поведение, как это делается в Visual Studio 2015 или WinDbg при запуске с -hd
переключатель командной строки.
Теперь есть ProcDump, и он ведет себя как отладчик; на самом деле он может быть установлен как отладчик AE после -i
переключатель.
Как узнать, работает ли приложение с ProcDump? -x
свитч будет использовать отладочную кучу или нет? Кажется, что нет опции командной строки для изменения поведения, и я не уверен, будет ли она учитывать переменную среды _NO_DEBUG_HEAP.
Я думал, что отладчик будет использовать IDebugClient5::CreateProcess2()
или же IDebugClient5::CreateProcessAndAttach2()
начать процесс. Было бы пройти _DEBUG_CREATE_PROCESS_OPTIONS
в котором CreateFlags
может иметь DEBUG_CREATE_PROCESS_NO_DEBUG_HEAP
флаг установлен.
Поэтому я использовал WinDbg и запустил ProcDump под WinDbg. Затем я дождался загрузки модуля Debugger Engine (sxe ld dbgeng
), чтобы я мог установить точку останова и наблюдать за ней - но этот модуль никогда не загружался.
1 ответ
cdb -c "!gflag;q" procdump.exe -x procdump.exe | grep -i -A 5 ntglob
Current NtGlobalFlag contents: 0x00000070
htc - Enable heap tail checking
hfc - Enable heap free checking
hpc - Enable heap parameter checking
quit:
без отладки
cdb -hd -c "!gflag;q" procdump.exe -x procdump.exe | grep -i -A 5 ntglob
Current NtGlobalFlag contents: 0x00000000
quit:
если debugheap ntdll!RtlDebugAllocateHeap используется, иначе нет
содержание скрипта
cat testdbgheap.txt
bp ntdll!RtlDebugAllocateHeap "kb4;q"
g
с dbgheap
cdb -c "$$>a< testdbgheap.txt" -o -g procdump.exe -x foo.dmp "c:\Windows\System32\NETSTAT.EXE" -a
Microsoft (R) Windows Debugger Version 10.0.10586.567 X86
CommandLine: procdump.exe -x foo.dmp "c:\Windows\System32\NETSTAT.EXE" -a
ProcDump v7.1 - Writes process dump files
0:000> cdb: Reading initial command '$$>a< testdbgheap.txt'
ChildEBP RetAddr Args to Child
0022f788 76eda376 00320000 40000062 0000000c ntdll!RtlDebugAllocateHeap
0022f86c 76ea5ae0 0000000c 00000000 00000000 ntdll!RtlpAllocateHeap+0xc4
0022f8f0 0096f5f1 00320000 40000060 0000000c ntdll!RtlAllocateHeap+0x23a
WARNING: Stack unwind information not available. Following frames may be wrong.
0022f910 0096fca0 0000000c 00000000 00000000 procdump+0xf5f1
quit:
без кучи отладки
cdb -hd -c "$$>a< testdbgheap.txt" -o -g procdump.exe -x foo.dmp "c:\Windows\System32\NETSTAT.EXE" -a
Microsoft (R) Windows Debugger Version 10.0.10586.567 X86
CommandLine: procdump.exe -x foo.dmp "c:\Windows\System32\NETSTAT.EXE" -a
ProcDump v7.1 - Writes process dump files
0:000> cdb: Reading initial command '$$>a< testdbgheap.txt'
[23:12:29] Dump 1 initiated: foo.dmp\NETSTAT.EXE_161108_231229.dmp
Active Connections
Proto Local Address Foreign Address State
TCP 192.168.43.171:49464 stackru:https ESTABLISHED
[23:12:29] Dump count not reached.
0:000> q
quit:
procdump не использует функции dbgeng, он использует win32apis CreateProcessW (CreateFlags 0x7)
Вы можете запустить зависит или сброс / импорт, чтобы установить модули
dumpbin /imports procdump.exe | grep -i process
4 EnumProcessModules
C6 DebugActiveProcessStop
A8 CreateProcessW
1C0 GetCurrentProcess
380 OpenProcess
1DF GetExitCodeProcess
4C0 TerminateProcess
396 Process32FirstW
398 Process32NextW
C5 DebugActiveProcess
119 ExitProcess
24C GetProcessId
1C1 GetCurrentProcessId
3C3 ReadProcessMemory
304 IsProcessorFeaturePresent
24A GetProcessHeap
1A4 GetWindowThreadProcessId
212 OpenProcessToken
укладывать на перерыв
cdb -c "bp kernel32!CreateProcessW \"ddu /c 1 @esp lc;q\";g" procdump.exe -x . netstat -a
| grep -i quit -B 11
0178e340 00000000
0178e344 012acc30 ""netstat" -a"
0178e348 00000000
0178e34c 00000000
0178e350 00000000
0178e354 00000007 CreateSuspended | debug process | debug only this
0178e358 00000000
0178e35c 00000000
0178e360 0178e3a0 "D" = 0x44 = sizeof(startupinfo)
0178e364 0178e390 ""
0178e368 00000000
quit:
ОБНОВЛЕНИЕ проверьте дочерний процесс с windbg на procdump over procdump
cdb -hd -g -o -c "! handle 0 f Process;.tlist; q" procdump -x. известково
Microsoft (R) Windows Debugger Version 10.0.10586.567 X86
CommandLine: procdump -x . calc
ProcDump v7.1 - Writes process dump files
0:000> cdb: Reading initial command '!handle 0 f Process;.tlist;q'
Handle e8
Type Process
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Object Specific Information
Process Id 2836
Parent Process 2900
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1 handles of type Process
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
0n2860 cdb.exe
0n2900 procdump.exe
0n2836 calc.exe