ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 26.11.2019
Просмотров: 1423
Скачиваний: 1
СОДЕРЖАНИЕ
Лекція 1. Вступ. Категорії інформаційної безпеки. Захист програм.
Абстрактні моделі захисту інформації
Основні положення по розробці ПО
Помилки, що призводять до можливості атак на інформацію
Короткий огляд технології RAID
Переваги і недоліки основних рівнів RAID
1.3 Симетричні криптоалгоритмы
Загальні відомості про блокові шифри
Основи побудови захисту - крок за кроком
Крок 1. Відключення автоматичного запуску CD
Крок 2. Автоматичне оновлення системи
Крок 3. Відключення непотрібних сервісів
Крок 6. Теорія складання паролів
З незначними доопрацюваннями мережу Фейштеля можна зробити і абсолютно симетричною, тобто виконуючій функції шифрування і дешифрування одним і тим же набором операцій.
Захист програм від злому
Розглянемо деякі тонкощі організації захисту на досить популярному прикладі - припускаємо, що програма захищена деяким кодом (серійним номером, паролем), який повідомляється користувачеві після дотримання ним певних умов. До реєстрації в цій програмі заблокований ряд яких або корисних функцій, використовується докучлива реклама або обмежений рядків роботи. Після введення цього коду виробляється його перевірка і при позитивному результаті перевірки програма починає нормально працювати.
Інструментарій хакера
Сучасний хакер має у своєму арсеналі набір різноманітних утиліт для злому.
Їх можна підрозділити на декілька категорій
-
Відладчики. Дозволяють переривати виконання програми досягши заздалегідь заданих умов, виробляти покрокове виконання програми, змінювати вміст пам'яті і регістрів і тому подібне. Найбільш популярним, зручним і потужним являється відладчик SoftICE, який при досить примітивному інтерфейсі має пристойні можливості і дуже стабільно працює.
-
Дизасемблери. Виробляють дизасемблювання програми для подальшого вивчення отриманого коду. Один з найбільш потужних і популярних - IDA. Від дизасемблера досить легко захиститися - зашифрувати або заархівувати програму. Тоді дизасемблюється тільки архіватор або кодувальник. Проте тот-же IDA має потужну вбудовану скриптовой мову, що дозволяє виробляти розшифровку програми
-
Засоби моніторингу. Це набір утиліт, що відстежують операції з файлами, реєстром, портами і мережею.
-
Засоби пасивного аналізу програми. Показують різну інформацію про програму - витягають ресурси, показують зв'язки, використовувані бібліотеки. Класичний приклад - утиліта DEPENDS.EXE з комплекту Visual Studio. Вона показує, які бібліотеки використовуються програмою і які функції імпортуються.
-
Інші утиліти. Їх велика кількість (можна знайти на диску типу "Усе для хакера", причому удосталь). Це різноманітні редактори, аналізатори ..
Найбільш популярні наступні програми моніторингу :
-
FileMon - утиліта, що дозволяє вести моніторинг усіх операцій з файлами. Має зручний фільтр, може зберігати звіт у файлі. Тому немає сенсу робити "секретні" файли де-небудь в Windows/System - їх елементарно знайти.
-
RegMon - аналог FileMon, тільки ведеться моніторинг усіх операцій з реєстром. Аналогічно файлам, безглуздо створювати в реєстрі "секретні" ключі - вони відразу впадають у вічі.
-
PortMon - моніторинг роботи з портами введення/виводу
-
TCP_VIEW - монітор з'єднань по TCP - IP
-
RegUtils - набір утиліт для контролю за реєстром - робить копії реєстру, дозволяє порівнювати копії і переглядати зміни.
Утиліти типу FileMon можуть різко спростити злом програми - легко визначити місце, в якому програма звертається до вказаного файлу або ключа реєстру.
Основи побудови захисту - крок за кроком
Як ввести реєстраційний код. Введення пароля або реєстраційного номера є відповідальною справою - хакер постарається відловити адресу пам'яті, в яку буде записаний пароль. Потім на звернення за цією адресою ставиться крапка останову (команда BPM в SoftICE), що дозволяє упіймати початок процедури перевірки реєстраційного коду. Якщо для введення використовуються стандартні елементи введення Windows, то алгоритм дій хакера можна формалізувати і виглядає він приблизно так:
-
Встановлює точку останову на прочитування тексту із стандартного елементу введення (функції GetWindowText, GetGlgItemText модуля KERNEL32)
-
При виклику цієї функції аналізуємо її параметри і таким чином визначаємо, за якою адресою буде розміщено прочитуване значення і ставимо звернення до цієї області пам'яті точку останову. А достовірності певної адреси легко переконатися - після виконання функції там з'явиться введений рядок
-
При спрацьовуванні цієї точки останову ми потрапляємо в аналізатор введеного значення і або робимо генератор реєстраційних ключів, або ламаємо процедуру перевірки. І те, і інше дуже просто зробити - досить тільки вивчити асемблер і API
Набір цих дій стандартний і мені не раз попадалося детальне керівництво типу "Злом Windows програм - крок за кроком", орієнтовані на просунутого користувача.
Розглянь декілька рішень, які можуть утруднити злом на цьому етапі.
Рада _0. Прагніть якомога менше застосовувати стандартні функції (особливо API -шные) і компоненти VCL. Отже Assembler, Assembler і ще раз Assembler ..
Суть цієї ради сподіваюся очевидна - сучасні дизасемблери уміють розпізнавати стандартні процедури високорівневих мов, а API - взагалі окрема розмова - SoftICE має дивовижну можливість - завантажувати символьні імена для будь-яких вказаних бібліотек (особливо для KERNEL32.DLL) - відладка різко спрощується, оскільки ми бачимо імена функцій, що викликаються, і можемо ставити точки останову на виклик функцій по їх імені.
Рада 1. Застосовуйте нестандартний спосіб введення пароля.
Наипростейший шлях - написати свій візуальний компонент для введення реєстраційного коду. Він звичайно повинен буде обробляти події від клавіатури, але момент прочитування коду не можна упіймати побитими методами. Це вже щось, але є другий спосіб злому, заснований на пошуку введеного коду в пам'яті. Для цього в SoftICE є зручна команда "S стартова адреса L довжина 'образец'", яка дозволяє знайти введене значення в пам'яті.
Рада 2. Не зберігаєте введений код в одному місці !
Якщо введений код або реєстраційний номер зберігати в одному місці, то досить легко встановити точку останову на эону пам'яті, в якій зазмещен введений код.
Рада 3. Не зберігаєте введений код відкритим текстом !
Отже, що ж слід зробити. Спершу необхідно завести в програмі 5-10 змінних типу STRING і після введення коду переписати введене значення в них. Робити це краще всього не в одному місці, а розподілити за програмою. Таким чином пошук дасть купу адрес, по яких знаходитиметься введений код. Я у такому разі поступаю так - по таймеру створюю в динамічній пам'яті нову строкову змінну, пишу в неї код. Потім на наступному спрацьовуванні таймера створюю нову змінну, переписую в неї код, а стару знищую. При певній навичці можна заполонити пам'ять значеннями введеного коду і зробити пошук майже даремним. Причому таке копіювання можна поєднати з перевіркою коду або емуляцією цієї перевірки. Потім з ці рядками непогано поробити які-небудь операції - порівняти з чим-небудь ..
Ради 3 і 1 можна об'єднати - створити свій компонент, який дозволить вводити код нестандартним способом з його одночасним шифруванням.
Аналіз реєстраційного коду. Отже, код введений і прийняті заходи для того, щоб його було непросто знайти (хоча знайти те його можна, але цей час, навичка ..). Тепер наступний крок - аналіз. Тому відразу рада:
Рада 4. Ні в якому разі не аналізуйте код відразу після його введення.
Чим далі введення коду від його аналізу, тим краще. Найрозумніше - після введення коду подякувати користувача за співпрацю і повідомити, що з часом буде виконана реєстрація програми. А аналіз коду виробити, наприклад, через 1-2 хвилини в абсолютно іншому місці програми.
Рада 5. Не перевіряйте код тільки в одному місці і не пишіть для перевірки функцію.
Досить знайти і відключити цю перевірку, і захист зламаний. Якщо перевірок декілька, вони різні і розподілені за програмою, то злом утруднюється.
Рада 6. Не перевіряйте пароль одним алгоритмом.
Рекомендується розробити 2-3 алгоритми перевірки, наприклад 1-2 цифри повинні ділитися на 3, а 3-7 накладених по якому-небудь алгоритму на ім'я користувача повинні дати в сумі 4. Ці дві перевірки здійснюємо в різних місцях з досить великим тимчасовим рознесенням - зламавши перший метод хакер не здогадуватиметься про існування ще декількох, які проявляться з часом.
Рада 7. Ні в якому разі не робіть ніяких дій після перевірки. З невідомої причини більшість програм виглядають приблизно так
IF NOT(SuperRegCodeCheck) then
Begin
ShowMessage('Невірний код, подальша робота неможлива');
halt;
end;
У прикладі деяка процедура перевіряє код і при неспівпаданні робить активні дії, які буквально кричать "ось вона де захист !"!. Найкращий крок, - почекати день-два (чи хоч би хвилин 15). Причому усі дії з перевірки слід якнайдалі віднести від видачі повідомлень і інших дій, що робляться при виявленні неправильного коду.
Рада 8. Відволікаючі маневри.
Окрім реальних функцій перевірки коду дуже непогано зробити пару бутафорських - вони викликатимуться після введення коду, проводитимуть активні маніпуляції з введеним значенням, видавати повідомлення про некоректність введеного коду .. - тобто відволікати увагу від реальної перевірки.
Рада 9. Не зберігаєте результатів перевірки в змінній і не використовуйте її для явного обмеження функцій незареєстрованої програми.
Класичний приклад порушення цього правила
IF NOT(LegalCopy) then
ShowMessage('Збереження працює тільки в зареєстрованій версії')
else
SaveFile;
Таким чином елементарний аналіз показує, що змінна LegalCopy зберігає результат перевірки і поставивши на неї точку останову можна виловити саму перевірку. Відредагувавши це значення в пам'яті можна тимчасово зробити копію "зареєстрованою", а установка точки останову на зміну цієї змінної виведе на місце її перевірки. Та і злом зводиться до того, що функція перевірки коду урізається до двох команд асемблера :
MOV [адреса LegalCopy], 1
RET
Рада 10. (витікає з 9) Не зберігаєте результатів перевірки на диску або в реєстрі.
Типова помилка - з'ясували, що копія зареєстрована і зробили де-небудь мітку. Відловити це досить просто (див. опис REGMON і FILEMON). Найкращий спосіб - зберегти пароль і ім'я користувача в тому виді, в якому він їх ввів. Потім при кожному запуску програми перевіряти коректність цього коду, але не забуваючи Раду _11. Нічого не перевіряйте відразу при запуску додатка або відразу після прочитування збереженого імені або коду. Пам'ятаєте, що прочитування коду і його введення у вікні реєстрації ідентичні по заходах захисту - дублювання в різних областях пам'яті, шифрування ..
Висновки: ми влаштуємо перевірку коду в декількох місцях програми, при цьому застосуємо декілька алгоритмів перевірки, не використовуватимемо API.Крім того, варто виконати декілька відволікаючих маневрів.
-
CRC - контрольні суми. Будь-який файл, рядок або блок даних можна захистити контрольною сумою, яку потім можна розрахувати і порівняти з еталоном. При порівнянні з еталоном звичайно слідує звістка обережно - см перші 11 рад. Отже, рада 12. Захищайте програми і дані контрольними сумами. Це допоможе не лише від злому, але і захистить програми від вірусу або впровадження Трої.
-
Застосовуйте шифрування програм і даних. Дуже непогано стискувати програму і дані. Я, наприклад, розробив свій власний архіватор - RAR -у і ZIP -у він конкуренції не складе, але стислі їм дані розтискати дуже непросто, доведеться неабияк повозитися. Та і змінити їх проблематично - доведеться розтискати, змінити і стискувати.
-
Вилов покрокової відладки програми. Існує багато способів, я свого часу провів ціле дослідження цього питання під DOS, назбирав і придумав не менше 20 методів, але вони мало прийнятні під Windows. Найпростіший і надійніший спосіб - таймер. При роботі програми періодично фіксуємо системний час і розраховуємо час роботи фрагментів коду між ними. І якщо 200-400 команд процесора працюють 2-3 хвилини, то тут є над чим замислитися.
Рада 13. Не визначайте дату і час стандартними способом !! Придумайте що-небудь оригінальне.
Рада 14.Не варто зберігати що-небудь секретне у файлах або реєстрі. Робота з файлами або реєстром може бути детально запротокольована і проаналізована, і усе таємне стане явним.
Рада 15.Не зберігаєте нічого важливого відкритим текстом, особливо повідомлення типу "Це незареєстрована версія ."., "Введений пароль не вірний .".Вони для хакера - як для бика червона ганчірка, і дійсно - знаходимо таке повідомлення, ставимо точку останову на звернення до ділянки пам'яті з цим повідомленням і дістаємо можливість упіймати момент видачі цього повідомлення.
Захист "обмеження часу роботи" полягає в тому, що програма яким чином фіксує момент свого першого запуску і працює встановлений час (звичайно 20-30 днів). Після закінчення цього терміну програма відмовляється запускатися. Як перевірити поточну дату я вже десь тут писав - нестандартним способом, наприклад по даті на файлах реєстру або новоствореному своєму файлі. Увесь фокус в іншому - як зафіксувати на комп'ютері дату першого запуску (природно так, щоб знищення програми і її повторна установка не давали ефекту). Використання "секретних" файлів в системних теках або зміни в існуючих файлах легко відловити за допомогою FILEMON. Реєстр те ж відпадає із-за REGMON. Інші методи (типу запису у ВООТ сектор ..) теж неприйнятні - не ті часи, по Windows усе це не пройде. Найоригінальніше (на мій погляд) прошити дату в саму програму і постійно оновлювати її на своєму сайті (природно, автоматично). Таким чином відлік неявно йде від моменту скачування програми з сайту. Є тут правда і мінус - після завершення терміну можна повторно викачати цю програму і отримати ще 15-20 днів .. . З іншого боку це оригінально - користувачеві рано чи пізно набридне викачувати цю програму і він або відмовиться від неї, або купить. Але при цьому варто пам'ятати, що програму можна викачати кілька разів і порівняти варіанти, виявивши, де лежить дата. Тому варто потурбуватися про те, щоб змінився майже увесь файл (наприклад, змінити пару опцій компілятора)