Средства отладки режима ядра операционной системы Windows. Принцип работы отладчика ядра операционной системы Символы для отладки ядра

Отладчики режима ядра находятся между CPU и операционной системой. Это означает, что, когда вы останавливаете отладчик режима ядра, операционная система также полностью останавливается. Нетрудно сообразить, что переход операционной системы к резкому останову полезен, когда вы работаете с таймером и над проблемами синхронизации. Все-таки, за исключением одного отладчика, о котором будет рассказано ниже (в разделе "Отладчик SoftlCE" данной главы), нельзя отлаживать код пользовательского режима с помощью отладчиков режима ядра.

Отладчиков режима ядра не так много. Вот некоторые из них: Windows 80386 Debugger (WDEB386), Kernel Debugger (1386KD), WinDBG и SoftlCE. Каждый из этих отладчиков кратко описан в следующих разделах.

Отладчик WDEB386

WDEB386 - это отладчик режима ядра Windows 98, распространяемый в составе Platform SDK. Этот отладчик полезен только для разработчиков, пишущих драйверы виртуальных устройств Windows 98 (VxD). Подобно большинству отладчиков режима ядра для операционных систем Windows, отладчик WDEB386 требует для работы две машины и нуль-модемный кабель. Две машины необходимы потому, что часть отладчика, которая выполняется на целевой машине, имеет ограниченный доступ к ее аппаратным средствам, так что он посылает свой вывод и получает команды от другой машины.

Отладчик WDEB386 имеет интересную историю. Он начинался как внутренний фоновый инструмент Microsoft в эпоху Windows 3.0. Его было трудно использовать, и он не имел достаточной поддержки для отладки исходного кода и других приятных свойств, которыми нас испортили отладчики Visual C++ и Visual Basic.

"Точечные" (DOT) команды - наиболее важная особенность WDEB386. Через прерывание INT 41 можно расширять WDEB386 с целью добавления команд. Эта расширяемость позволяет авторам VxD-драйверов создавать заказные отладочные команды, которые дают им свободный доступ к информации в их виртуальных устройствах. Отладочная версия Windows 98 поддерживает множество DOT-команд, которые позволяют наблюдать точное состояние операционной системы в любой точке процесса отладки.

Отладчик I386KD

Windows 2000 отличается от Windows 98 тем, что реально действующая часть отладчика режима ядра является частьюNTOSKRNL. EXE - файла главного ядра операционной системы Windows 2000. Этот отладчик доступен как в свободных (выпускных), так и в проверенных (отладочных) конфигурациях операционной системы. Чтобы включить отладку в режиме ядра, установите параметр загрузчика /DEBUG в BOOT. INI и, дополнительно, опцию загрузчика /DEBUGPORT, если необходимо установить значение коммуникационного порта отладчика режима ядра, отличающееся от умалчиваемого (СОМ1). I386KD выполняется на своей собственной машине и сообщается с машиной Windows 2000 через кабель нуль-модема.

Отладчик режима ядра NTOSKRNL. EXE делает только то, что достаточно для управления CPU, так чтобы операционная система могла быть отлажена. Большая часть отладочной работы - обработка символов, расширенные точки прерывания и дизассемблирование - выполняется на стороне 1386KD. Одно время Windows NT 4 Device Driver Kit (DDK) документировал протокол, используемый в кабеле нуль-модема. Однако Microsoft больше его не документирует.

Мощь 1386KD очевидна, если посмотреть на все команды, которые он предлагает для доступа к внутреннему состоянию Windows 2000. Знание механизма работы драйверов устройств в Windows 2000 поможет программисту следить за выводом многих команд. Не смотря на всю свою мощь, i386KD почти никогда не применяется, потому что это консольное приложение, которое очень утомительно использовать для отладок исходного уровня.

Для проведения отладки ядра необходимо подключиться к компьютеру с помощью нуль-модемного кабеля или модемного соединения. Компьютер, выполняющий отладку, будет называться “Host”, а название “Target” получит проблемный компьютер.

Оба компьютера должны работать под управлением одной и той же версии Windows, а символьные файлы для компьютера Target должны быть установлены на компьютере Host. Символьные файлы предоставляются на установочном компакт-диске Windows в каталоге Support\Debug.

Для включения отладки необходимо внести изменения в файл BOOT.INI на компьютере Target.

1. Поменяйте атрибуты файла BOOT.INI:

attrib c:\boot.ini – r – s

2. Отредактируйте этот файл и в строку запуска Windows добавьте параметр /debug (для того, чтобы сообщить системе о необходимости загрузки в оперативную память отладчика ядра при загрузке Windows). Дополнительными параметрами являются /Debugport, сообщающий системе, какой порт COM необходимо использовать (по умолчанию COM2) и /Baudrate - для указания скорости передачи данных (по умолчанию указана скорость 19200 бод, но лучше использовать 9600). Например:


multi(0)disk(0)rdisk(0)partition(0)\WINDOWS="Windows NT" /debug /debugport=com2 /baudrate=9600

3. Сохраните файл.

4. Установите предыдущие атрибуты файла BOOT.INI:

attrib c:\boot.ini +r +s

В данном примере компьютер Target разрешил соединение через порт COM2 со скоростью 9600 бит/с.

Компьютер Host должен быть настроен с использованием параметров, необходимых для проведения отладки. Кроме того, должны быть установлены символьные файлы. Для их установки перейдите в каталог \support\debug на установочном компакт-диске и введите следующую команду:

expndsym : <целевой диск и каталог>

Например:

expndsym f: d:\symbols

Установка может занять некоторое время. Помните, что если на компьютер Target были установлены пакеты обновлений, символьные файлы этих пакетов также следует установить на компьютер Host. Символьные файлы для пакетов обновлений можно загрузить с сайтега компании Microsoft.

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

Описание системных переменных

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

echo off
set _nt_debug_port=com2
set _nt_debug_baud_rate=9600
set _nt_symbol_path=d:\symbols\i386
set _nt_log_file_open=d:\debug\logs\debug.log

Теперь необходимо скопировать программное обеспечение отладки ядра, которое расположено в каталоге support\debug\<процессор> на установочном компакт-диске (support\debug\I386). Проще всего скопировать весь каталог полностью, поскольку он имеет небольшой размер (около 2,5 Мбайт). Для платформы I386 используется отладчик, который поставляется в виде файла I386KD.EXE. Отладчик запускается с помощью команды I386KD. Для ввода команды нажмите комбинацию клавиш и подождите, пока появится приглашение командной строки kd>.

Эта серия статей появилась по двум причинам. Во-первых, мне нравится работать с проектом HackSysExtremeVulnerableDriver . Во-вторых, я получил массу пожеланий , чтобы осветить эту тему.

Весь код, используемый при написании этой серии, находится в моем репозитории .

В данном цикле статей мы рассмотрим написание эксплоитов уровня ядра в ОС Windows. Важно отметить, что мы будем иметь дело с известными уязвимостями, и в реверс-инжиниринге нет необходимости (по крайней мере, для драйвера).

Предполагается, что после ознакомления со всеми статьями вы будете знать все наиболее распространенные классы брешей и методы эксплуатации, а также сможете портировать эксплоиты с архитектуры x86 на архитектуру x64 (если возможно) и ознакомитесь с новыми методами защиты в Windows 10.

Схема отладки ядра

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

Дополнительный материал для изучения:

Эксплуатация уязвимостей ядра

Этот процесс проходит намного веселее, чем эксплуатация на уровне пользователя J.

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

Темы статей этого цикла

  • Часть 1: Настройка рабочей среды
    • Конфигурирование трех виртуальных машин и системы, которая будет выступать в роли отладчика.
    • Конфигурирование отладчика WinDBG.
  • Часть 2: Полезные нагрузки
    • Изучение наиболее распространенных полезных нагрузок. В последующих частях будут рассматриваться конкретные уязвимости и, при необходимости, указываться ссылки на эту статью.
  • Остальные части.
    • Рассмотрение уязвимостей.

Жизненный цикл разработки эксплоита уровня ядра

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

Типы целевых систем

Мы будем работать с уязвимостями в следующих системах (конкретная версия не принципиальна):

  • Win7 x86 VM
  • Win7 x64 VM
  • Win10 x64 VM

Начнем с архитектуры x86, и далее будем портировать эксплоит для системы Win7 x64. Некоторые эксплоиты не будут запускать на машинах с Win10 из-за присутствия новых защит. В этом случае мы либо будем изменять логику работы эксплоита, либо будем использовать полностью другой подход.

Используемое программное обеспечение:

  • Гипервизор (масса вариантов).
  • Windows 7 x86 VM
  • Windows 7 x64 VM
  • Windows 10 x64 VM

Настройка систем для отладки

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

На каждой машине, которая будет отлаживаться, нужно сделать следующее:

  • Внутри директории VirtualKD запустите файл target\vminstall.exe. Добавится новая загрузочная запись и будут доступны функции отладки и автоматическое подключение к серверу VirtualKD, установленному в системе, которая выступает в роли отладчика.

В случае с Windows 10 VM необходимо включить режим test signing, который позволяет загружать неподписанные драйвера в ядро.

После выполнения команды bcdedit /set testsinging on и перезагрузки на рабочем столе появится надпись «Test Mode».

Краткое описание модуля HEVD

Процедура DriverEntry является стартовой для каждого драйвера:

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = {0};

UNREFERENCED_PARAMETER(RegistryPath);
PAGED_CODE();

RtlInitUnicodeString(&DeviceName, L"\\Device\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

// Create the device
Status = IoCreateDevice(DriverObject,
0,
&DeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&DeviceObject);

  • Эта процедура содержит вызов функции IoCreateDevice, содержащей имя драйвера, которое мы будем использовать во время коммуникации.
  • В объект DriverObject будут добавлены нужные структуры и указатели на функции.
  • Для нас важен указатель функции, связанный с процедурой DriverObject->MajorFunction , отвечающей за обработку IOCTL (I/O Control; управление вводом/выводом);
  • В HEVD эта функция называется IrpDeviceIoCtlHandler , которая представляет собой большое условное выражение со множеством ответвлений для каждого IOCTL. Каждая уязвимость имеет уникальный IOCTL.

Пример: HACKSYS_EVD_IOCTL_STACK_OVERFLOW представляет собой IOCTL, используемый для активации бреши, связанной с переполнением стека.

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

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

  • Авторы:

    Баринов С.С., Шевченко О.Г.

  • Год:
  • Источник:

    Информатика и компьютерные технологии / Материалы VI международной научно-технической конференции студентов, аспирантов и молодых ученых - 23-25 ноября 2010 г., Донецк, ДонНТУ. - 2010. - 448 с.

Аннотация

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

Основная часть

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

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

В целом можно говорить о недостатке средств отладки ядра. Хотя таковые средства имеются в наличии, зачастую говорить об альтернативах не приходится. Например, отладчик Microsoft Windows Debugger имеет слишком высокий порог вхождения. Многие программисты говорят о первом негативном опыте при знакомстве с ним, а большинство его возможностей остаются незатребованными.

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

    Современные отладчики обеспечивают следующие базовые функции:
  • отладка на уровне исходного кода;
  • управление выполнением;
  • просмотр и изменение памяти;
  • просмотр и изменение содержимого регистров процессора;
  • просмотр стека вызовов.

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

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

При прерывании кода режима ядра возникают следующая дилемма. Отладчик для взаимодействия с программистом использует интерфейс пользователя. Т.е. как минимум видимая часть отладчика выполняется в пользовательском режиме и для его построения естественно использует интерфейс прикладного программирования (Windows API), который в свою очередь опирается на модули режима ядра. Таким образом, приостановка кода режима ядра может привести к взаимной блокировке: система перестанет отвечать на запросы пользователя.

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

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

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

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

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

Описанное поведение нарушается, если программный код отладчика вынужден использовать высокий уровень запросов прерываний (interrupt request levels, IRQL). При IRQL, совпадающем с или превышающем IRQL диспетчера памяти последний не сможет загрузить отсутствующую страницу, т.к. операционная система будет блокировать прерывание Page Fault. Это приведет к краху операционной системы .

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

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

Основные средства отладки режима ядра предоставляются самим производителем операционной системы Windows в рамках свободно распространяемого пакета «Debugging Tools for Windows». Средства включают графический и консольный отладчики WinDbg и KD соответственно (далее Windows Debugger). Работа этих отладчиков опирается на механизмы, предусмотренные разработчиками операционной системы и заложенные в ее ядре.

Основным режимом для Windows Debugger является режим интерпретатора команд. Благодаря модульной структуре, наряду с поставляемыми разработчиками командами Windows Debugger поддерживает сторонние модули, называемыми расширениями. В действительности большинство встроенных команд также оформлено в виде расширений.

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

Существует модуль расширения для Windows Debugger под названием LiveKD, созданный Марком Руссиновичем, который в некотором смысле реализует локальную интерактивную отладку. LiveKD на ходу создает дамп памяти рабочей системы и использует его для отладки.

Пакет инструментов «Debugging Tools for Windows» регулярно обновляется и поддерживает все современные операционный системы Windows.

Отладчик ядра SoftICE, выпускавшийся компанией Compuware в пакете программ DriverStudio, традиционно выступал альтернативой пакету «Debugging Tools for Windows». Отличительной чертой SoftICE являлась реализация локальной интерактивной отладки на поддерживаемом аппаратном обеспечении. Отладчик практически полностью мог контролировать работу операционной системы.

С 3 апреля 2006 года продажа продуктов семейства «DriverStudio» было прекращена по причине «множества технических и деловых проблем, а также общего состояния рынка». Последней версией операционной системы, поддержка которой была реализована, является Windows XP Service Pack 2. Как правило, пакеты сервисных обновлений не изменяют прикладной интерфейс операционной системы, но номера системных вызовов и другая недокументированная информация может претерпевать изменение. Отладчик SoftICE опирался на жестко-прописанные адреса внутренних структур данных. Как следствие - с выходом Service Pack 3 совместимость была нарушена. Очевидно, что более поздние версии операционной системы Windows также не поддерживаются.

Syser Kernel Debugger создан небольшой китайской компанией Sysersoft как замена отладчику SoftICE. Первая финальная версия была выпущена в 2007 году. Как и SoftICE, Syser Kernel Debugger способен выполнять интерактивную отладку на работающей системе. Поддерживаемыми являются только 32-разрядные редакции современных версий Windows.

На данный момент Windows Debugger является основным инструментом среди разработчиков модулей ядра. Его также использует команда разработчиков ядра операционной системы Windows.

Термин «отладка ядра» означает изучение внутренней структуры данных ядра и (или) пошаговую трассировку функций в ядре. Эта отладка является весьма полезным способом исследования внутреннего устройства Windows, поскольку она позволяет получить отображения внутренней системной информации, недоступной при использовании каких-либо других средств, и дает четкое представление о ходе выполнения кода в ядре.

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

Символы для отладки ядра

Файлы символов содержат имена функций и переменных, а также схему и формат структур данных. Они генерируются программой-компоновщиком (linker) и используются отладчиками для ссылок на эти имена и для их отображения во время сеанса отладки. Эта информация обычно не хранится в двоичном коде, поскольку при выполнении кода она не нужна. Это означает, что без нее двоичный код становится меньше по размеру и выполняется быстрее. Но это также означает, что при отладке нужно обеспечить отладчику доступ к файлам символов, связанных с двоичными образами, на которые идут ссылки во время сеанса отладки.

Для использования любого средства отладки в режиме ядра с целью исследования внутреннего устройства структуры данных ядра Windows (списка процессов, блоков потоков, списка загруженных драйверов, информации об использовании памяти и т. д.) вам нужны правильные файлы символов и, как минимум, файл символов для двоичного образа ядра - Ntoskrnl.exe. Файлы таблицы символов должны соответствовать версии того двоичного образа, из которого они были извлечены. Например, если установлен пакет Windows Service Pack или какое-нибудь исправление, обновляющее ядро, нужно получить соответствующим образом обновленные файлы символов.

Загрузить и установить символы для различных версий Windows нетрудно, а вот обновить символы для исправлений удается не всегда. Проще всего получить нужную версию символов для отладки путем обращения к специально предназначенному для этого серверу символов Microsoft, воспользовавшись для этого специальным синтаксисом для пути к символам, указываемом в отладчике. Например, следующий путь к символам заставляет средства отладки загрузить символы с интернет-сервера символов и сохранить локальную копию в папке c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/symbols

Подробные инструкции по использованию символьного сервера можно найти в файле справки средств отладки или в Интернете на веб-странице http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Публикации по теме