Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Підсистема дослідження в SoftICE.doc
Скачиваний:
0
Добавлен:
22.11.2019
Размер:
505.86 Кб
Скачать

Інсталяція

Апаратні вимоги (від NuMega):

  • Процесор:486 або Pentium.

  • ОЗУ:необхідно 16 Мб (хоча у свій час працював і на 8), бажано 32 Мб.

  • Мишка:звичайна або PS (цікаво, а хто у виндах без її працює?).

  • Відеокарта:починаючи з версії 3.2, в SoftIce входить універсальний дисплейний адаптер, що повинен працювати з будь-якою відеокартою, також є драйвера й для великої кількості відеокарт.

SoftIce підтримує роботу з:

  • однією відеокартою (стандартний варіант)

  • с двома відеокартами (друга відеокарта повинна бути MDA (Monochrome Display Adapter) або Hercules-сумісна)

  • с двома звичайними відеокартами за умови, що вони будуть працювати разом

  • вилучене налагодження (із другим комп'ютером, що з'єднується з першим за допомогою COM-порту (remote debugging));

На диску займає 5,8 Мб.

При інсталяції, як звичайно, уведіть директорію, куди ви хочете поставити SoftIce, виберіть компоненти, які хочете поставити, після чого потрапите у вікно вибору відеоадаптера. SoftIce сам визначає відеокарту, якщо вона відповідає вашої - натисніть кнопку Test, екран повинен перемкнеться в текстовий режим і ви побачите фрази "SoftIce is totally awesome!" на всьому екрані, а в середині відлік цифр від 5 до 1. Якщо ви це побачили, то значить настроювання відеоадаптера пройшло успішно - тисніть кнопку Next, якщо ж у вас збилося розгорнення, пропало зображення або зависла машина, то значить в SoftIce проблеми з відеокартою, для їхнього рішення існують два шляхи: перший, включити універсальний відеоадаптер - повинне допомагати завжди (на моєму Matrox Mistique проходить тільки цей варіант), тоді SoftIce буде працювати у вікні: другий, підібрати із числа представлених відеоадаптерів аналог вашому (у мене з S3 TRIO 64 вис (правда SoftIce був 3.01), а з DS 2000 працював ура); вам вирішувати який варіант краще.

Після вибору адаптера виберіть тип миші, який ви користуєтеся (хоча миша можна й не ставити, без її важко працювати в SoftIce). Далі дозволите модифікувати свій autoexec.bat для того, щоб SoftIce завантажувався при старті комп'ютера. Підтвердите обрану конфігурацію й стежите за тим, як SoftIce ставиться на вашу машину. На речення перезавантажити комп'ютер, погодитеся. Після перезавантаження натисніть клавіші Ctrl-D. Якщо замість робочого стола ви побачите якісь незрозумілі букви й цифри, то вважайте, що установку SoftIce на машину ви закінчили, і наступає етап настроювання. Якщо ж нічого не трапилося, або машина зависла при завантаженні, то чи перевірте всі ви правильно зробили. Якщо SoftIce не завантажився, перевірте, чи прописана в autoexec.bat рядок запуску, вона завжди остання й виглядає приблизно так: C:\WINDEBUG\SICE324\WINICE.EXE, якщо немає - пропишіть її з вашим шляхом. Якщо машина зависла, то причина, швидше за все в невірній конфігурації відеоадаптера. Спробуєте змінити її.

ДОстаті, всі настроювання, які ви проводили при інсталяції можна змінити: Пуск - Програми - NuMega SoftIce.

Настроювання:

Відкрийте на редагування файл winice.dat, що перебуває в тій же директорії що й SoftIce (у випадку NT - у каталозі %SystemPath%\system32\drivers), і заберіть крапку з коми з наступних рядків:

; ***** Examples of export symbols that can be included for Windows 95 *****

;Change the path to the appropriate drive and directory

EXP=c:\windows\system\kernel32.dll - забрати;

EXP=c:\windows\system\user32.dll - забрати;

EXP=c:\windows\system\gdi32.dll - забрати;

Перевірте шлях до файлів kernel32,user32,gdi32, він повинен відповідати вашому (Актуально у випадку, якщо windows ставилася в каталог відмінний від C:\WINDOWS).

Ця операція потрібна для того, щоб при налагодженні програми при виклику системних функцій ви побачили ім'я викликуваної функції, а не якийсь call [xxxxxxxx].

Приклад:

Call [USER32!GetWindow], замість CALL [BFC01480].

На мій погляд перше виглядає значно информативней.

Виправте рядок INIT відповідно до одним із прикладів:

INIT="WR;WD;WL;X;" - якщо ви використаєте відеодрайвер для "рідної" відеокарти (полноэкранный режим).

INIT="SET FONT 3;SET ORIGIN -10 25;WR;WD 4;WL;WC 12;X;" - якщо ви використаєте універсальний відеодрайвер (віконний режим).

INIT="SET FONT 1; SET ORIGIN 30 30;LINES 60;WIDTH 90;WR;WD 4;WL;WC 12;X;" - варіант, що працює на моїй машині й виводить на екран максимум інформації (віконний режим), можливо для вашої машини буде потрібно змінити значення деяких параметрів.

Якщо ви хочете пересунути вікно з SoftIce, то використайте клавіші Ctrl-Alt-(одна із клавіш керування курсором).

Більш докладно команди й змінні SoftIce будуть розглянуті нижче, тоді ви зможете настроїти SoftIce на свій смак.

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

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

Саме верхнє вікно - вікно регістрів (wr - скорочене позначення, використовуване в SoftICE). У цьому вікні відображається вміст регістрів процесора. Окремо від інших у правому куті відображається стан регістра прапорів (кожного прапора окремо). Найбільше значення для нас має прапор нуля (зображується символом z). Заголовна буква Z означає, що прапор установлений, рядкова - прапор скинутий. Під умістом регістра прапорів відображається також дуже корисна для нас інформація, але докладно я розповім про неї в наступних статтях. Вікно регістрів включається й вимикається командою wr.

Наступне - вікно даних. У ньому ми можемо спостерігати вміст ділянки пам'яті, що цікавить нас. Існує кілька різних форм подання інформації в цьому вікні:

db - інформація відображається у вигляді байтів (byte)

dw - інформація відображається у вигляді слів (word)

dd - інформація відображається у вигляді подвійних слів (double word - dword)

Інформація в цьому вікні міняється при зміні вмісту ділянки пам'яті, тобто Ви завжди бачите саме те, що перебуває в цей момент у пам'яті. Вікно включається й вимикається командою wd.

Нижче розташоване вікно коду. У ньому відображається дизассемблированный текст досліджуваної програми. Курсор (новий рядок для рекомендованих настроювань) указує на команду, що буде виконана на наступному кроці. У нижній частині вікна (на жовтій смужці) показано, у якому модулі ми в цей момент перебуваємо. Перемикається вікно за допомогою команди wc.

Саме нижнє вікно - вікно команд SoftICE. Тут Ви вводите команди й одержуєте деяку корисну інформацію про роботу SoftICE. Т. к. виведена інформація цілком залежить від уведених команд, то описувати її ми будемо для кожної команди окремо.

Робота всіх Windows-додатків заснована на виклику API-функцій. Це дуже зручно й вигідно. Наприклад, для висновку вікна повідомлення з деяким текстом, досить викликати функцію MessageBox з адресою виведеного рядка як аргумент. Чудовою особливістю SoftICE є те, що Ви можете встановлювати крапки переривання на виклики API-функцій. Установивши крапку переривання на деякий рядок програми, Ви повідомляєте SoftICE, що при досягненні цього рядка програма повинна перервати своє виконання й повернути керування отладчику. Наприклад, Ви встановили крапку переривання на виконання команди за адресою 40А00020, а потім запускаєте програму з адреси 40А00000. Дійшовши до рядка з адресою 40А00020, програма перерветься, керування знову повернеться в SoftICE, і Ви зможете довідатися вміст регістрів процесора, ділянок пам'яті, а також, при необхідності, щось змінити.

Точка переривання на виклик API-функції встановлюється точно так само, як і не виконання команди по певній адресі. При виклику функції програма переривається в самому її початку, і після цього Ви можете виконати необхідні Вам дії. Звичайно крапку переривання на виклик API-функції встановлюють, коли хочуть довідатися, з якого місця програми вона викликається. Допустимо, у програмі є наступний фрагмент:

деякий код

...

40200100 call MessageBox

40200105 cmp eax, 01

...

продовження програми

Ви точно знаєте, що викликається функція MessageBox, але не знаєте, що це відбувається за адресою 40200100h. Для того, щоб це з'ясувати ми повинні проробити наступне:

Активізуємо SoftICE (Ctrl+D)

Установлюємо крапку переривання на виклик функції MessageBox (bpx MessageBox, радимо завжди писати загальноприйняті імена функцій із заголовними й малими літерами, SoftICE їх не розрізняє, а Ви так швидше запам'ятаєте). При цьому відбувається наступне: SoftICE установлює крапку переривання на виконання першої команди зазначеної функції

Виходимо в Windows (F5)

Виконуємо ті дії, у результаті яких відбудеться виклик функції MessageBox

При виклику цієї функції (повідомлення у вікні команд) програма переривається в модулі USER (зазначено в низі вікна коду) і активізується SoftICE, при цьому курсор установлений на першій команді функції MessageBox. Щоб довідатися, з якого місця відбувся її виклик, використаємо команду p ret (швидка клавіша F12) - продовження програми до виконання команди ret (команда повернення з підпрограми)

Після цього, програма знову переривається за адресою 40200105 (на цьому рядку встановлений курсор), а на попередньому рядку ми бачимо, що відбувається виклик MessageBox. От ми й знайшли те місце, звідки викликається функція MessageBox

Ми описали лише незначну частину команд SoftICE. Інші докладно розглянемо в міру їхнього використання в наших наступних дослідженнях конкретних програм. Що ж, ми вже небагато освоїлися в SoftICE і впритул підійшли до необхідності використання дизассемблера. Без нього ніякого серйозного дослідження програми Вам провести не вдасться. Наше наступне оповідання про IDA Pro.

При написанні програм, часто виникає така ситуація, коли необхідно ту саму послідовність команд використати в різних частинах програми. Було б нерозумним дублювати її в кожнім такому місці. Замість цього послідовність оформляють окремим блоком і поміщають у самий кінець програми, а в ті місця, де вона використається, ставлять "посилання" на цей блок. Такий блок називають функцією, а "посилання" на нього - викликами функції. Всі, здається, зрозуміло, крім одного: у різних частинах програми функція повинна працювати з різними даними, отже, у функцію їх треба якось передати. Такі дані називаються аргументами цієї функції. Розглянемо опис виклику функції на прикладі MessageBox():

MessageBox (hWnd, lpText, lpCaption, uType); тут hWnd, lpText, lpCaption, uType - аргументи функції.

Аргументи у функцію передаються через стек. У програмі це виглядає в такий спосіб:

деякий код

...

push 20h <-передача аргументу uType

push 00440010 <-передача аргументу lpCaption

push 0044003E <-передача аргументу lpText

push ebx <-передача аргументу hWnd

call USER32!MessageBox <-виклик функції MessageBox()

...

продовження програми

Ми з Вами в основному будемо мати справу з функціями Win32 API. Win32 API (Aplication Programming Interface) - набір функцій (і не тільки, але зараз нас цікавлять саме функції), які Windows надає розроблювачеві для використання у своїх програмах при створенні інтерфейсу (у цьому випадку це слово означає взаємодія) з ОС (Операційна Система). Всі Win32 API функції розташовуються в.dll файлах (спеціальні бібліотеки функцій, підключають динамічно до програми при її виконанні, розмова про їх ще спереду).

Для API-функцій прийняті наступні угоди:

  1. Аргументи у функцію передаються у зворотній послідовності (спочатку останній аргумент, потім - передостанній і т.д.)

  2. Корекція стека виробляється самою функцією

Пояснимо пункт 2. Як Ви, напевно, знаєте, при приміщенні чого-небудь у стек, після потрібно це обов'язково зі стека забрати, інакше подальше виконання програми буде невірним і незабаром вона видасть повідомлення про помилку. Процес видалення зі стека аргументів, переданих у функцію, називається корекцією стека. Ця операція може вироблятися або усередині самої функції (у самому її кінці), або відразу після виклику функції в тім місці програми, звідки цей виклик здійснювався. У всіх API-функціях корекція стека виробляється усередині самих цих функцій.

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

От, взагалі ж, і все, що Ви поки повинні знати про функції. Додаткову інформацію я буду давати в наступних статтях, у міру необхідності.