Принцип роботи відладчика ядра операційної системи. Кошти налагодження режиму ядра операційної системи Windows Що таке налагодження ядра

Як запустити відладчик ядра?

Відповідь майстра:

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

Ця серія статей з'явилася з двох причин. По-перше, мені подобається працювати з проектом 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. Додасться нова MBR і будуть доступні функції налагодження і автоматичне підключення до сервера 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.

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


Важко бути отладчиком ...

У світлі того, що програмісти використовують відладчик денно і нощно, особливо коли увійдуть в режим глибокого налагодження, варто сказати, що, будь відладчик не програмою, а залізякою, він би напевно перегрівся і зламався. Тому що стільки роботи, скільки її дістається отладчику, не має навіть компілятор.

Звичайно, оскільки зараз безліч всяких різних мов програмування, то і отладчики для кожного з них свої. І, природно, для різних категорій цих мов є відмінності в роботі отладчиков: наприклад, відладчик програм на интерпретируемом 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 і попутно знайти який-небудь відладчик з відкритими вихідними текстами, щоб в ньому розібратися. Ну і, звичайно, якщо ви взялися за написання відладчика, то успіхів вам у цій нелегкій справі!

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

Поділитися