6.3. Програмний інструментарій для зламу програмного забезпечення
При дослідженні програмного фахівцеві доводиться користуватися різними
інструментами, що дозволяють ефективніше виконувати поставлені завдання. Ці
інструменти здатні підняти продуктивність праці аналітика у декілька разів. Про
існуючі інструменти і їх можливості корисно знати і розробникам засобів безпеки,
щоб ефективніше створювати труднощі аналітикам, які намагатимуться знайти дірки
в захисті.
Два основні способи дослідження програмного коду - це дизасемблювання та
відлагодження.
Використовуючи дизасемблер, можна подивитися, як написана програма, які
команди і в якій послідовності повинні виконуватися, до яких функцій йде звернення
і т.д. В загальному випадку дизасемблер не здатний відновити початковий текст
програми, написаної на мові високого рівня, такому як С або Pascal. Результатом
роботи дизасемблера є (як можна здогадатися з назви) еквівалентний текст на мові
асемблера. Для осмислення асемблерного тексту аналітик, зрозуміло, повинен бути
добре знайомий з мовою асемблера і з особливостями того середовища, в якому
повинна виконуватися програма, що дизасемблюється. Дизасемблер є пасивним
інструментом - він ніяк не впливає на програму. Найпотужнішим дизасемблером з
тих, що існують на сьогоднішній день є IDA Pro (Interactive DisAssembler),
розроблений компанією DataRescue.
Для захисту від дизасемблерів застосовуються різні методи. Наприклад, якщо
код програми запакований або зашифрований, дизасемблер не зможе побачити в
досліджуваному файлі справжні інструкції програми. Але захищену таким чином
програму можна спочатку розшифрувати і розпакувати, а потім скористатися
дизасемблером.
39
Для більшості популярних засобів упаковки і шифрування коду виконуваних
модулів давно розроблені автоматичні або напівавтоматичні пакувальники. А для
того, щоб дізнатися, як саме запакований той або інший модуль, можна скористатися
спеціальними програмами-ідентифікаторами, які за деякими характерними ознаками
здатні ідентифікувати назву і версію використовуваного засобу захисту, а також
версію компілятора, що застосовувався при розробці програми.
Отже реальну складність для дизасемблювання представляють тільки
програми, які розшифровують фрагменти коду динамічно, не допускаючи
одноразової присутності в пам'яті розшифрованого коду цілком.
В деяких випадках дизасемблер відмовляється працювати з виконуваним
файлом, якщо якісь заголовки файлу сформовані з порушенням специфікації, але
даний спосіб також не є надійним.
Іноді код програми модифікується так, щоб дизасемблерну послідовність
команд було дуже важко аналізувати. Наприклад, сусідні команди розносяться в
різні місця, а правильність виконання організовується за рахунок великого числа
безумовних переходів. Або між командами вставляються довільні фрагменти коду,
що не впливають на результати обчислень, але що віднімають у людини, що виконує
аналіз багато часу.
Правда, варто відзначити, що, наприклад, дизасемблер IDA Pro має досить
потужні додаткові засоби (модулі, що підключаються та мова сценаріїв), надаючи
тим самим можливість нейтралізувати всі спроби протидії дизасемблюванню і
подальшому аналізу.
Відлагоджувач, на відміну від дизасемблера, є активним інструментом і
дозволяє прослідкувати процес виконання по кроках, отримуючи у будь-який
момент всю інформацію про поточний стан програми або вносити зміни в порядок її
виконання. Зрозуміло, відлагоджувач здатний показувати дизасембльовані
інструкції, стани регістрів, пам'яті і багато що інше. Але наявність відлагоджувача,
через його активність, може бути виявлена програмою або тією її частиною, яка
відповідає за захист..
Відлагоджувачі бувають трьох основних типів: рівня користувача, рівня ядра і
ті що емулюють.
Відлагоджувачі призначеного для рівня користувача (User-level Debuggers)
мають практично ті ж можливості, що і відлагоджувана програма. Вони
використовують Debugging API, що входить до складу операційної системи і з його
допомогою здійснюють контроль над об'єктом відлагодження.
Відлагоджувачі призначеного для рівня користувача входять до складу
багатьох середовищ розробки, таких як Visual Studio. Вони використовуються для
дослідження незахищених програм, але можуть бути легко виявлені.
Відлагоджувачі рівня ядра (Kernel-mode Debuggers) вбудовуються всередину
операційної системи і мають значно більше можливостей, чим відлагоджувачі
призначені для рівня користувача. З ядра операційної системи можна контролювати
багато процесів, не доступних іншими способами. Одним з найпотужніших і часто
використовуваних відлагоджувачів рівня ядра є Softlce, розроблений в компанії
NuMega Labs (Compuware Corporation). Але і відлагоджувачі рівня ядра майже
завжди можуть бути виявлені з програми, що не має доступу до ядра. Хоча для
40
Softlce, наприклад, був розроблений модуль розширення IceExt, що дозволяє, серед
іншого, непогано приховувати наявність відлагоджувача в пам'яті.
Емулюючі відлагоджувачі, мабуть, є найкращим засобом дослідження коду
програм. Такі відлагоджувачі емулюють виконання всіх потенційно небезпечних дій,
які програма може використовувати для виходу з-під контролю дослідника. Проте
основна проблема створення емулюючих відлагоджувачів полягає в тому, що іноді
їм доводиться емулювати реальне периферійне устаткування, а це надзвичайно
складне завдання. Можливо тому зараз немає доступних широкій аудиторії
емулюючих відлагоджувачів, хоча існує як мінімум два пакети для створення
віртуальних комп'ютерів: VMware, розроблений однойменною компанією, і
VIRTUALPC, створений в Connectix Corp., що недавно перейшов у власність
корпорації Microsoft.
Для того, щоб знайти яку-небудь інформацію в ресурсах виконуваного модуля,
можна скористатися таким інструментом, як редактором Microsoft Visual Studio. Але
краще використовувати спеціалізовані редактори ресурсів, яких існує досить багато.
Ці редактори, як правило, дозволяють проглядати ресурси відомих типів (наприклад
текстові рядки, ікони, картинки і описи діалогів) в природному вигляді, а незнайомі
ресурси - у вигляді шістнадцяткового дампу. Корисним може бути і модуль
розширення Resource Browser, що підключається до файлового менеджера FAR. Цей
модуль дозволяє проглядати ресурси у вигляді ієрархічного фрагмента файлової
системи з підкаталогами і файлами. При використанні такого представлення ресурсів
дуже зручно проводити пошук.
Ще одним інструментом дослідників захисту програм є програми-монітори,
що протоколюють спроби доступу до реєстру і дискових файлів. Монітор реєстру
(Registry Monitor) і монітор доступу до файлів (File Monitor) - це активні
інструменти. Пасивні інструменти просто запам'ятовують стани реєстру або файлів і
по розбіжностях дозволяють визначити, що саме змінилося. Простий спосіб виявити
змінені файли, не зберігаючи їх повністю - підрахувати і запам'ятати значення хеш-
функції від вмісту кожного файлу до і після виконання процесу, що вносить зміни, а
потім порівняти два набори хеша між собою. Саме на такому принципі будувалася
робота антивірусного монітора Adlnf, що функціонував під DOS.
Якщо вдалося
встановити, які саме файли піддаються зміні, їх можна заархівувати, а потім, після,
внесення змін, порівняти старий і новий вміст. Для цього можна скористатися
спеціальними інструментами або утилітою FC (File Compare), що входить до складу
Windows. FC дозволяє порівнювати як двійкові, так і текстові файли.
З реєстром працювати не так зручно, як з файлами, через те, що реєстр
Windows є досить складною деревовидною структурою. Зате об'єм даних, що
зберігаються в реєстрі, порівняно невеликий - декілька десятків мегабайт. Тому
можна просто обійти всі гілки реєстру і зберегти значення у власному форматі. Одна
з програм, що дозволяють це зробити, - Advanced Registry Tracer (ART), розроблена
компанією Elcomsoft Co. Ltd. ART надає користувачеві можливість зберегти декілька
"знімків" поточного стану реєстру. Потім окремі знімки реєстру можна попарно
порівнювати отримуючи списки доданих, змінених і видалених ключів і значень.
Для доступу до пам'яті процесу можна використовувати функції стандартного
Win32 API. У операційних системах сімейства NT деякі процеси можуть бути
41
запущені з атрибутами безпеки, що не дозволяють простим користувачам діставати
доступ до процесу. Але це робиться для того, щоб захистити ядро операційної
системи в розрахованому на багато користувачів середовищі. А у випадках
дослідження програм, як правило, користувач може поставити собі будь-які права
доступу що дозволить одержати доступ до пам'яті досліджуваного процесу.
Існують також спеціальні програми, що дозволяють не просто зберегти
фрагмент пам'яті на диск, але записати його у форматі Portable Executable (РЕ). Така
операція називається отриманням дампу виконуваного файлу і застосовується для
отримання розшифрованої і розпакованої версії досліджуваної програми.
Пристрою введення-виведення неможливо досліджувати пасивними засобами,
зате звернення до них можна протоколювати. Програми для протоколювання
натиснень на клавіатуру зазвичай називають клавіатурними шпигунами і
застосовують для перехоплення паролів, що вводяться користувачем. Проте цей
прийом застосовується або троянськими програмами, або при спробі вивідати
секретну інформацію у людини, але ніяк не при дослідженні засобів захисту.
Протоколювання введення і виведення в СОМ- і LPT-портах може здійснюватися,
наприклад, за допомогою програми PortMon, розробленої Марком Русиновічем (Mark
Russinovich) з компанії Syslnternals.
Дуже багато процесів всередині Windows управляються за допомогою
повідомлень. Зрозуміло, існують програми, що дозволяють відстежувати і
протоколювати, які саме повідомлення були передані тому або іншому процесу.
Однією з таких програм є Microsoft Spy++, що входить до складу Visual Studio. Spy++
дозволяє із списку або інтерактивно на екрані вибрати вікно, повідомлення для якого
необхідно відстежувати, і проглянути його властивості. Можна також задати, які саме
повідомлення повинні протоколюватися і які їх атрибути показуватимуться.
Протокол може відразу записуватися у файл.
Для перехоплення даних, що передаються по мережі, використовуються
спеціальні програми - сніфери (sniffer). Як правило, сніфери здатні перехоплювати всі
повідомлення, що передаються між пристроями всередині фізичного сегменту
мережі, до якого підключений комп'ютер з сніфером. Не дивлячись на те, що вже
багато років існують протоколи, що дозволяють приховати від супротивника всю
важливу інформацію при передачі по мережі, до цих пір використовуються деякі
протоколи, в яких, наприклад, паролі користувачів передаються у відкритому
вигляді.
|