Debugging tools for windows windbg

WinDBG – прекрасный отладчик. Возможно, у него не очень дружественный интерфейс и нет по умолчанию черного фона, но это один из самых мощных и стабильных отладчиков в ОС Windows в настоящее время. В этой статье я познакомлю вас с основами WinDBG, чтобы вы могли начать с ним работу.

Автор: Брэд Антониевич (Brad Antoniewicz)

WinDBG – прекрасный отладчик. Возможно, у него не очень дружественный интерфейс и нет по умолчанию черного фона, но это один из самых мощных и стабильных отладчиков в ОС Windows в настоящее время. В этой статье я познакомлю вас с основами WinDBG, чтобы вы могли начать с ним работу.

Эта первая статья из цикла, посвященного WinDBG. Перечень всех статей, входящих в этот цикл:

  • Часть 1 – установка, интерфейс, символы, удаленная/локальная отладка, система помощи, модули, регистры.
  • Часть 2 – точки останова.
  • Часть 3 – инспектирование памяти, пошаговая отладка программ, советы и трюки.

В этой статье мы рассмотрим установку и подсоединение к процессу, а в следующих — точки останова, пошаговую отладку и инспектирование памяти.

Установка WinDBG

По сравнению с Windows 7 процесс установки WinDBG в Windows 8 претерпел небольшие изменения. В этом разделе мы рассмотрим установку отладчика для обеих операционных систем.

Установка WinDBG в Windows 8

В Windows 8 WinDBG включается в пакет Windows Driver Kit (WDK). Вы можете установить Visual Studio и WDK или установить отдельно пакет «Debugging Tools for Windows 8.1», который включает WinDBG.

Программа установки спросит, хотите ли вы установить WinDBG локально или загрузить весь пакет разработчика для другого компьютера. Последнее, по сути, является эквивалентом автономного установщика, что очень удобно, если в будущем вы захотите установить пакет в других системах.

Рисунок 1: Выбор типа установки

В следующем окне вам необходимо снять флажки со всех пунктов кроме «Debugging Tools for Windows» и нажать на кнопку «Download».

Как только установщик закончит свою работу, зайдите в директорию, куда загрузился пакет (по умолчанию это c:\Users\Username\Downloads\Windows Kits\8.1\StandaloneSDK) и пройдите процедуру установки.

Установка WinDBG в Windows 7 и более ранних версиях

Для Windows 7 и более ранних версий WinDBG входит в состав пакета «Debugging Tools for Windows», который включен в состав Windows SDK и .Net Framework. От вас потребуется загрузить инсталлятор, а затем в процессе установки выбрать «Debugging Tools for Windows».

Во время установки я выбираю опцию «Debugging Tools» в разделе «Redistributable Packages», чтобы создать автономный инсталлятор для облегчения последующих установок.

Рисунок 2: Выбор опций установки для создания автономного инсталлятора

По завершению установки, у вас должны появиться инсталляторы WinDBG для различных платформ (в директории c:\Program Files\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\ ).

Рисунок 3: Папка с инсталляторами WinDBG для различных платформ

Далее процесс установки довольно прост. Вам нужно лишь скопировать соответствующий файл на ту машину, где вы собираетесь проводить отладку, и пройти процедуру установки.

Интерфейс WinDBG

Рисунок 4: Внешний вид WinDBG

Как только вы впервые увидите внешний вид WinDGB, то поймете, что отладчик пугающе прост. Большинство функций WinDBG узнаются во время отладки процесса. Вместо того чтобы тратить время на описание интерфейса, в последующих разделах мы рассмотрим только самые важные моменты.

Самое основное, что вам необходимо знать об интерфейсе отладчика, — командное окно, которое состоит из двух областей. Первая область: окно, где выводится результат выполнения команд. Вторая область: небольшое текстовое поле для ввода команд.

Рисунок 5: Командное окно WinDBG

Символы

В большинстве случаев WinDBG не требует особых настроек и корректно работает прямо «из коробки». Но одну важную вещь, которую необходимо настроить, — это символы. Символы – это файлы, которые генерируются вместе с исполняемым файлом во время компиляции программы и содержат отладочную информацию (функции и имена переменных). Отладочная информация позволяет исследовать функциональность приложения во время отладки или дизассемблирования. Многие компоненты Microsoft компилируются вместе с символами, которые распространяются через Microsoft Symbol Server. С остальными исполняемыми файлами все не так радужно, — очень редко файлы с отладочной информацией идут в комплекте с приложением. В большинстве случаев компании ограничивают доступ к подобной информации.

Чтобы настроить WinDBG на использование Microsoft Symbol Server зайдите в раздел File:Symbol File Path и установите путь SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols. Конечно, немного странно, что звездочки используются в качестве разделителя. После того, как вы настроите Microsoft Symbol Server, символы загрузятся в папку C:\Symbols.

Рисунок 6: Настройка Microsoft Symbol Server

WinDBG автоматически загрузит символы для бинарных файлов, когда это будет необходимо. Вы также можете добавить свою собственную папку с символами, например, так:

SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols;c:\SomeOtherSymbolFolder

Добавление символов во время отладки

Если вам нужно импортировать символы во время отладки, то можно сделать это при помощи .sympath (окно для ввода команд появится, когда вы подцепитесь к процессу). К примеру, чтобы добавить папку c:\SomeOtherSymbolFolder, введите следующую команду:

0:025> .sympath+ c:\SomeOtherSymbolFolder

Symbol search path is: SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols;c:\SomeOtherSymbolFolder

Expanded Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\someothersymbolfolder

Будет не лишним выполнить перезагрузку символов после добавления или изменения путей:

0:025> .reload

Reloading current modules

................................................................

...............................................

Проверка загруженных символов

Чтобы увидеть, для каких модулей загружены символы, вы можете воспользоваться командой x*!. Хотя WinDBG загружает символы только по мере надобности, команда x*! покажет символы, которые могут быть загружены. Можно принудительно загрузить символы при помощи команды ld * (на это может уйти некоторое время, и вы можете остановить этот процесс, зайдя в Debug:Break).

Рисунок 7: Принудительная загрузка символов

Теперь мы можем увидеть символы для каждого модуля.

Рисунок 8: Перечень символов

Отладка локального процесса

При отладке локального процесса у вас есть два пути:

  1. Подцепиться к уже запущенному процессу.
  2. Запустить процесс через WinDBG.

У каждого способа есть свои преимущества и недостатки. Если, допустим, вы запустили программу через WinDBG, то вам доступны некоторые специальные отладочные опции (например, отладка кучи), которые могут привести к краху приложения. С другой стороны, существуют также и программы, которые аварийно заканчиваются свою работу, когда вы цепляете к ним отладчик. Некоторые приложения (в особенности, вредоносы) во время запуска проверяют присутствие отладчика в системе и, соответственно, в этом случае имеет смысл цепляться к уже запущенному процессу. Иногда происходит отладка службы под управлением ОС Windows, которая устанавливает некоторые параметры во время запуска, так что для упрощения процесса отладки, также лучше подцепляться к запущенному процессу, а не запускать службу через отладчик. Некоторые люди утверждают, что запуск процесса через отладчик серьезно сказывается на производительности. Короче говоря, попробуйте и то и другое и выберите то, что подходит вам лучше всего. Если вы по каким-то причинам предпочитаете какой-то конкретный способ, поделитесь своими соображениями в комментариях!

Запуск процесса

Если вы отлаживаете отдельное приложение, которое запущено локально и не работает с сетью, возможно, вы захотите запустить его через WinDBG. Однако это не означает, что вы не можете подцепиться к уже запущенному процессу. Выбирайте наиболее удобный для вас способ.

Запустить процесс не составляет труда. Зайдите в «File:Open Executable» и выберите тот исполняемый файл, который хотите отладить. Вы также можете указать аргументы или установить стартовую директорию:

Рисунок 9: Выбор исполняемого файла для отладки

Подключение к процессу

Подключение к уже запущенному процессу также не составляет особого труда. Однако следует обратить внимание на то, что в некоторых случаях может потребоваться время для того, чтобы найти именно тот процесс, который вы хотите отладить. К примеру, некоторые браузеры создают один родительский процесс, а затем еще несколько процессов для каждой вкладки. Таким образом, в зависимости от крэш-дампа, который вы отлаживаете, возможно, вы захотите подцепиться не к родительскому процессу, а к процессу, связанному с вкладкой.

Чтобы подцепиться к уже запущенному процессу зайдите в «File:Attach to a Process», а затем выберите PID или имя процесса. Помните о том, что вам необходимо иметь соответствующие права, чтобы подцепиться к процессу.

Рисунок 10: Выбор процесса, к которому нужно подцепиться

Если после подключения, приложения приостановило свою работу, вы можете использовать режим «Noninvaise», поставив соответствующий флажок.

Отладка удаленного процесса

Возможно, иногда вам будет требоваться отладка процесса на удаленной системе. Было бы намного более удобно решать эту задачу при помощи локального отладчика, вместо использования виртуальной машины или RDP. Или, быть может, вы отлаживаете процесс LoginUI.exe, который доступен только в случае, когда система заблокирована. В подобных ситуациях вы можете использовать локальную версию WinDBG и удаленно подключаться к процессам. Для решения этих задач существует два наиболее распространенных способа.

Существующие отладочные сессии

Если вы уже начали локальную отладку программы (посредством подключения или запуска процесса через WinDBG), то можете ввести определенную команду, и WinDBG запустит «слушатель» (listener), к которому сможет подключиться удаленный отладчик. Для этого используйте команду .server:

.server tcp:port=5005

После запуска вышеупомянутой команды вы можете увидеть такое предупреждение:

Рисунок 11: Сообщение с предупреждением, которое может возникнуть после запуска команды по создания «слушателя»

Затем WinDBG сообщит, что сервер запущен:

0:005> .server tcp:port=5005

Server started. Client can connect with any of these command lines

0: <debugger> -remote tcp:Port=5005,Server=USER-PC

Теперь вы может подключиться с удаленного хоста к уже существующей отладочной сессии, зайдя в «File:Connect to a Remote Session» и введя в текстовое поле примерно следующее: tcp:Port=5005,Server=192.168.127.138

Рисунок 12: Удаленное подключение к отладочной сессии

После подключения вы получите подтверждение на удаленном клиенте:

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86

Copyright (c) Microsoft Corporation. All rights reserved.

Server started. Client can connect with any of these command lines

0: <debugger> -remote tcp:Port=5005,Server=USER-PC

MACHINENAME\User (tcp 192.168.127.138:13334) connected at Mon Dec 16 09:03:03 2013

и сообщение в локальной версии отладчика:

MACHINENAME\User (tcp 192.168.127.138:13334) connected at Mon Dec 16 09:03:03 2013

Создание удаленного сервера

Вы также можете создать отдельный сервер с WinDBG, удаленно подключаться к нему и выбирать процесс для отладки. Это можно сделать, используя файл dbgsrv.exe там, где вы планируете отлаживать процессы. Для запуска подобного сервера запустите следующую команду:

dbgsrv.exe -t tcp:port=5005

Рисунок 13: Запуск удаленного сервера

И опять же вы можете получить предупреждение о безопасности, которое вам следует принять:

Рисунок 14: Сообщение безопасности, которое может возникнуть во время запуска отладочного сервера

К серверу отладки вы можете подключиться, если зайдете в файл «File: Connect to Remote Stub» и введете в текстовое поле следующую строку: tcp:Port=5005,Server=192.168.127.138

Рисунок 15: Подключение к отладочному серверу

После подключения вы не получите каких-то сигналов о том, что вы подключились, однако если вы зайдете в «File:Attach to a Process», то увидите перечень процессов отладочного сервера (там, где запущен dbgsrv.exe). Теперь вы можете подцепляться к процессу, как если бы делали это локально.

Система помощи

Система помощи в WinDBG – великолепна. Помимо изучения чего-то нового, вы должны уметь получать справочную информацию о какой-либо команде. Используйте команду .hh для доступа к справке WinDBG:

windbg> .hh

Вы также можете получить справочную информацию по определенной команде. Например, чтобы получить помощь по команде .reload, используйте следующую команду:

windbg> .hh .reload

Или просто зайдите в раздел «Help:Contents».

Модули

Во время работы программы импортируются различные модули, обеспечивающие функциональность приложения. Следовательно, если вы будете знать, какие модули импортированы приложением, то сможете лучше понять алгоритм его работы. Во многих случаях, вы будете отлаживать конкретный модуль, загруженный программой, а не сам исполняемый файл.

После подключения к процессу WinDBG автоматически отобразит загруженные модули. К примеру, ниже показаны модули, после того, как я подключился к calc.exe:

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86

Copyright (c) Microsoft Corporation. All rights reserved.

*** wait with pending attach

Symbol search path is: SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

Executable search path is:

ModLoad: 00a70000 00b30000 C:\Windows\system32\calc.exe

ModLoad: 77630000 7776c000 C:\Windows\SYSTEM32\ntdll.dll

ModLoad: 77550000 77624000 C:\Windows\system32\kernel32.dll

ModLoad: 75920000 7596a000 C:\Windows\system32\KERNELBASE.dll

ModLoad: 76410000 77059000 C:\Windows\system32\SHELL32.dll

ModLoad: 77240000 772ec000 C:\Windows\system32\msvcrt.dll

ModLoad: 76300000 76357000 C:\Windows\system32\SHLWAPI.dll

ModLoad: 75cd0000 75d1e000 C:\Windows\system32\GDI32.dll

ModLoad: 75fa0000 76069000 C:\Windows\system32\USER32.dll

ModLoad: 777b0000 777ba000 C:\Windows\system32\LPK.dll

ModLoad: 774b0000 7754d000 C:\Windows\system32\USP10.dll

ModLoad: 73110000 732a0000 C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_

6595b64144ccf1df_1.1.7600.16385_none_72fc7cbf861225ca\gdiplus.dll

ModLoad: 75a80000 75bdc000 C:\Windows\system32\ole32.dll

ModLoad: 76360000 76401000 C:\Windows\system32\RPCRT4.dll

ModLoad: 777c0000 77860000 C:\Windows\system32\ADVAPI32.dll

ModLoad: 75be0000 75bf9000 C:\Windows\SYSTEM32\sechost.dll

ModLoad: 76270000 762ff000 C:\Windows\system32\OLEAUT32.dll

ModLoad: 74590000 745d0000 C:\Windows\system32\UxTheme.dll

ModLoad: 74710000 748ae000 C:\Windows\WinSxS\x86_microsoft.windows.common-

controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc\COMCTL32.dll

ModLoad: 703d0000 70402000 C:\Windows\system32\WINMM.dll

ModLoad: 74c80000 74c89000 C:\Windows\system32\VERSION.dll

ModLoad: 77770000 7778f000 C:\Windows\system32\IMM32.DLL

ModLoad: 75c00000 75ccc000 C:\Windows\system32\MSCTF.dll

ModLoad: 74130000 7422b000 C:\Windows\system32\WindowsCodecs.dll

ModLoad: 74260000 74273000 C:\Windows\system32\dwmapi.dll

ModLoad: 756d0000 756dc000 C:\Windows\system32\CRYPTBASE.dll

ModLoad: 75e60000 75ee3000 C:\Windows\system32\CLBCatQ.DLL

ModLoad: 6ef10000 6ef4c000 C:\Windows\system32\oleacc.dll

Позже в процессе отладки вы можете вновь вывести этот список при помощи команды lmf:

0:005> lmf

start end module name

00a70000 00b30000 calc C:\Windows\system32\calc.exe

6ef10000 6ef4c000 oleacc C:\Windows\system32\oleacc.dll

703d0000 70402000 WINMM C:\Windows\system32\WINMM.dll

73110000 732a0000 gdiplus C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_

1.1.7600.16385_none_72fc7cbf861225ca\gdiplus.dll

74130000 7422b000 WindowsCodecs C:\Windows\system32\WindowsCodecs.dll

74260000 74273000 dwmapi C:\Windows\system32\dwmapi.dll

74590000 745d0000 UxTheme C:\Windows\system32\UxTheme.dll

74710000 748ae000 COMCTL32 C:\Windows\WinSxS\x86_microsoft.windows.common-

controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc\COMCTL32.dll

74c80000 74c89000 VERSION C:\Windows\system32\VERSION.dll

756d0000 756dc000 CRYPTBASE C:\Windows\system32\CRYPTBASE.dll

75920000 7596a000 KERNELBASE C:\Windows\system32\KERNELBASE.dll

75a80000 75bdc000 ole32 C:\Windows\system32\ole32.dll

75be0000 75bf9000 sechost C:\Windows\SYSTEM32\sechost.dll

75c00000 75ccc000 MSCTF C:\Windows\system32\MSCTF.dll

75cd0000 75d1e000 GDI32 C:\Windows\system32\GDI32.dll

75e60000 75ee3000 CLBCatQ C:\Windows\system32\CLBCatQ.DLL

75fa0000 76069000 USER32 C:\Windows\system32\USER32.dll

76270000 762ff000 OLEAUT32 C:\Windows\system32\OLEAUT32.dll

76300000 76357000 SHLWAPI C:\Windows\system32\SHLWAPI.dll

76360000 76401000 RPCRT4 C:\Windows\system32\RPCRT4.dll

76410000 77059000 SHELL32 C:\Windows\system32\SHELL32.dll

77240000 772ec000 msvcrt C:\Windows\system32\msvcrt.dll

774b0000 7754d000 USP10 C:\Windows\system32\USP10.dll

77550000 77624000 kernel32 C:\Windows\system32\kernel32.dll

77630000 7776c000 ntdll C:\Windows\SYSTEM32\ntdll.dll

77770000 7778f000 IMM32 C:\Windows\system32\IMM32.DLL

777b0000 777ba000 LPK C:\Windows\system32\LPK.dll

777c0000 77860000 ADVAPI32 C:\Windows\system32\ADVAPI32.dll

Также вы можете узнать адрес загрузки для конкретного модуля при помощи команды «lmf m»:

0:005> lmf m kernel32

start end module name

77550000 77624000 kernel32 C:\Windows\system32\kernel32.dll

Вы также можете получить информацию о заголовке (image header) конкретного модуля при помощи расширения !dh (восклицательный знак указывает на расширение):

0:005> !dh kernel32

File Type: DLL

FILE HEADER VALUES

14C machine (i386)

4 number of sections

4A5BDAAD time date stamp Mon Jul 13 21:09:01 2009

0 file pointer to symbol table

0 number of symbols

E0 size of optional header

2102 characteristics

Executable

32 bit word machine

DLL

OPTIONAL HEADER VALUES

10B magic #

9.00 linker version

C4600 size of code

C800 size of initialized data

0 size of uninitialized data

510C5 address of entry point

1000 base of code

----- new -----

77550000 image base

1000 section alignment

200 file alignment

3 subsystem (Windows CUI)

6.01 operating system version

6.01 image version

6.01 subsystem version

D4000 size of image

800 size of headers

D5597 checksum

00040000 size of stack reserve

00001000 size of stack commit

00100000 size of heap reserve

00001000 size of heap commit

140 DLL characteristics

Dynamic base

NX compatible

B4DA8 [ A915] address [size] of Export Directory

BF6C0 [ 1F4] address [size] of Import Directory

C7000 [ 520] address [size] of Resource Directory

0 [ 0] address [size] of Exception Directory

0 [ 0] address [size] of Security Directory

C8000 [ B098] address [size] of Base Relocation Directory

C5460 [ 38] address [size] of Debug Directory

0 [ 0] address [size] of Description Directory

0 [ 0] address [size] of Special Directory

0 [ 0] address [size] of Thread Storage Directory

816B8 [ 40] address [size] of Load Configuration Directory

278 [ 408] address [size] of Bound Import Directory

1000 [ DE8] address [size] of Import Address Table Directory

0 [ 0] address [size] of Delay Import Directory

0 [ 0] address [size] of COR20 Header Directory

0 [ 0] address [size] of Reserved Directory

SECTION HEADER #1

.text name

C44C1 virtual size

1000 virtual address

C4600 size of raw data

800 file pointer to raw data

0 file pointer to relocation table

0 file pointer to line numbers

0 number of relocations

0 number of line numbers

60000020 flags

Code

(no align specified)

Execute Read

Debug Directories(2)

Type Size Address Pointer

cv 25 c549c c4c9c Format: RSDS, guid, 2, kernel32.pdb

( 10) 4 c5498 c4c98

SECTION HEADER #2

.data name

FEC virtual size

C6000 virtual address

E00 size of raw data

C4E00 file pointer to raw data

0 file pointer to relocation table

0 file pointer to line numbers

0 number of relocations

0 number of line numbers

C0000040 flags

Initialized Data

(no align specified)

Read Write

SECTION HEADER #3

.rsrc name

520 virtual size

C7000 virtual address

600 size of raw data

C5C00 file pointer to raw data

0 file pointer to relocation table

0 file pointer to line numbers

0 number of relocations

0 number of line numbers

40000040 flags

Initialized Data

(no align specified)

Read Only

SECTION HEADER #4

.reloc name

B098 virtual size

C8000 virtual address

B200 size of raw data

C6200 file pointer to raw data

0 file pointer to relocation table

0 file pointer to line numbers

0 number of relocations

0 number of line numbers

42000040 flags

Initialized Data

Discardable

(no align specified)

Read Only

Сообщения и исключения

После подключения к процессу вначале отображается список модулей, а затем могут появиться другие сообщения. Например, когда мы цепляемся к calc.exe, WinDBG автоматически устанавливает точку останова (которая является просто маркером, используемым для остановки приложения). Информация о точке останова выводится на экран:

(da8.b44): Break instruction exception - code 80000003 (first chance)

Конкретно это сообщение является исключением, а именно first-chance исключением. По сути, исключение – это особое состояние, возникающее во время выполнения программы. First-chance исключение означает, что программа остановилась сразу же после появления исключения. Second-chance исключение означает, что после возникновения исключения будут выполнены некоторые операции, а потом программа остановит свою работу.

Регистры

После отображения сообщений и исключений отладчик выводит состояние регистров процессора. Регистры – это специальные переменные внутри процессора, которые хранят небольшие куски информации или следят за состоянием чего-либо в памяти. Процессор может обрабатывать информацию в этих регистрах очень быстро. Это намного быстрее, чем каждый раз получать информацию по шине из RAM.

После подключения к calc.exe WinDBG автоматически отображает информацию о следующих регистрах:

eax=7ffd9000 ebx=00000000 ecx=00000000 edx=776cd23d esi=00000000 edi=00000000

eip=77663540 esp=02affd9c ebp=02affdc8 iopl=0 nv up ei pl zr na pe nc

cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246

Позже можно продублировать эту информацию еще раз при помощи команды r:

0:005> r

eax=7ffd9000 ebx=00000000 ecx=00000000 edx=776cd23d esi=00000000 edi=00000000

eip=77663540 esp=02affd9c ebp=02affdc8 iopl=0 nv up ei pl zr na pe nc

cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246

ntdll!DbgBreakPoint:

77663540 cc int 3

Если мы хотим получить значение конкретного регистра, то можем выполнить такую команду:

0:005> r eax

eax=7ffd9000

Информацию одновременно из нескольких регистров можно получить так:

0:005> r eax,ebp

eax=7ffd9000 ebp=02affdc8

Указатель на инструкцию

Последняя команда посвящена запускаемым инструкциям. Здесь информация также выводится на экран, как и в случае с командой r, того, что содержит регистр EIP. EIP – это регистр, содержащий местонахождение следующей инструкции, которую должен выполнить процессор. То, что отображает WinDBG, – эквивалент команды u eip L1, после выполнения которой WinDBG идет по адресу, указанному в регистре EIP, преобразует этот участок в ассемблерный код и отображает его на экране.

ntdll!DbgBreakPoint:

77663540 cc int 3

Оставайтесь на связи

В следующих статьях мы рассмотрим, как использовать WinDBG в боевых условиях: точки останова, пошаговую отладку и просмотр памяти. Не переключайтесь! J.

Где скачать и как установить Debugging Tools for Windows

Решение написать данный пост появилось из-за того, что разобраться в том, где скачать Debugging Tools for Windows, не так то просто.Debugging Tools for Windows
Так как следующую статью планируется написать на тему анализа дампов, то необходимо было облегчить для нашего читателя задачу скачивания и установки необходимого для анализа инструментария. В данном случае это только официальный отладчик Debugging Tools for Windows.

Как скачать и установить отладчик WinDbg?

Отладчик Debugging Tools for Windows содержится в пакете SDK (от англ. software development kit). SDK (от англ. software development kit) — набор средств разработки, который позволяет специалистам по программному обеспечению создавать приложения для определённого пакета программ, программного обеспечения базовых средств разработки, аппаратной платформы, компьютерной системы, игровых консолей, операционных систем и прочих платформ.
Источник: Wikipedia
При скачивании пакета можно выбрать только нужный вам софт отцепив всё лишнее.

Скачиваем пакет SDK.

Для каждой версии Windows имеется своя версия пакета SDK. Скачать загрузчик для скачивания пакета SDK Windows 10 можно по этой ссылке. Для остальных версий Windows загрузчик можно скачать на странице архивов Microsoft. Самая старая версия ОС здесь — Windows 7.
Про иные способы скачивания пакета можете почитать на этой странице (если конечно владеете английским языком 🙂 )

Устанавливаем Debugging Tools for Windows из пакета SDK на Windows 10.

Нажав на ссылку Скачать программу установки > вы получите файл загрузчика пакета SDK — winsdksetup.exe.

  1. Запустите файл загрузчика winsdksetup.exe.
  2. Загрузчик предложит 2 способа доставки пакета. В первом случае (Install the Windows SDK to this computer — в переводе: Установите Windows SDK на этот компьютер) выбранный софт из пакета SDK сразу устанавливается в систему. Во втором (Download the Windows SDK for installation on a separate computer — в переводе Загрузите Windows SDK для установки на отдельный компьютер) дистрибутивы для установки выбранного софта будут скачаны в указанную вами папку. выбор варианта загрузки отладчикаЗдесь рекомендую вам выбрать второй вариант, так как скачанный отладчик, можно будет потом установить и на любой другой компьютер. Тут же рекомендую сменить папку куда будет загружен пакет.
  3. На следующем шаге вас спросят разрешения отправить анонимную информацию об установке на серверы Microsoft или нет. Здесь выбирать вам
  4. Далее необходимо выбрать, что вы хотите установить из списка программ. Чтоб не устанавливать лишние программы снимаем все галочки и оставляем только одну Debugging Tools for Windows и жмем кнопку Download.выбираем WinDBG для загрузки

Будет загружена папка Installers, где находим файлы:
X64 Debuggers And Tools-x86_en-us
X64 Debuggers And Tools-x64_en-us
WinDBG для разных разрядностей ОС
Прежде чем начать установку узнайте разрядность операционной системы и затем уже выберите правильную версию.
Запустив файл установки нужной версии, останется чуток подождать и Debugging Tools for Windows будет установлен. Запустить его можно через кнопку Пуск.Запуск отладчика на Windows 10
Теперь, когда вы знаете где скачать отладчик, можно смело приступать к анализу файла дампа. Об этом как раз и будет следующая статья на сайте.

Если вам понравилась эта статья, то пожалуйста, оцените её и поделитесь ею со своими друзьями на своей странице в социальной сети.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (4 оценок, среднее: 4,75 из 5)

Загрузка…

В момент критического сбоя операционная система Windows прерывает работу и показывает синий экран смерти (BSOD). Содержимое оперативной памяти и вся информация о возникшей ошибке записывается в файл подкачки. При следующей загрузке Windows создается аварийный дамп c отладочной информацией на основе сохраненных данных. В системном журнале событий создается запись о критической ошибке.

Внимание! Аварийный дамп не создается, если отказала дисковая подсистема или критическая ошибка возникла на начальной стадии загрузки Windows.

Содержание:

  • Типы аварийных дампов памяти Windows
  • Как включить создание дампа памяти в Windows?
  • Установка WinDBG в Windows
  • Настройка ассоциации .dmp файлов с WinDBG
  • Настройка сервера отладочных символов в WinDBG
  • Анализ аварийного дампа памяти в WinDBG

Типы аварийных дампов памяти Windows

На примере актуальной операционной системы Windows 10 (Windows Server 2016) рассмотрим основные типы дампов памяти, которые может создавать система:

  • Мини дамп памяти (Small memory dump) (256 КБ). Этот тип файла включает минимальный объем информации. Он содержит только сообщение об ошибке BSOD, информацию о драйверах, процессах, которые были активны в момент сбоя, а также какой процесс или поток ядра вызвал сбой.
  • Дамп памяти ядра (Kernel memory dump). Как правило, небольшой по размеру — одна треть объема физической памяти. Дамп памяти ядра является более подробным, чем мини дамп. Он содержит информацию о драйверах и программах в режиме ядра, включает память, выделенную ядру Windows и аппаратному уровню абстракции (HAL), а также память, выделенную драйверам и другим программам в режиме ядра.
  • Полный дамп памяти (Complete memory dump). Самый большой по объему и требует памяти, равной оперативной памяти вашей системы плюс 1MB, необходимый Windows для создания этого файла.
  • Автоматический дамп памяти (Automatic memory dump). Соответствует дампу памяти ядра с точки зрения информации. Отличается только тем, сколько места он использует для создания файла дампа. Этот тип файлов не существовал в Windows 7. Он был добавлен в Windows 8.
  • Активный дамп памяти (Active memory dump). Этот тип отсеивает элементы, которые не могут определить причину сбоя системы. Это было добавлено в Windows 10 и особенно полезно, если вы используете виртуальную машину, или если ваша система является хостом Hyper-V.

Как включить создание дампа памяти в Windows?

С помощью Win+Pause откройте окно с параметрами системы, выберите «Дополнительные параметры системы» (Advanced system settings). Во вкладке «Дополнительно» (Advanced), раздел «Загрузка и восстановление» (Startup and Recovery) нажмите кнопку «Параметры» (Settings). В открывшемся окне настройте действия при отказе системы. Поставьте галку в чек-боксе «Записать события в системный журнал» (Write an event to the system log), выберите тип дампа, который должен создаваться при сбое системы. Если в чек-боксе «Заменять существующий файл дампа» (Overwrite any existing file) поставить галку, то файл будет перезаписываться при каждом сбое. Лучше эту галку снять, тогда у вас будет больше информации для анализа. Отключите также автоматическую перезагрузку системы (Automatically restart).

В большинстве случаев для анализа причины BSOD вам будет достаточно малого дампа памяти.

настройка minidump в windows 10

Теперь при возникновении BSOD вы сможете проанализировать файл дампа и найти причину сбоев. Мини дамп по умолчанию сохраняется в папке %systemroot%\minidump. Для анализа файла дампа рекомендую воспользоваться программой WinDBG (Microsoft Kernel Debugger).

Установка WinDBG в Windows

Утилита WinDBG входит в «Пакет SDK для Windows 10» (Windows 10 SDK). Скачать можно здесь.

Файл называется winsdksetup.exe, размер 1,3 МБ.

WinDBG для Windows7 и более ранних систем включен в состав пакета «Microsoft Windows SDK for Windows 7 and .NET Framework 4». Скачать можно здесь.

Запустите установку и выберите, что именно нужно сделать – установить пакет на этот компьютер или загрузить для установки на другие компьютеры. Установим пакет на локальный компьютер.

установка Windows 10 SDK

Можете установить весь пакет, но для установки только инструмента отладки выберите Debugging Tools for Windows.

установка Debugging Tools for Windows

После установки ярлыки WinDBG можно найти в стартовом меню.

Настройка ассоциации .dmp файлов с WinDBG

Для того, чтобы открывать файлы дампов простым кликом, сопоставьте расширение .dmp с утилитой WinDBG.

  1. Откройте командную строку от имени администратора и выполните команды для 64-разрядной системы:
    cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
    windbg.exe –IA


    для 32-разрядной системы:
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
    windbg.exe –IA
  2. В результате типы файлов: .DMP, .HDMP, .MDMP, .KDMP, .WEW – будут сопоставлены с WinDBG.

windbg ассоциация .dmp файлов

Настройка сервера отладочных символов в WinDBG

Отладочные символы (debug-символы или symbol files) – это блоки данных, генерируемые в процессе компиляции программы совместно с исполняемым файлом. В таких блоках данных содержится информация о именах переменных, вызываемых функциях, библиотеках и т.д. Эти данные не нужны при выполнении программы, но полезные при ее отладке. Компоненты Microsoft компилируются с символами, распространяемыми через Microsoft Symbol Server.

Настройте WinDBG на использование Microsoft Symbol Server:

  • Откройте WinDBG;
  • Перейдите в меню File –> Symbol File Path;
  • Пропишите строку, содержащую URL для загрузки символов отладки с сайта Microsoft и папку для сохранения кэша:
    SRV*E:\Sym_WinDBG*http://msdl.microsoft.com/download/symbols
    В примере кэш загружается в папку E:\Sym_WinDBG, можете указать любую.
  • Не забывайте сохранить изменения в меню File –> Save WorkSpace;

WinDBG произведет поиск символов в локальной папке и, если не обнаружит в ней необходимых символов, то самостоятельно загрузит символы с указанного сайта. Если вы хотите добавить собственную папку с символами, то можно сделать это так:

SRV*E:\Sym_WinDBG*http://msdl.microsoft.com/download/symbols;c:\Symbols

Если подключение к интернету отсутствует, то загрузите предварительно пакет символов с ресурса Windows Symbol Packages.

Анализ аварийного дампа памяти в WinDBG

Отладчик WinDBG открывает файл дампа и загружает необходимые символы для отладки из локальной папки или из интернета. Во время этого процесса вы не можете использовать WinDBG. Внизу окна (в командной строке отладчика) появляется надпись Debugee not connected.

Команды вводятся в командную строку, расположенную внизу окна.

windbg - анализ дампа памяти

Самое главное, на что нужно обратить внимание – это код ошибки, который всегда указывается в шестнадцатеричном значении и имеет вид 0xXXXXXXXX (указываются в одном из вариантов — STOP: 0x0000007B, 02.07.2019 0008F, 0x8F). В нашем примере код ошибки 0х139.

Полный справочник ошибок можно посмотреть здесь.

Отладчик предлагает выполнить команду !analyze -v, достаточно навести указатель мыши на ссылку и кликнуть. Для чего нужна эта команда?

  • Она выполняет предварительный анализ дампа памяти и предоставляет подробную информацию для начала анализа.
  • Эта команда отобразит STOP-код и символическое имя ошибки.
  • Она показывает стек вызовов команд, которые привели к аварийному завершению.
  • Кроме того, здесь отображаются неисправности IP-адреса, процессов и регистров.
  • Команда может предоставить готовые рекомендации по решению проблемы.

Основные моменты, на которые вы должны обратить внимание при анализе после выполнения команды !analyze –v (листинг неполный).

1: kd>
!analyze -v

*****************************************************************************
* *
* Bugcheck Analysis *
* *
*****************************************************************************


Символическое имя STOP-ошибки (BugCheck)
KERNEL_SECURITY_CHECK_FAILURE (139)

Описание ошибки (Компонент ядра повредил критическую структуру данных. Это повреждение потенциально может позволить злоумышленнику получить контроль над этой машиной):

A kernel component has corrupted a critical data structure. The corruption could potentially allow a malicious user to gain control of this machine.

Аргументы ошибки:

Arguments:
Arg1: 0000000000000003, A LIST_ENTRY has been corrupted (i.e. double remove).
Arg2: ffffd0003a20d5d0, Address of the trap frame for the exception that caused the bugcheck
Arg3: ffffd0003a20d528, Address of the exception record for the exception that caused the bugcheck
Arg4: 0000000000000000, Reserved
Debugging Details:
------------------

Счетчик показывает сколько раз система упала с аналогичной ошибкой:

CUSTOMER_CRASH_COUNT: 1

Основная категория текущего сбоя:

DEFAULT_BUCKET_ID: FAIL_FAST_CORRUPT_LIST_ENTRY

Код STOP-ошибки в сокращенном формате:

BUGCHECK_STR: 0x139

Процесс, во время исполнения которого произошел сбой (не обязательно причина ошибки, просто в момент сбоя в памяти выполнялся этот процесс):

PROCESS_NAME: sqlservr.exe

CURRENT_IRQL: 2

Расшифровка кода ошибки: В этом приложении система обнаружила переполнение буфера стека, что может позволить злоумышленнику получить контроль над этим приложением.

ERROR_CODE: (NTSTATUS) 0xc0000409 - The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.
EXCEPTION_CODE: (NTSTATUS) 0xc0000409 - The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.

Последний вызов в стеке:

LAST_CONTROL_TRANSFER: from fffff8040117d6a9 to fffff8040116b0a0

Стек вызовов в момент сбоя:

STACK_TEXT:
ffffd000`3a20d2a8 fffff804`0117d6a9 : 00000000`00000139 00000000`00000003 ffffd000`3a20d5d0 ffffd000`3a20d528 : nt!KeBugCheckEx
ffffd000`3a20d2b0 fffff804`0117da50 : ffffe000`f3ab9080 ffffe000`fc37e001 ffffd000`3a20d5d0 fffff804`0116e2a2 : nt!KiBugCheckDispatch+0x69
ffffd000`3a20d3f0 fffff804`0117c150 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiFastFailDispatch+0xd0
ffffd000`3a20d5d0 fffff804`01199482 : ffffc000`701ba270 ffffc000`00000001 000000ea`73f68040 fffff804`000006f9 : nt!KiRaiseSecurityCheckFailure+0x3d0
ffffd000`3a20d760 fffff804`014a455d : 00000000`00000001 ffffd000`3a20d941 ffffe000`fcacb000 ffffd000`3a20d951 : nt! ?? ::FNODOBFM::`string'+0x17252
ffffd000`3a20d8c0 fffff804`013a34ac : 00000000`00000004 00000000`00000000 ffffd000`3a20d9d8 ffffe001`0a34c600 : nt!IopSynchronousServiceTail+0x379
ffffd000`3a20d990 fffff804`0117d313 : ffffffff`fffffffe 00000000`00000000 00000000`00000000 000000eb`a0cf1380 : nt!NtWriteFile+0x694
ffffd000`3a20da90 00007ffb`475307da : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
000000ee`f25ed2b8 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007ffb`475307da

Участок кода, где возникла ошибка:

FOLLOWUP_IP:
nt!KiFastFailDispatch+d0
fffff804`0117da50 c644242000 mov byte ptr [rsp+20h],0
FAULT_INSTR_CODE: 202444c6
SYMBOL_STACK_INDEX: 2
SYMBOL_NAME: nt!KiFastFailDispatch+d0
FOLLOWUP_NAME: MachineOwner

Имя модуля в таблице объектов ядра. Если анализатору удалось обнаружить проблемный драйвер, имя отображается в полях MODULE_NAME и IMAGE_NAME:

MODULE_NAME: nt
IMAGE_NAME: ntkrnlmp.exe

Если кликнете по ссылке модуля (nt), то увидите подробную информацию о пути и других свойствах модуля. Находите указанный файл, и изучаете его свойства.

1: kd>
lmvm nt

Browse full module list
Loaded symbol image file: ntkrnlmp.exe
Mapped memory image file: C:\ProgramData\dbg\sym\ntoskrnl.exe\5A9A2147787000\ntoskrnl.exe
Image path: ntkrnlmp.exe
Image name: ntkrnlmp.exe
InternalName: ntkrnlmp.exe
OriginalFilename: ntkrnlmp.exe
ProductVersion: 6.3.9600.18946
FileVersion: 6.3.9600.18946 (winblue_ltsb_escrow.180302-1800)

windbg - lvm nt

В приведенном примере анализ указал на файл ядра ntkrnlmp.exe. Когда анализ дампа памяти указывает на системный драйвер (например, win32k.sys) или файл ядра (как в нашем примере ntkrnlmp.exe), вероятнее всего данный файл не является причиной проблемы. Очень часто оказывается, что проблема кроется в драйвере устройства, настройках BIOS или в неисправности оборудования.

Если вы увидели, что BSOD возник из-за стороннего драйвера, его имя будет указано в значениях MODULE_NAME и IMAGE_NAME.

Например:

Image path: \SystemRoot\system32\drivers\cmudaxp.sys
Image name: cmudaxp.sys

Откройте свойсва файла драйвера и проверьте его версию. В большинстве случаев проблема с драйверами решается их обнвовлением.

From Wikipedia, the free encyclopedia

WinDbg

Developer(s) Microsoft
Stable release

10.0.20153.1000
/ April 29, 2020

Operating system Microsoft Windows
Type Debugger
License Commercial
Website Debugging Tools at docs.microsoft.com

WinDbg is a multipurpose debugger for the Microsoft Windows computer operating system, distributed by Microsoft.[1] Debugging is the process of finding and resolving errors in a system; in computing it also includes exploring the internal operation of software as a help to development. It can be used to debug user mode applications, device drivers, and the operating system itself in kernel mode.

Overview[edit]

Like the better-known Visual Studio Debugger WinDbg has a graphical user interface (GUI), but is more powerful and has little else in common. WinDbg can automatically load debugging symbol files (e.g., PDB files) from a server by matching various criteria (e.g., timestamp, CRC, single or multiprocessor version) via SymSrv (SymSrv.dll),[2] instead of the more time-consuming task of creating a symbol tree for a debugging target environment. If a private symbol server is configured, the symbols can be correlated with the source code for the binary. This eases the burden of debugging problems that have various versions of binaries installed on the debugging target by eliminating the need for finding and installing specific symbols version on the debug host. Microsoft has a public symbol server that has most of the public symbols for Windows 2000 and later versions of Windows (including service packs).[3]

WinDbg can also be used for debugging kernel-mode memory dumps, created after what is commonly called the Blue Screen of Death which occurs when a bug check is issued.[4] It can also be used to debug user-mode crash dumps. This is known as post-mortem debugging.[5]

Recent versions of WinDbg have been and are being distributed as part of the free Debugging Tools for Windows suite, which shares a common debugging back-end between WinDbg and command line debugger front-ends like KD, CDB, and NTSD. Most commands can be used as is with all the included debugger front-ends.

In 2017 Microsoft announced new version of WinDbg called WinDbg Preview (aka WinDbgX).[6] One of the most notable features of WinDbg Preview is so called Time-Travel-Debugging (TTD).[7] The main idea here is that the user can record an actual live process (at a performance penalty) to later debug going back and forth in time. This feature is especially useful during reverse-engineering process. It also allows writing scripts in JavaScript language.[8]

Extensions[edit]

WinDbg allows the loading of extension DLLs[9] that can augment the debugger’s supported commands and allow for help in debugging specific scenarios: for example, displaying an MSXML document given an IXMLDOMDocument, or debugging the Common Language Runtime (CLR).[10] These extensions are a large part of what makes WinDbg such a powerful debugger. WinDbg is used by the Microsoft Windows product team to build Windows, and everything needed to debug Windows is included in these extension DLLs.

Extension commands are always prefixed with !.

While some extensions are used only inside Microsoft, most of them are part of the public Debugging Tools for Windows package.

The extension model is documented in the help file included with the Debugging Tools for Windows.

Ext.dll[edit]

Ext is a standard Windows Debugger extension that ships with WinDBG and is loaded by default.

!analyze command[edit]

The most commonly used command is !analyze -v,[11] which analyzes the current state of the program being debugged and the machine/process state at the moment of crash or hang. This command is often able to debug the current problem in a completely automated fashion.

When used without any switches, !analyze simply returns the results of its analysis. The -v and -vv give further details about that analysis.

Wow6432exts.dll[edit]

Wow6432exts is a standard Windows Debugger extension that ships with WinDBG.
It is used to debug processes running inside WoW64 (32-bit processes running in 64-bit Windows).[12]

SOS.dll[edit]

The SOS (Son of Strike)[13] Debugging Extension (SOS.dll) assists in debugging managed programs in Visual Studio and WinDbg by providing information about the internal common language runtime (CLR) environment. This tool requires a project to have unmanaged debugging enabled. SOS.dll is automatically installed with the .NET Framework. To use SOS.dll in Visual Studio, install the Windows Driver Kit (WDK).[14] To debug a process or memory dump, the sos.dll version must match the .NET Framework version. Psscor2 and Psscor4 are a superset of SOS.

Psscor2.dll[edit]

Psscor2 is the Windows Debugger Extension used to debug .NET Framework applications that use the .NET CLR version 2.0 (.NET Framework versions 2 through 3.5). Psscor2 was developed for internal use at Microsoft as part of their Product Support Services tools.[15] While Microsoft only released Psscor2 in 2010 [16] Microsoft had been publishing commands from the extension several years before,[17] causing difficulty for those who were trying to follow their processes.

Psscor4.dll[edit]

Psscor4 is a Windows Debugger extension used to debug .NET Framework 4 applications.

Coupling with virtual machines[edit]

WinDbg allows debugging a Microsoft Windows kernel running on a virtual machine by VMware, VPC or Parallels using a named pipe. This can be achieved by using a virtual COM port. In the case of VMware and VirtualBox, the VirtualKD extension adds native support for VM debugging to the Windows kernel, claiming to speed debugging by a factor of up to 45.[18] For Windows 8 and later, kernel debugging over network is allowed,[19] allowing fast kernel debugging without special configuration.

Protocol[edit]

The WinDbg protocol is not documented, but is supported by the IDA Pro and radare2 disassemblers.

See also[edit]

  • ProcDump
  • Microsoft Detours

References[edit]

  1. ^ EliotSeattle. «Download the Windows Driver Kit (WDK)». Msdn.microsoft.com. Retrieved 23 April 2018.
  2. ^ «Debugging with Symbols (Windows)». Support.microsoft.com. Retrieved 23 April 2018.
  3. ^ DOMARS. «Microsoft public symbol server». Msdn.microsoft.com. Retrieved 23 April 2018.
  4. ^ «How do I use WinDBG Debugger to troubleshoot a Blue Screen of Death?». TechRepublic. 18 December 2009. Retrieved 23 April 2018.
  5. ^ «Post-mortem debugging of .NET applications using WinDbg». Tewarid.github.io. 10 September 2010. Retrieved 23 April 2018.
  6. ^ «New WinDbg available in preview! – Debugging Tools for Windows». blogs.msdn.microsoft.com. Retrieved 2019-08-13.
  7. ^ «Leveraging the new WinDbgX and Time-Travel-Trace –Script to list all access to files – Rodney Viana’s (MSFT) Blog». blogs.msdn.microsoft.com. Retrieved 2019-08-13.
  8. ^ «Easier WinDbg scripting with Javascript for malware research – Avar 2018». Retrieved 2019-08-13.
  9. ^ DOMARS. «.load, .loadby (Load Extension DLL)». Msdn.microsoft.com. Retrieved 23 April 2018.
  10. ^ «MSDN Magazine Issues». Msdn.microsoft.com. Retrieved 23 April 2018.
  11. ^ DOMARS. «analyze». Msdn.microsoft.com. Retrieved 23 April 2018.
  12. ^ «Debugging WOW64 (Windows)». Msdn.microsoft.com. Retrieved 23 April 2018.
  13. ^ «SOS Debugging of the CLR, Part 1». Blogs.msdn.com. Archived from the original on 28 June 2010. Retrieved 23 April 2018.
  14. ^ mairaw. «SOS.dll (SOS Debugging Extension)». Msdn.microsoft.com. Retrieved 23 April 2018.
  15. ^ «New debugger extension for .NET (PSSCOR2)». Blogs.msdn.com. Retrieved 23 April 2018.
  16. ^ «New debugger extension for .NET, Psscor2, released». Blogs.msdn.com. Retrieved 23 April 2018.
  17. ^ «MSDN Magazine Issues». Msdn.microsoft.com. Retrieved 23 April 2018.
  18. ^ «VirtualKD — Windows Kernel Debugger Booster for Virtual Machines». Virtualkd.sysprogs.org. Retrieved 23 April 2018.
  19. ^ DOMARS. «Setting Up Kernel-Mode Debugging over a Network Cable Manually». Msdn.microsoft.com. Retrieved 23 April 2018.

External links[edit]

  • Getting Started: Install Instructions, Part 1, Part 2
  • Debugging Tools for Windows — information and free downloads
  • WinDbg. From A to Z! — Theory and examples, 111 slides
  • Common WinDbg Commands (Thematically Grouped)
  • Tutorial on solving system crashes using WinDbg Archived 2007-10-12 at the Wayback Machine
  • Symbols loading in WinDbg
  • Windows Debuggers: Part 1: A WinDbg Tutorial
  • KD extension for fast VMware and VirtualBox debugging
  • SOS Debugging Extension (SOS.dll)
  • psscor4 (.NET 4.0) or psscor2 (.NET 2.0-3.5) Replacement for SOS with a superset of commands
  • [1] WinDBG v6.12.2.633 available via Windows Driver Kit Version 7.1.0
  • Extension for python scripting (pykd)
  • DbgKit: the first GUI extension for Debugging Tools for Windows

Время на прочтение
4 мин

Количество просмотров 4.6K

Статья представляет собой мануал по тому как пользоваться Windbg. Будет рассмотрена «классическая» версия отладчика. Настроим внешний вид и изучим команды, которые можно использовать для исследования приложения.

Установка

Установка возможна только при использовании Windows SDK. Версию для Windows 10 можно найти здесь. Для работы с отладчиком необходимо запустить процесс установки SDK и выбрать только опции с набором инструментов для отладки. Пример выбора представлен на снимке ниже.

После установки набора инструментов, можно найти все файлы в директории «Windows Kits». Отладчик устанавливается сразу для нескольких версий процессоров. Для выполнения дальнейших команд в мануале нужно выбирать соответствую исследуемому файлу архитектуру процессора. Для исследования возьмем вот этот файл и попробуем найти ключ. Перед началом исследования файла, рекомендуется сделать дополнительную настройку:

  • Установить директорию и сервер для отладочных символов Проще всего это сделать можно через меню: File → Symbol File Path. В открывшемся меню нужно прописать вот эту строку: «SRV*C:\symbols*http://msdl.microsoft.com/download/symbols». Затем создать директорию C:\symbols;

  • Установить WorkPlace с удобной раскладкой рабочих панелей. Взять готовый Workspace можно отсюда. В итоге, если запустить для теста notepad.exe в отладчике, он будет выглядеть вот так:

Теперь можно перейти к исследованию команд. Откроем в отладчике файл и приступим.

Набор команд и анализ приложения

Полный справочник по всем командам отладчика можно найти по команде «.hh». Появится справка, как на рисунке ниже. Здесь можно вводить описание или конкретную команду.

Любой набор команд, который можно представить просто списком не имеет большой полезности, поэтому все команды, которые будут описываться в статье, будут сопровождаться примером применения. Начнем с простого.

  1. Определим откуда начинается выполнение приложения. Если не вдаваться в подробности, то самое начало работы приложения это EntryPoint из заголовка файла, однако это не совсем так. EntryPoint для современных языков программирования сегодня это начало подготовительных операций для работы всего приложения. Поэтому если необходимо найти код, который был написан программистом, нам придется еще немного попутешествовать по дизасемблированному листингу.

Первая команда — lm. Показывает список модулей, которые загружены в память процесса, по выдаче этой команды можно получить базовый адрес файла.

Главные команды, которые станут глазами и ушами при исследовании данных в оперативной памяти — d? (b,c,a,p,w,q). Команда показывает дамп памяти по указанному адресу. Можно использовать конкретный адрес или регистр. Например, можно посмотреть как выглядит часть заголовка файла в памяти:

Команда !dh разбирает файл и показывает заголовки. Нам нужен файловый заголовок, поэтому добавим флаг -f. Если необходимо показать все данные о файловых и секционных заголовках, то можно не дополнять команду.

Как видно на рисунке, данные, которые выдает команда, могут быть использованы для локализации данных внутри файла.

Локализуем точку входа с помощью суммирования базового адреса и информации из заголовка. Выполнить эту опирацию можно рядом команд: ? — выполнение выражения, uf — дизассемблирование функции, bp — установка точки останова. А теперь по порядку на примере:

Расчет адреса.

Дизассемблирование функции от адреса до ret команды.

Установка точки останова, кстати, чтобы управлять точками останова, можно менять последнюю букву команды. На рисунке показан пример установки точки останова и просмотр списка существующих точек через команду bl.

Чтобы дойти до точки останова, можно ввести команду, которая используется для выполнения алгоритма приложения — g.

Как только алгоритм загрузчика ОС выполнит все подготовительные действия мы увидим в командной строке следующие данные:

Можно приступать к поиску функции main. Сделать это достаточно просто, необходимо локализовать константы из интерфейса файла, когда выполняется приветствие и запрос данных:

Для поиска данных будем использовать команду s. Эта команда проводит поиск по определенному в команде объему данных. Соответственно чтобы получить данные о местоположении приглашения к вводу ключа, нужно указать всё адресное пространство исследуемого приложения. Так же необходимо указать тип данных, которые нужно искать.

Теперь, когда мы знаем адрес данных, которые используются, мы можем поставить точку останова, которая будет следить за доступом к данным. Сделать это можно с помощью команды ba. Для такой точки останова нужно указывать размер данных за которыми отладчик будет наблюдать, а там же адрес и тип доступа. Адрес должен быть выровнен по границе в 4 байта. После остановки снова нужно запустить приложение через команду g. На рисунке ниже показан вариант команды:

Когда сработает точка останова, нужно найти часть алгоритма приложения, которая печатает приветствие на экран. Для этого удобно использовать стек вызовов функций. Для этого можно выполнить команду k.

Из рисунка видно, что копирование строки для работы с ней выполняется библиотечной функцией, а её вызов был сделан из «For_Crackme+0x15f2».

2. Локализуем функцию проверки ключа. Функция проверки будет недалеко от предложения ввести данные пользователя. В прошлом этапе мы нашли смещение внутри функции до этой операции. Введем можифицированную команду uf — u для того чтобы посмотреть несколько команд после адреса "For_Crackme+0x15f":

Фрагмент кода не содержит дополнительных отладочных символов, поэтому просто просмотрим данные рядом:

  • offset For_Crackme+0x40a2

  • offset For_Crackme+0x40bb

Чтобы это сделать, используем команду db:

Похоже, что функция подготавливает данные для выдачи информации пользователю. Значит проверка ключа должна быть где-то рядом. Обратим внимание на 2 константы, которые помещаются в память через следующие команды:

...
00401612 c744241c30372f31 mov     dword ptr [esp+1Ch],312F3730h
0040161a c7442420302f3937 mov     dword ptr [esp+20h],37392F30h
...

Если раскодировать константы, то мы получим вот такое значение: «07/10/97». Выполнить раскодирование может помочь команда .formats 312F3730h. Из списка форматов нас интересует Char или символьное представление. Стоит помнить, что данные в памяти хранятся в LittleEndian формате, поэтому если прочитать наоборот, то получатся данные необходимые для прохождения валидации.

Таким образом можно анализировать приложения с использованием Windbg и не прибегать к дополнительному инструментарию.


Статья написана в преддверии старта курса «Reverse-Engineering. Professional». Напоминаем о том, что завтра пройдет второй день бесплатного интенсива по теме «Пишем дампер процессов». Записаться на интенсив можно по ссылке ниже:

  • ЗАПИСАТЬСЯ НА БЕСПЛАТНЫЙ ИНТЕНСИВ

  • Debian общая папка для windows
  • Defaultapppool что это за папка windows 10
  • Debugging c code in windows
  • Debian на windows 10 скачать
  • Dead air не запускается на windows 10