Введення в крекінг з нуля, використовуючи OllyDbg - Глава 11 [Рікардо Нарваха, пров. Aquila]
Добре, нам залишилося розглянути процесорні точки зупинки (hardware breakpoints), умовні точки зупину і message breakpoints. і після цього ми закінчимо з цією темою.
Процесорного точки зупину
Процесорні точки зупинки (hardware breakpoints, HBP) - це можливість, яку надає процесором. Як це влаштовано насправді, я не знаю, але тим не менше ми можемо встановлювати їх, щоб програма, коли їх зустрічає, зупинялася і передавала управління.
Ми можемо встановити до 4 чотирьох HBP. на п'ятий Ollydbg попросить нас вказати, який з чотирьох вже встановлених прибрати.
Як завжди, для практики будемо використовувати крекмі CrueHead'а.
Є три можливості: HBP ON EXECUTION. ON WRITE і ON ACCESS.
Якщо хочемо встановити HBP ON EXECUTION на 401013. відзначаємо рядок, натискаємо на праву кнопку миші і вибираємо BREAKPOINT-HARDWARE ON EXECUTION.
Також можемо написати в командному рядку:
Після цього HBP встановлений.
Тут ми бачимо віконце з HBP. і якщо натиснемо FOLLOW. ми надамо в лістингу на тому рядку, де він був встановлений. За допомогою DELETE ми можемо його видалити.
Тепер натиснемо F9 для того, щоб почати виконання програми.
І зупинимося на 401013.
Як бачимо, він поводиться як звичайний BPX. якщо ж зробимо те ж, що робили і з BPX - напишемо MOV EAX, DWORD PTR DS: [401013] і запустимо, то побачимо, що код не змінився.
Змінимо EIP на 401000 за допомогою NEW ORIGIN HERE і натиснемо F7.
Бачимо, що в EAX містяться E8 A6 04 00 (в зворотній формі, тому ми бачимо 00004A6E8), тобто ніяких змін в коді не було.
Якщо ми перезапустити Ollydbg, то побачимо, що HBP залишився встановленим.
Прибираємо його і встановлюємо HBP на MessageBoxA таким же чином, як і BPX.
Тепер дивимося список HBP.
Не будемо повторювати знову, але знаємо, що якщо запустимо програму і введемо користувача і пароль, і ми погодимося, то виконання зупиниться на API MessageBoxA. тобто приблизно так само, як якби ми використовували звичайний BPX.
HBP ON ACCESS і ON WRITE можуть охоплювати тільки 1, 2 або 4 байти, якщо ж ми виберемо в DUMP зону більшого розміру, то матимуть значення тільки перші чотири байти.
А тепер відзначимо перші 4 байта.
Натискаємо праву кнопку миші.
Проробимо ту ж операцію для наступного байта і виберемо HARDWARE ON ACCESS. і тепер є тільки можливість вибору BYTE.
А на наступному з'явилася, нарешті, опція DWORD. тобто HBP на чотири байти.
Повернемося до 4020CA і поставимо HBP ON ACCESS - BYTE.
Бачимо, що поставлений нами HBP в списку має розмір 1, тобто байт (BYTE).
Тут OLLY говорить нам, що спрацював HBP1. тобто той, який йде першим у списку HBP.
Бачимо, що виконання програми припиняється на рядку, що відбувається після тієї, де вироблялося збереження або читання. Це вірно як для HBP ON ACCESS. так і для ON WRITE - інструкція, на якій спрацьовує HBP. виконується, а програма зупиняється на наступній.
Як ви можете бачити, відміну від MEMORY BREAKPOINT полягає в тому, що програма зупинилася б на 401 007 - безпосередньо на тій інструкції, яка викликала спрацьовування точки зупину.
Як ви можете здогадатися, HBP ON WRITE спрацьовує, коли відбуватиметься збереження, а не читання, і зупинка програми відбувається на інструкції, наступної за тією, яка викликала спрацьовування HBP.
Умовні точки зупину
Насправді це варіант звичайних BPX. відрізняється тим, що при активації такого BPX OllyDbg перевіряє, чи правильно якесь умова, і якщо так, то зупиняє виконання програми, а якщо немає, то продовжує виконання програми, як ніби BP не існує.
Скинемо все, що ми робили раніше, і встановимо BREAKPOINT CONDI T IONAL на 40100E. для чого виділимо рядок, натиснемо праву кнопку миші і виберемо BREAKPOINT CONDI T IONAL.
Відкривається віконце, в якому потрібно задати умову.
Наприклад, якщо хочемо задати, щоб останов відбувався, коли EAX дорівнює 400000. то умова має бути таким: "EAX == 400000".
У Хелп, які додаються до OllyDbg, написано, які символи ми можемо використовувати і яким умовам вони відповідають.
Бачимо, що у випадку з BPX CONDI T IONAL використовується рожевий колір. Натискаємо F9:
Бачимо, що стався останов, і OllyDbg нам повідомляє:
Раз EAX дорівнює 400000. значить спрацювало задана умова.
Почнемо виконання заново, зітремо BPX CONDI T IONAL і поставимо інший, де, наприклад, EAX == 500000.
Бачимо, що крекмі виконався і зупинки не відбулося, тому що EAX завжди дорівнював 400000 і умова не виконувалася.
Якщо відкриємо HELP-CONTENTS.
Ось BREAKPOINTS і місце, де пояснюються вирази:
Також в хелпе є приклади виразів, які можна використовувати для умов.
Умовні точки зупину З логування
Це умовний BPX. такий же як і попередній, тільки в цьому випадку ми можемо вказати, щоб всі точні значення зберігалися при проходженні точки зупину. Там є багато опцій, і ми продемонструємо застосування цього BPX на прикладі одного API, який зустрічається в різних місцях, і нам хочеться, щоб зберігалися дані, що передаються йому.
Перебуваючи тут, натискаємо CLICK DERECHO- BREAKPOINT- CONDITIONAL LOG.
Бачимо віконце з безліччю опцій.
В даному випадку нам потрібно тільки, щоб зберігалися необхідні нам дані.
Йдемо у вікно LOG або L.
І очищаємо його, щоб ясно бачити, що зберігає програма. Кількома CLICK DERECHO-CLEAR WINDOW.
Бачимо, що є опція, що дозволяє зберігати лог в текстовий файл, якщо це необхідно.
Тепер запускаємо виконання програми за допомогою F9.
Йдемо в віконце крекмі і поки в LOG'е нічого немає, так як заданий нами api створювалося.
Йдемо в REGISTER. де можемо поставити ім'я і пароль користувача.
Коли натискаємо OK.
В даному випадку нам відобразилася інформація тільки про одне виклику, але якщо api викликається, скажімо, 100 раз, то можемо зберігати лог в текстовий файл. Якщо ж нам потрібно, щоб відображалися тільки деякі з цих викликів, то можемо поставити певну умову.
Для цього перевантажимо крекмі, знову знайдемо api і встановимо на неї BPX CONDITIONAL LOG.
Змінимо опції, так щоб точка зупинки спрацьовувала тільки тоді, коли виконується умова і поставимо його, щоб перевірялося, дорівнює чи [esp] 40137D.
Запускаємо програму, і коли з'явиться віконце реєстрації, введемо ім'я користувача 'ricnar456' і пароль '989898'.
Пам'ятайте, що коли вводиться ім'я користувача, в якому є цифри, messageboxa викликається 2 рази? Натискаємо ОК.
Коли натискаємо кнопку OK
Це другий раз, коли викликається api. Тут умова виконується і спрацьовує точка зупинки.
Бачимо, що верхн ий елемент стека містить значення 40137d. яке активує BPX CONDITIONAL LOG.
В обох випадках OllyDbg зберіг інформацію про обох виклики.
Ок, думаю, що цього достатньо, щоб вам в чому попрактикуватися деякий час. Ще залишилися MESSAGE BREAKPOINTS. але я не хочу вас заморити, так що чекайте 12 частина, а після того, як розглянемо останній вид точок зупину, обіцяю, що продовжимо крекать по-немногу, так, щоб не нудьгувати.
[C] Рікардо Нарваха, пров. Aquila