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

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
В этой главе мы продолжим изучение противотладочных приёмов, а конкретнее – рассмотрим сразу два одновременно, так как они работают в паре. В этом туториале мы будем использовать пропатченный в 21-ой главе OllyDbg, который называется NVP11, с плагином HideDebugger, сконфигурированным следующим образом.

7f3789ba4440e9523ad96f1fe84eb2de.png

Здесь видим, что среди настроек есть опция под названием UNHANDLED EXCEPTION TRICKS. Этот противоотладочный приём мы и будем изучать. Он работает совместно с другим приёмом, который можно использовать и отдельно – это API-функция ZwQueryInformationProcess, применяющаяся для обнаружения отладчика.

Используем крэкми, который идёт в файле
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
. Как вы уже могли догадаться, если включить вышеозначенную опцию, то он выполнится без каких-либо проблем, но нам нужно исследовать, как работают оба метода.

Сразу скажу, что сейчас мы не будем решать этот крэкми, а займёмся гораздо позже. Чтобы найти для него правильный серийный номер, нужно использовать метод «грубой силы», который будет рассмотривать в свой черёд, а пока что просто запустим этот крэкми в OllyDbg и изучим вышеупомянутый метод защиты.

8b9ea8fdbb39fdb9d471c553fd1b2cb9.png

Загружаем крэкми в Nvp11 (пропатченный OllyDbg) и проверяем настройки плагина HideDebugger, которые должны соответствовать нижеприведённой картинке (отмечены все исключения).

9b42293cc762d369fe0227b8d6fb7fc3.png

Делаем RUN.

67968bb580fb75a8c8c19a3361c282db.png

И появляется главное окно крэкми, а защита сработает после него.

Вводим неправильный серийный номер и нажимаем "check".

73993b5d1168c79fd5f93fe649317ff3.png

Нам говорят, что невозможно обработать исключение, и программа закроется, если сделаем RUN.

f07508cc75c4bba185bdbcfd1d110924.png

Ок, если бы мы запустили крэкми не из-под OllyDbg, то крэкми бы не закрылся, а продолжил бы работать и дал возможность попробовать другие серийные номера.

Ладно, перезагрузим крэкми и посмотрим, какие API-функции используются.

f29ed4c9947408c2be7badca705fce4d.png

4cb756288e76f298c4455e9b38bc43c0.png

Помните, что у плагина HideDebugger есть настройка для защиты от этого приёма.

edd4c2379e28e5041b1162ff2f139dea.png

Но прежде, чем её включать, мы должны посмотреть своими глазами, как работает этот метод.

Смотрим описание SetUnhandledExceptionFilter.

2e4b8c8ee5acfb8f09e0447b2469622e.png

Видим, что единственным параметром функции является адрес, откуда начинать выполнение, когда программа вызывает исключение, всегда когда программа НЕ НАХОДИТСЯ ПОД ОТЛАДКОЙ, хе-хе, что можно использовать для определения, отлаживается ли программа или нет, и не использовать ZwQueryInformationProcess.

Вернёмся к программе, как раз к тому месту, где вызывается эта API-функция.

856bcc1f3ff23ad43dc5eebc61191578.png

Как видим, один-единственный параметр - адрес, откуда продолжается выполнение, когда программы вызывает исключение, если она не находится под отладкой, хе-хе. В этом случае управление перейдёт по адресу 401108, в противном случае, если программа отлаживается, по адресу 401108.

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

Ладно, установим BP на обе функции: SetUnhandledExceptionFilter и UnhandledExceptionFilter, так как они - сёстры и работают вместе.

5a5825640e710f6f2004dede9ef85b1e.png

c09fb651dcd25704a7d4e53216566ae5.png

А теперь делаем RUN.

1c2704a8d9c98e7f6d72aa91a02b3e26.png

Программа должна продолжить выполнение по заданному адресу, когда возникнет исключение.

22bf173c2a11e902c9aa42fc9efbb5a2.png

Как видим, адрес - 401108, установим на него BP.

302493cb190922f030dcdde3d761ec84.png

Теперь делаем RUN и наблюдаем за вызывающейся из DLL-библиотек функцией SetUnhandledExceptionFilter.

b299488dafa5987eda7ddb1193c02cb8.png

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

b85b1985071eeb06a5a85fd6455cb9ac.png

Теперь введём неправильный серийный номер, нажмём CHECK и остановимся на другой API-функции в UnhandledExceptionFilter, так как возникло исключение, которое, разумеется, было сгенерировано программой нарочно, чтобы сюда попасть, и эта функция определит, отлаживается программа или нет, и таким образом управление перейдёт или по адресу 401108, или в мусорную корзину, хе-хе.

781c205ea6d6c97dbc2b00909c7b1e9b.png

0960ea6abae679c13625678469365995.png

Эта API-функция проверяет, не отлаживается ли процесс, и осуществляет переход в 401108. Оттрасируем функцию с помощью F8, чтобы узнать, как она определяет отладчик.

89fcf3e5a583d2948fb7180b8dc81f28.png

Прибыли, здесь используется второй антиотдочный приём, который мы сегодня рассмотрим. Его можно применять отдельно, и заключается он в вызыве ZwQueryInformationProcess напрямую с параметром INFO CLASS=7.

400aa59c875074832a927723bbc5f848.png

Эта API-функция возвращает информацию о выполняющемся процессе и с параметром INFOCLASS=7 возвращает через буфер информацию о том, отлаживается ли процесс или нет.

Смотрим, что находится в буфере через DUMP.

29723ea7a953711de5fb56320bf8d0d4.png

5f5c6e8078927eaafc869d93111ab904.png

Это буфер, видим, что его размер равен 4 байтам, и эта API-функция возвращает FFFFFFFF, если процесс находится под отладкой, и ноль, если нет. С помощью F8 оттрасируем дальше, чтобы посмотреть, что будет возвращено в этот раз.

2f22fe7bd627b3a4acfbe539463e7985.png

Видим, что было возвращено значение FFFFFFFF, то есть процесс отлаживается, мой друг, хе-хе.

44ad7b48a7cab62fc79090f71820a4b2.png

Видим, что затем проводится сравнение, равно ли это значение нулю или нет, так как EDI равно нулю.

2d9aa8b5677dfcdef0912e8931275181.png

В данном случае перехода не происходит.

01c399ba3a859a0121853a15507a2d4b.png

Если буфер не равен нулю, перехода не происходит и программа завершается.

cd87a8adcf3f7913ba2be8e3a2be1a48.png

Видим, что выдаётся ошибка, а затем приложение завершается.

Теперь перезапустим его и повторим весь процесс, но на этот раз изменим результат, возвращаемый ZwQueryInformationProcess.

Когда прибудем в

d6d6e45c71137c4805df957f69a9da75.png

Посмотрим буфер через DUMP.

fd2c4f894308050f8873f2f508f24b44.png

Пройдём по API-функции с помощью F8.

c7d42c769e15bfcdbbfc2560fdca733e.png

В буфере лежит то же самое, что и в прошлый раз - FFFFFFF, так как программа под отладкой. Изменим на ноль.

c6ec946dfc0d6c78c76e76956c19d7eb.png

Меняем всё на нули.

f3671ec28a43a7790682aa136ad2a88f.png

cadc37d5a760596045fc68fb71080cb4.png

Доходим до сравнения.

b5022a8d7bba2c37242fc10109340ad9.png

Так как оба операнда равны нулю

78160e78b7e419cc32e89cdb7e4b19c1.png

Теперь переход сработает.

eec1797354ff91809118726126acaf52.png

И если сделаем RUN.

095996699f4c2cde4203b3558f7e791e.png

В этот раз прибываем в 401108 и ниже видим интересующее нас место.

0ad7e783286d9a779c61991190662056.png

И окошко с сообщением о решении крэкми, можем проверить.

98d42d85675440f63bb316c3e9bfeb8b.png

Если изменить переход так, чтобы он не срабатывал, то будет показано сообщение о том, что крэкми был решён.

2609e549c17dc280312fa3e939dd77a5.png

Теперь делаем RUN.

714eccbf47a884426b4cd9c90bccde37.png

Ок, как уже говорилось, всего этого можно избежать, если включим в плагине HideDebugger настройку UnhandledExceptionTricks, тогда этот крэкми будет работать без каких-либо проблем.

Осталось рассмотреть ещё один вопрос - каки избежать обнаружения с помощью API-функции ZwQueryInformationProcess, когда она применяется напряму, а не через UnhandledExceptionFilter.

Конечно, обойти её вручную несложно - достаточно изменить на ноль значение, возвращаемое ею, но существует ли плагин, который позволяет сделать это автоматически?

Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!


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

19f58886dc15b5970819af0c49de8aec.png

8c788c24d682df25ca1171095a10ac46.png

Видим, что здесь есть настройки, которых нет в HideDebugger, так что они могут дополнять друг друга, но главное, не забудьте отметить "Auto Run HideOD", чтобы вам не приходилось нажимать "HIDE" каждый раз, когда вы запускаете OllyDbg.

f9e964622521519e1387af4af433ba35.png

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

Мы научились обходить защиту с помощью UnhandledExceptionFilter, обнаруживающую защиту посредством ZwQueryInformationProcess. В этом нам помог плагин HideOD, который в сочетании с HideDebugger делает нашу пропатченную Олли чуть ли не крепостью, хе-хе.
 

О нас

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

    Dark-Time 2015 - 2022

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

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

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