Захист від відладчика

SoftIce - це універсальний відладчик, яким можна проаналізувати і налагодити будь-який код, включаючи підпрограми переривання і драйвери введення-виведення. SoftIce складається з відладчика рівня ядра (kernel mode debugger) (власне це і є відладчик) і завантажувача налагоджувальної інформації (Symbol Loader). Утиліта Symbol Loader (SL) завантажує зневадження для вашого модуля, дозволяє налаштувати SoftIce, і дає можливість записати історію команд (history buffer) в файл.

Можливості SoftIce:
  • Символьна налагодження 32-бітових додатків, налагодження драйверів пристроїв для WIN NT, драйверів для WIN95, VxD, 16-бітних програм для DOS і Windows.
  • Налагодження фактично будь-якого коду, включаючи підпрограми переривання і внутрішні підпрограми WIN 95 і WIN NT.
  • Установка точок зупину на операції читання / запису в пам'ять, читання / запису портів введення-виведення, переривань.
  • Установка точок зупину на повідомлення Windows.
  • Установка точок зупину, що спрацьовують при певних умовах (умовних точок зупину) і дій які повинні відбутися при спрацьовуванні точки зупину.

Утиліта SL дозволяє прочитати зневадження з налагоджують програму (EXE, DLL, VxD, 386, OCX) і завантажити її в відладчик, запустити вашу програму і автоматично встановити точку зупину на точку входу в програму, записати в файл протоколу налагодження.

В поставку SoftIce входить приклад GdiDemo.

1. Завантаження налагоджують програму

  • Запустити SL.
  • Вибрати опцію Open module в меню File.
  • Відкрити Gdidemo.exe.
  • Вибрати опцію Load в меню Module.

SL відтранслює зневадження в .NMS файл, завантажить вихідні файли, запустить отлаживаемую програму (в даному випадку Gdidemo) і спливе в SoftIce, де ви побачите вихідний текст програми.

Підсвічена рядок з номером 35 - це точка входу (entry point) в вашу програму. Якщо SL вивів повідомлення типу "An error occured during symbol translation / load", значить в налагоджувати файлі відсутній налагоджувальна інформація, тисніть OK і насолоджуйтеся [диз] ассемблером.

2. Управління SoftIce'ом

Якщо все зроблено правильно, то ви повинні побачити SoftIce розбитий на кілька вікон. Верхня частина - Register Window (вікно регістрів) - показує стан робочих регістрів процесора. Під ним знаходиться вікно даних Data Window, в ньому ви можете подивитися або відредагувати дамп пам'яті. Нижче знаходиться Code Window (вікно коду) - в ньому знаходиться вихідний текст програми (якщо ви завантажили зневадження), або дизасемблювати код програми. У самому низу знаходиться вікно команд - Command Window, в ньому ви можете вводити команду і бачити результат їх виконання. Сама нижня рядок - рядок допомоги, в ній при введенні підсвічуються можливі варіанти команд і їх синтаксис. Найзручніше управляти SoftIce за допомогою мишки.

Зміна розміру вікна - підведіть курсор до нижньої межі того вікна, з яким хочете змінити розмір або закрити його, натисніть ліву кнопку миші і ведіть її вниз (збільшення розміру) або вниз (зменшення розміру), якщо хочете закрити вікно, підведіть нижню межу до верхньої, у вікні з'явиться фраза Close current window і вікно зникне.
Примітка: не можна змінити розмір вікна регістрів і FPU.

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

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

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

Зміна значень прапорів - підведіть курсор до того прапору, який хочете змінити, натисніть ліву кнопку миші, після чого клавішею Ins можна змінити значення прапора на протилежне (маленька буква означає, що прапор не встановлено, велика встановлений).

Зміна значень елементів пам'яті - підведіть курсор до того байту (слову, подвійному слову і т.д.), яке хочете змінити, натисніть ліву кнопку миші і вводите ваше значення, якщо хочете змінити одну або кілька цифр в числі, то підведіть курсор за допомогою клавіатури до потрібних числах і міняйте.
Примітка: у всіх випадках зміни значень вони вступають в силу після того, як ви перейдіть в будь-яке інше вікно, до цього можна скасувати останню зміну, натиснувши Esc.

Установка точок зупину на виконання - підведіть курсор до тієї рядку в Code Window, в якій хочете зупинитися, і подвійним клацанням по лівій кнопці миші поставте точку зупину, рядок подсветится.

Видалення з Watch Window змінних - встановіть курсор на змінну, яку хочете видалити, натисніть ліву кнопку миші, змінна підсвітити, натисніть кнопку Del - змінна зникне.

3. Трасування програми

Скористайтеся командою T (trace) для того щоб відтрасувати одну команду, або клавішею F8, яка закріплена за замовчуванням за командою T. Відбудеться виконання команди знаходиться в поточному рядку і курсор перейде на наступний рядок і підсвітить її. Це рядок:

Ще раз натисніть F8, курсор пересунеться на наступний рядок:

Натисніть ще раз F8 і ви перейдете до рядка

Для того, що б налагоджувати програму ви користуєтеся командою Т, яка виконує один оператор вихідної програми або одну машинну команду.

Ще існує команда P або клавіша F10, яка виконує один крок в програмі тобто при трасуванні будь-якої функції або переривання, ви не отримаєте управління до тих пір поки виконання функції не завершиться і ви не повернетеся з функції назад. Команду P зручно застосовувати в тому випадку, коли ви налагоджувати основний алгоритм і відволікатися на трасування кожної процедури нераціонально.
Примітка: командою T можна відтрасувати системні виклики (WIN32 API calls) перебуваючи в source mode, для їх трасування потрібно перейти в mixed або code mode.

Вікно Locals Window показує поточний кадр стека. У нашому випадку він містить локальні змінні для функції WinMain.

Командою T увійдіть в функцію RegisterAppClass, вікно Locals Window стане порожнім, так як для цієї функції ще не визначені локальні змінні. Функція RegisterAppClass знаходиться в файлі INIT.C. SoftIce показує поточний файл в лівому верхньому кутку Code Window

Введіть команду T знову, вікно Locals Window буде містити параметр переданий функції RegisterAppClass (hInstance) і локальну структуру wndClass. Перед структурою стоїть знак плюс, який означає що всередині знаходяться змінні, які можна подивитися (так само можна дивитися рядкові змінні і масиви). Подивитися структуру можна подвійним клацанням миші. Знак + зміниться на - і, ви побачите змінні, з яких складається структура. Закрити структуру можна також подвійним клацанням миші.

5. Встановлення точок зупину на виконання

Точки зупинки на виконання діляться на два види: просто точки зупину і одноразові точки зупину.

Одноразові точки зупину

Перейдіть в Code Window, використовуючи клавішу PgDn перемістіть курсор на рядок з номером 61 (те ж саме можна зробити використовуючи команду U .61), в цьому рядку перебувати перший виклик функції Win32 API RegisterClass. Використовуючи команду HERE (клавіша F7) виконайте програму до цього рядка.

Поточної рядком в налагоджують програму стала рядок: Примітка: того ж самого результату можна було досягти командою G .61 (виконувати програму до рядка 61).

Звичайні точки зупину

Наступні кроки демонструють використання звичайних точок зупину, тобто таких, які будуть спрацьовувати до тих пір поки ви їх не скасуєте. Знайдіть такий виклик функції RegisterClass, що знаходиться в рядку 74. Встановіть курсор на цей рядок і введіть команду BPX (BreakPoint eXecutable) або клавішу F9 (по цій команді, в пам'ять на місце команди розташованої під курсором записується команда INT3, але ви цього не бачите. рядок повинен підсвітити. Зняти точку зупину можна повторним введенням цієї ж команди. Якщо ви щасливий володар процесора Pentium, то процес установки і зняття точки зупину зводиться до подвійному натисканні кнопки миші лівою кнопкою на тій команді, де хочете поставити точку зупину. Після вуст ановкі точки зупину запустіть програму командою G або X (клавіша F5). Коли програма виконає інструкцію INT3, вона передасть управління SoftIce, після чого він з'явитися перед вами. Подивитися інформацію про встановлені точках зупинки можна командою BL (BreakPoint List):

Так як подальша покрокова трасування функції RegisterAppClass не має для нас сенсу, повернемося в те місце, звідки ця функція викликалася. Для цього існує команда P з параметром RET (клавіша F12). Вона дозволяє виконувати програму до тих пір поки не зустріне команду RET (RETF), виконавши цю команду SoftIce вийде з підпрограми і зупинитися на рядку наступної за викликом цієї підпрограми. Стосовно до нашої програми: функція RegisterAppClass викликається з функції WinMain, SoftIce зупинитися в функції WinMain на рядку наступної за викликом функції RegisterAppClass, тобто підсвічена буде рядок:

Скористайтеся командою BC (Breakpoint Clear) з номером точки зупину, який ви подивилися за допомогою команди BL, для того, що б прибрати саме цю точку зупину, або замість номера введіть *, тоді ви приберете всі точки зупинки (можна вводити номера точок зупину через кому, якщо хочете прибрати кілька точок).

6. Використання інформаційних команд

SoftIce має в своєму розпорядженні багато різних команд, за допомогою яких можна дізнатися стан і отримати іншу інформацію про операційну систему і запущених в ній додатках. Ми розглянемо тільки дві команди: H (Help) і CLASS. Ці команди виводять досить багато інформації в вікні команд (Command Window), тому бажано збільшити розмір цього вікна, для цього закриємо вікно локальних змінних (Locals Window).

За команда H можна отримати допомогу по всіх командах SoftIce або більш детальну інформацію про конкретну команді, якщо введете її ім'я в якості аргументу команди H:

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

Метою виконання функції RegisterAppClass є реєстрація шаблону для класів вікон, які будуть використані додатком GdiDemo для створення вікон. Використовуючи команду CLASS можна подивитися зареєстровані класи для GdiDemo:

7. Символьні імена

Коли ви завантажуєте додаток з налагоджування, SoftIce автоматично створює таблицю символьних імен яка містить всі імена, визначені в цьому додатку. Використовуючи команду TABLE можна подивитися які таблиці символьних імен завантажені в даний момент:

Використовувана в даний момент таблиця символьних імен виділена кольором. Якщо поточна таблиця символьних імен не відповідає тій на яку посилається ваш додаток, то використовуючи команду TABLE з ім'ям вашого застосування в якості аргументу, ви підключите потрібну таблицю (якщо для вашого застосування створена таблиця):

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

8. Умовні точки зупину

Установка точки зупину на функцію LockWindowInfo.

Командою BPX LockWindowInfo поставимо крапку зупинки на виконання на цю функцію. Кожен раз, коли в одному з вікон програми GDIDEMO потрібно буде оновити інформацію, програмою буде викликатися функція LockWindowInfo, так як на цю функцію поставлена ​​крапка зупинки, то буде викликатися SoftIce. Командою BL перевірте, чи встановилась точка зупинки. Відкрийте програму командою X або G. Як тільки буде викликана функція LockWindowInfo, SoftIce спливе. Так як оновлення відбувається постійно, то постійно викликається і SoftIce, що дуже незручно, якщо нас цікавить оновлення будь-якого конкретного вікна. Щоб перехопити виклик на оновлення конкретного вікна, наприклад, POLYDEMO, скористаємося умовної точкою зупинки. З вихідного тексту програми (файл wininfo.c) видно, що функція LockWindowInfo отримує в якості вхідного аргументу один параметр HWND (Handle Window) - дескриптор вікна, і повертає в зухвалу функцію одне значення - покажчик на змінні для даного вікна. Тобто якби ми змусили спрацьовувати точку зупину тільки на обробник вікна POLYDEMO, ми б досягли своєї мети. Для початку нам необхідно дізнатися дескриптор нашого вікна, для цього скористаємося командою:

Тепер знаючи, де і що у нас передається в функцію, ми можемо виставити умовну точку зупину. Для цього викличемо на редагування точку зупину, поставлену на функції LockWindowInfo:

У нижньому рядку командного вікна з'явиться рядок:

і курсор встановиться в кінці рядка. Тепер можете редагувати точку зупину на свій розсуд, в кінці рядка додайте таку умову: і натисніть Enter.

Точка зупинки тепер буде виглядати так:

Вимкніть 0 точку зупину командою BD (Breakpoint Disable):

На відміну від команди BC, яка видаляє точку зупину, команда BD тимчасово відключає точку, тобто вона не буде спрацьовувати, але її в будь-який момент можна включити назад командою BE (Breakpoint Enable). Відключені точки зупину виділяються зірочками поруч з порядковим номером точки зупину.

Запустіть SoftIce командами X або G, коли вікно POLYDEMO спробує отримати доступ до першого подвійному слову примірника даних вікна, спрацює точка зупину і SoftIce спливе, це буде відбуватися в функціях PolyRedraw і PolyDrawBez. Ці функції звертаються до полю nBezTotal, що знаходиться за нульового зсуву в даних примірника вікна POLYDEMO. Значення цього поля задає кількість кривих одночасно виведених у вікно POLYDEMO.

Примітка: Через особливості архітектури процесорів Intel перехоплення звернення до комірки пам'яті відбудеться після виконання команди, що звертається до пам'яті, тобто SoftIce зупинитися на наступній команді.

Скиньте всі точки зупинки командою BC * і вийдете з SoftIce.

Як змусити SoftIce pаботать?

Config.Sys: Device = c: \. \. \ S-Ice.Exe
Потім запускаєте Ldr.Exe. У MS-DOS є маленький баг: він невірно виставляє значення регістра SP - він зменшує його значення на 2, і деякі захисту, активно використовують стек змушують повіситися завдання. Лікується правкою коду MS-DOS при завантаженні INT 21h AX = 4B01h або командою "R SP = SP + 2"

Як змусити SoftIce / Win / W95 pаботать?

Відредагувати файл WINICE.DAT, дати можливість вантажити отладчику символьну інформацію з системних DLL-їй. (В Winice.DAT даються посилання на USER.EXE, KRNL386.EXE, WIN386.EXE)

Схожі статті