Введение в крэкинг с нуля, используя OllyDbg - Глава 11

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Хорошо, нам осталось рассмотреть процессорные точки останова (hardware breakpoints), условные точки останова и message breakpoints, и после этого мы закончим с этой темой.

ПРОЦЕССОРНЫЕ ТОЧКИ ОСТАНОВА

Процессорные точки останова (hardware breakpoints, HBP) - это возможность, предоставляемая процессором. Как это устроено на самом деле, я не знаю, но тем не менее мы можем устанавливать их, чтобы программа, когда их встречает, останавливалась и передавала управление.

Мы можем установить до 4 четырёх HBP, на пятый Ollydbg попросит нас указать, какой из четырёх уже установленных убрать.

Как обычно, для практики будем использовать крэкми CrueHead'а.

0fc0278ec09154f223bd7d1a92a1e3b7.png

Есть три возможности: HBP ON EXECUTION, ON WRITE и ON ACCESS.

Установка HBP ON EXECUTION выполняет ту же роль, что и BPX на адрес, но HBP не изменяет код и его сложнее обнаружить, хотя есть программы, которые используют кое-какие приёмы, чтобы сбросить HBP. Эти приёмы и способы противостоять им, мы рассмотрим в следующих главах.

Если хотим установить HBP ON EXECUTION на 401013, отмечаем строку, кликаем на правую кнопку мыши и выбираем BREAKPOINT-HARDWARE ON EXECUTION.

9d56ee9f60b064b5b9b53931bdfccb99.png

Также можем написать в коммандной строке:

811f868cf60d645e12347bd05f6e8a5e.png

После этого HBP установлен.

У Ollydbg есть специальное окно, с помощью которого мы можем просмотреть и управлять HBP'ами. Чтобы открыть его, идём в DEBUG-HARDWARE BREAKPOINTS.

74735efb3d36802224329b60640f0451.png

6a187acd17c6d5cc83b26756151a051a.png

Здесь мы видим окошко с HBP, и если нажмём FOLLOW, мы окажем в листинге на той строке, где он был установлен. С помощью DELETE мы можем его удалить.

Теперь нажмём F9 для того, чтобы начать выполнение программы.

137768e88f863d7fc57d9b490940cb39.png

И остановимся на 401013.

Как видим, он ведёт себя как обычный BPX, если же сделаем то же, что делали и с BPX - напишем MOV EAX, DWORD PTR DS:[401013] и запустим, то увидим, что код не изменился.

2273bf353ecbf0882859eb80f3c1141a.png

2c7fa67ca398c985fd992306db92dedb.png

Изменим EIP на 401000 с помощью NEW ORIGIN HERE и нажмём F7.

f5529aae0d414df6cf3fe243c326428f.png

Видим, что в EAX содержатся E8 A6 04 00 (в обратной форме, поэтому мы видим 00004A6E8), то есть никаких изменений в коде не было.

Если мы перезапустим Ollydbg, то увидим, что HBP остался установленным.

11084c881ec022069db6fbe2cf6a3a06.png

Убираем его и устанавливаем HBP на MessageBoxA таким же образом, как и BPX.

8ebc5217c2d04a4ab4507d12241d3fc7.png

Теперь смотрим список HBP.

252957945b570e2199350f688e5b061d.png

Не будем повторять снова, но знаем, что если запустим программу и введём юзера и пароль, и мы согласимся, то выполнение остановится на API MessageBoxA, т.е. примерно так же, как если бы мы использовали обычный BPX.

HBP ON ACCESS и ON WRITE могут охватывать только 1, 2 или 4 байта, если же мы выберем в DUMP зону большего размера, то будут иметь значение только первые четыре байта.

Сбросим все HBP, установленные нами ранее, и попытаемся установить HBP ON ACCESS на адрес 4020CA.

Посмотрим в DUMP'е, что находится по этому адресу.

31831611e8b1df1cd9917d4c9f14553c.png

c33b3a1688ac3be9fd18d6c85bafc26f.png

А теперь отметим первые 4 байта.

119d59d9e90f813b61df851fbb2b0b0e.png

Нажимаем правую кнопку мыши.

036066977a8d90535ac02a41adef9b1f.png

Видим, что для отмеченной нами зоны было предложен HBP на байт или два байта (WORD), выбор четырёх байтов предлагается только для адресов, которые кратны 4. В данном случае это условие не соблюдается.

Проделаем ту же операцию для следующего байта и выберем HARDWARE ON ACCESS, и теперь есть только возможность выбора BYTE.

d01c90d8220e407b3762a560906dcc25.png

А на следующем появилась, наконец-то, опция DWORD, то есть HBP на четыре байта.

3b01ccf8d87c3a8957614e20dc4c75c1.png

Идея в том, что если нам нужно контролировать сохранение или чтение по адресу 4020CA, то для этой цели достаточно поставить HBP на один байт.

Возвратимся к 4020CA и поставим HBP ON ACCESS – BYTE.

ee50e865669416c7efef92d13b87f8f8.png

Видим, что поставленный нами HBP в списке имеет разме 1, т.е. байт (BYTE).

bb4cbcec51f0cac48765744044d84dea.png

Делаем RUN.

940dacb0e58d28ecc7abf2ba3e9f2a25.png

cdf03bc8096d6b127aecb493e96486a9.png

Здесь OLLY говорит нам, что сработал HBP 1, т.е. тот, который идёт первым в списке HBP.

c3ade4097d22c690d3507886a44f4e6a.png

Видим, что выполнение программы прекращается на строке, следующей за той, где производилось сохранение или чтение. Это верно как для HBP ON ACCESS, так и для ON WRITE - инструкция, на которой срабатывает HBP, выполняется, а программа останавливается на следующей.

bcef27453ced85f0cd9e59757fd4768b.png

Как вы можете видеть, отличие от MEMORY BREAKPOINT заключается в том, что программа остановилась бы на 401007 - непосредственно на той инструкции, которая вызвала срабатывание точки останова.

Как вы можете догадаться, HBP ON WRITE срабатывает, когда происходить сохранение, а не чтение, и остановка программы происходит на инструкции, следующей за той, которая вызвала срабатывание HBP.

УСЛОВНЫЕ ТОЧКИ ОСТАНОВА

В действительности это вариант обычных BPX, отличающийся тем, что при активации такого BPX OllyDbg проверяет, верно ли некое условие, и если да, то останавливает выполнение программы, а если нет, то продолжает выполнение программы, как будто BP не существует.

Рассмотрим пример.

0cd7648e91ed1a534089d4ae589732c4.png

Сбросим всё, что мы делали ранее, и установим BREAKPOINT CONDICIONAL на 40100E, для чего выделим строку, нажмём правую кнопку мыши и выберем BREAKPOINT CONDICIONAL.

99942fb760a9c9cc66931a499f6d9581.png

Открывается окошко, в котором нужно задать условие.

1864c9c2abec0b9191ff35ea30d29031.png

Например, если хотим задать, чтобы останов происходил, когда EAX равен 400000, то условие должно быть таким: "EAX==400000".

7c851c33f3c914c6357ee5291ea0ff55.png

В хелпах, прилагаемых к OllyDbg, написано, какие символы мы можем использовать и каким условиям они соответствуют.

76b4f95e5b9636c408e703a3a40f6986.png

Видим, что в случае с BPX CONDICIONAL используется розовый цвет. Нажимаем F9:

dce8d69a4eec3c81fc5bb061a1f9d4a8.png

Видим, что произошёл останов, и OllyDbg нам сообщает:

fac8e23cc3f09172ff40da51f21aeb0c.png

Раз EAX равен 400000, значит сработало заданное условие.

52961a234d4d6a5cba43f58e33228e79.png

Начнём выполнение заново, сотрём BPX CONDICIONAL и поставим другой, где, например, EAX==500000.

f63cda1dae94b378165657e384ad51f6.png

И сделаем RUN.

Видим, что крэкми выполнился и останова не произошло, т.к. EAX всегда был равен 400000 и условие не выполнялось.

Если откроем HELP-CONTENTS.

2176528a961a42d34ae12b13db6cbd9e.png

b91bc6d0a510ca3ff713252b3c66075d.png

Вот BREAKPOINTS и место, где объясняются выражения:

73b8186d476d0e296efe3b5daad22fd8.png

Также в хелпе есть примеры выражений, которые можно использовать для условий.

d07aa35721f1de71eff4ebd6238c6df3.png

УСЛОВНЫЕ ТОЧКИ ОСТАНОВА С ЛОГИРОВАНИЕМ

Это условный BPX, такой же как и предыдущий, только в этом случае мы можем указать, чтобы все точные значения сохранялись при прохождении точки останова. Там есть много опций, и мы продемонстрируем применение этого BPX на примере одного API, который встречается в разных местах, и нам хочется, чтобы сохранялись данные, передающиеся ему.

Установим BPX CONDICIONAL LOG на адрес, где находится API, перезапустив предварительно OllyDbg.

Идем к нужному адресу, где находится api, и уже знаем, как это сделать: CLICK DERECHO-GOTO EXPRESSION.

8ff459abddbc272e4147317fff79442d.png

55b78a2affd7c713a4abee11f188a337.png

Находясь здесь, нажимаем CLICK DERECHO- BREAKPOINT- CONDICIONAL LOG.

a82a414151ddd11ebd60f8d86f6e1d3d.png

Видим окошко с множеством опций.

533592bf287934965570eac02151a7c2.png

В данном случае нам нужно только, чтобы сохранялись требуемые нам данные.

bc7ede95a0e7c918cc1686325c11031d.png

Так как мы не хотим, чтобы происходил останов, то не задаём никакого условия, а в опции PAUSE PROGRAM выбираем, чтобы этого не происходило, то есть отмечаем NEVER. Потом в LOG VALUE OF EXPRESSION можем сделать так, чтобы сохранялось значение [esp], которое мы написали в поле EXPRESSION, в котором, как мы знаем, будет адрес возврата в основное тело программы после выполнения api, то есть самое верхнее значение стека, поэтому во второй строке LOG VALUE OF EXPRESSION выбираем ALWAYS, то есть логировать всегда В третьей строке находится опция, задающая хотим ли мы логировать аргументы/параметры функции/api, и поскольку их немного, можем поставить ALWAYS.

Идём в окно LOG или L.

c635fd34714d96e9e6d0d675e05de3d5.png

И очищаем его, чтобы ясно видеть, что сохраняет программа. Кликаем CLICK DERECHO-CLEAR WINDOW.

058f65f3d6285a2f99b98217be5afdcf.png

Видим, что есть опция, позволяющая сохранять лог в текстовый файл, если это необходимо.

124598556116c76f340b3c613350d01c.png

Теперь запускаем выполнение программы с помощью F9.

Идём в окошко крэкми и пока в LOG’е ничего нет, так как заданное нами api не вызывалось.

Идём в REGISTER, где можем задать имя и пароль пользователя.

6e2e8a685d32f71df332901a4a431f75.png

Когда нажимаем OK

3413a8fa3cb39a5da22528996ecb8700.png

a6509688157c2e126ebaa183aa04c373.png

Видим, что в окошке лога отобразилась информация о MessageBoxA, самое верхнее значение стека (которое равно 40137D и является адресом возврата из api), а затем параметры api, в данном случае это адрес, из которого оно было вызвано, текст, заголовок и т.п.

В данном случае нам отобразилась информация только об одном вызове, но если api вызывается, скажем, 100 раз, то можем сохранять лог в текстовый файл. Если же нам нужно, чтобы отображались только некоторые из этих вызовов, то можем задать определённое условие.

Если у нас есть список с информацией о 100 различных вызовах данного api, выполненных программой, то можно задать какие-нибудь данные в поле условия, например, адрес возврата. В этом случае из всех 100 случаев вызова отобразятся только те, которые возвращаются на 40137D, а остальные нет.

Для этого перегрузим крэкми, снова найдём api и установим на неё BPX CONDICIONAL LOG.

9ee34522060a6dfa1bbcca0a033a82c5.png

Изменим опции, так чтобы точка останова срабатывала только тогда, когда выполняется условие и зададим его, чтобы проверялось, равен ли [esp] 40137D.

Запускаем программу, и когда появится окошко регистрации, введём имя пользователя ‘ricnar456’ и пароль ‘989898’.

b9906a6d68227461a520fd72bd0ec691.png

Помните, что когда вводится имя пользователя, в котором есть цифры, messageboxa вызывается 2 раза? Нажимаем ОК.

8357c7169f98c021cf472c969ad276ee.png

Видим, что на первый MessageBoxA Олли никак не отреагировала. В логах показано, что адрес возврата был равен 4013C1, поэтому условие не выполнялось.

218ab48c7e26b34e34b0dc9ea915d0ff.png

Когда нажимаем кнопку OK

8641f2d397088e1bfa08210b51ee09ca.png

Это второй раз, когда вызывается api. Здесь условие выполняется и срабатывает точка останова.

e050f0b4a955789d7418c42a48ede63d.png

Видим, что верхнее элемент стека содержит значение 40137d, которое активирует BPX CONDICIONAL LOG.

fe1cc17b6dfd462c034ed49bd277d9e9.png

В обоих случая OllyDbg сохранил информацию об обоих вызовах.

1fb4731b1d08ca0ce0cc91bb31bdd4fa.png

Во втором случае адресом возврата было 40137D, и мы видим, что в этот раз условная точка останова сработала.

f666e006820068bf2191062bd732a88e.png

Ок, думаю, что этого достаточно, чтобы вам в чём попрактиковаться некоторое время. Ещё остались MESSAGE BREAKPOINTS, но я не хочу вас уморить, так что ждите 12 часть, а после того, как рассмотрим последний вид точек останова, обещаю, что продолжим крэкать по-немногу, так, чтобы не заскучать.
 

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя