Режим отладки ядра windows 7 время выполнения. Средства отладки режима ядра операционной системы Windows

Эта серия статей появилась по двум причинам. Во-первых, мне нравится работать с проектом 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. Я понимаю, что существует масса тонкостей и проблем, с которыми вы можете столкнуться. Поскольку в этом цикле основное внимание уделяется разработке эксплоитов, вам придется решать все попутные проблемы самостоятельно. Однако все возникающие вопросы вы можете задавать в комментариях.

Для проведения отладки ядра необходимо подключиться к компьютеру с помощью нуль-модемного кабеля или модемного соединения. Компьютер, выполняющий отладку, будет называться “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>.

Отладчики режима ядра находятся между 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 почти никогда не применяется, потому что это консольное приложение, которое очень утомительно использовать для отладок исходного уровня.

Как запустить отладчик ядра?

Ответ мастера:

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

Нужно запустить процессор командный cmd. Откройте меню «Пуск» на панели задач. В появившемся окне кликните на пункт «Выполнить…». Появится окно «Запуск программы». В текстовом поле введите cmd, после этого нажмите кнопку «ОК».

Теперь создайте резервную копию файла boot.ini. Сначала узнайте установочный путь текущей копии Windows, воспользовавшись командой: echo %SystemRoot%

Далее перейдите на диск, с установленной операционной системой, введя литеры устройства, а после них, поставив двоеточие. С помощью команды cd, перейдите в корневой каталог. Теперь используя команду attrib, снимите с файла boot.ini атрибуты «скрытый», «только для чтения» и «системный». Командой copy создайте резервную копию, а затем установите атрибуты на место.

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

Воспользуйтесь командой bootcfg/copy для создания загрузочной записи. Для того чтобы указать идентификатора записи, которую будете копировать, воспользуйтесь параметром /id. Используя параметр /d, задайте имя записи, которая будет отображаться. Теперь нужно снова перейти к списку вариантов загрузки, используя команду bootcfg/query ,и посмотрите идентификатор добавленной записи.

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

Если вы хотите осуществить удаленную отладку с подключением целевого компьютера через com-порт к хост-машине, то воспользуйтесь опциями /port и /baud для того чтобы указать номер порта и скорость обмена.

Если вы будете производить удаленную отладку с подключением через кабель FireWire (интерфейс IEEE 1394), то для того чтобы включить соответствующий режим используйте опцию /dbg1394 и для того чтобы указать номер канала опцию /ch.

Чтобы убедиться в том, что изменения внесены, проверьте загрузочные используя команду bootcfg с параметром /query. Осуществив команду exit, закройте окно командного процессора.

При необходимости измените параметры загрузки операционной системы. Откройте через меню «Пуск» панель управления, и уже в ней откройте элемент «Система». В открывшемся окне «Свойства системы» выберите вкладку «Дополнительно». В этой вкладке выберите раздел с названием «Загрузка и восстановление» и в нем нажмите на кнопку «Параметры». В появившемся окне «Загрузка и восстановление» нужно активировать опцию «Отображать список операционных систем». Закройте оба диалоговых окна кнопкой «ОК».

Выполните перезагрузку компьютера. Выберите загрузку с отладчиком. Выполните вход в систему и начинайте работать на целевой машине или начните удаленную отладку. Воспользуйтесь такими средствами как WinDbg и KD.

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


Тяжело быть отладчиком...

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

Конечно, поскольку сейчас множество всяких различных языков программирования, то и отладчики для каждого из них свои. И, естественно, для разных категорий этих языков имеются различия в работе отладчиков: например, отладчик программ на интерпретируемом Ruby будет работать иначе, чем для компилируемого в байт-код языка Java, а отладчик для Java, в свою очередь, будет иметь отличия от отладчика Visual C++.

Я расскажу об отладке для платформы Windows. Поняв принципы работы отладчиков для неё, можно будет разобраться и с отладчиками под POSIX-системы, и с отладчиками, которые работают не на уровне операционной системы, а на уровне виртуальной машины или какого-либо интерпретатора.


Отладчики для Windows: два вида

Существуют два принципиально разных вида отладчиков под Windows. Думаю, с первыми сталкивались все, когда программировали на Delphi (не программировали на нём? С трудом верится. На чём же вы программировали в школе и на младших курсах?). Это отладчики пользовательских приложений. Их немало, и они существуют как по отдельности, так и (особенно, кстати, часто) в составе интегрированных сред разработки приложений. Среди отладчиков, распространяемых как отдельные программные продукты, традиционно выделяют OllyDbg, и о нём я когда-то писал в "Компьютерных вестях".

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

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


Отладчик пользовательских приложений

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

Для того чтобы отладка началась, отладчик должен запустить отлаживаемый процесс специальным образом - таким, чтобы система знала, что этот процесс будет находиться под отладкой. После этого начинается цикл отладки: программа выполняется до наступления определённого события, которое так и называется - отладочное событие, или debug event. При этом цикл отладки запускается в отдельном потоке, чтобы предотвратить зависание отладчика.

Но это только начало. Потому что самое интересное в работе отладчика начинается уже тогда, когда отладочное событие произошло. Ведь, по сути, в чём заключается работа отладчика? Чтобы помочь программисту локализовать ошибку с точностью до конкретной функции, конкретной операции, конкретной переменной. В этом нелёгком деле отладчику также может помочь операционная система.

Итак, отладочное событие произошло, и дальше надо каким-то образом узнать, как это связано с текстом программы. Это возможно только если в саму программу включена специальная отладочная информация - таблица отладочных символов. Она содержит в себе информацию о соответствии между адресами и именами функций, типов данных, номерами строк кода. Именно благодаря им возможна та отладка, с которой знаком каждый Windows-программист. Таблицы символов имеют разные форматы, а потому не всегда возможно отладить программу, скомпилированную компилятором одного разработчика, с помощью отладчика от другого производителя. Но, правда, самый распространённый формат всё же можно указать - это PDB (Program Database), и разработан он, естественно, корпорацией Microsoft.

Итак, если отладочная таблица символов имеет формат PDB, то можно воспользоваться специальным инструментом от корпорации Microsoft - символьным отладочным процессором. Когда-то он входил в ядро системы и назывался Imagehlp.dll, но уже давным-давно был выделен в отдельную библиотеку. Символьный процессор позволяет находить по заданному адресу ближайшую открытую функцию или глобальную переменную, а также номер строки и название файла с исходным текстом, в котором эта строка находится. Поддерживаются и обратные операции, например, поиск адреса функции по её имени.

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

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


Отладчик ядра

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

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

В современных процессорах архитектуры Intel x86 имеются специальные отладочные регистры (и в стареньком 368-м, и в более новых моделях процессоров их всего восемь, они именуются как DR0-DR7). Эти регистры позволяют отладчику ставить контрольные точки на чтение и запись памяти, а также на порты ввода-вывода. В общем виде всё выглядит именно так, и я не думаю, что стоит сейчас расписывать подробно, за что отвечает каждый из отладочных регистров, какими прерываниями реализуются точки останова и давать прочую подобную информацию. Лучше расскажу о конкретных существующих отладчиках ядра для Windows.

Ну, во-первых, это отладчик, встроенный в само ядро операционной системы. Он есть во всех ОС линейки NT, начиная с Windows 2000. Это часть файла NTOSKRNL.EXE, и включить его можно, задав опцию "/Debug" для операционной системы в BOOT.INI. Этот отладчик нуждается в нуль-модемном соединении и втором компьютере с такой же ОС.

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

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


Для самых любознательных

Сейчас, конечно, разговор об отладчиках для Windows-приложений не так актуален, как ещё лет десять назад. Весь мир заинтересовался Интернетом, и основными пользователями SoftIce стали крякеры, неутомимые труженики на ниве пиратства. Тем не менее, это не так уж плохо. Общение с SoftIce"ом, несомненно, развивает человека в плане знаний о компьютере, хотя, конечно, если общаться только с отладчиками и не общаться с живыми людьми, возможны некоторые побочные эффекты. Ну, об этом, я думаю, все и так догадываются.

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

Итак, если вам хочется создать собственный отладчик, то сначала стоит ознакомиться с материалами на эту тему. На мой взгляд, самым лучшим пособием для начала будет книга Джона Роббинса "Отладка Windows-приложений". Она уже старая, 2001-го года издания, но информация, изложенная в ней, актуальна и сейчас, поскольку имеет общий, даже в некотором роде фундаментальный характер. В этой книге есть примеры написания отладчиков для Windows, кроме того, она пригодится вам, если вы программируете на C++ и хотите лучше разобраться в обработке исключений. Собственно, именно из этой книги я и почерпнул сведения об отладчиках, изложенные в статье. Если же найти эту книгу не получится (всё-таки, она уже довольно старая), есть несколько адресов, которые могут вам пригодиться. Первый - вот такой: www.xakep.ru/post/19158/default.asp . Эта статья из журнала "Хакер" несколько подробнее рассказывает об отладчиках ядра, чем это сделал я, а кроме того, в ней приведён код простейшего отладчика. А по адресу kalashnikoff.ru/Assembler/issues/016.htm можно узнать о том, как написать DOS-отладчик. Но, конечно, лучше всего читать MSDN и попутно найти какой-нибудь отладчик с открытыми исходными текстами, чтобы в нём разобраться. Ну и, конечно, если вы взялись за написание отладчика, то успехов вам в этом нелёгком деле!