Обнаружение OllyDbg по фотографии процессов, по классу окна. Крэкинг ч.21

Обсудить статью на форуме


Массу свежих 2020 года крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.


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

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

Откроем крэкми в оригинальном OllyDbg, не переименованном, потому что также будем изучать разновидность метода, применённого в 20-й главе, и поэтому необходимо, чтобы файл OllyDbg назывался ollydbg.exe. Тогда защита сработает, и мы сможем её изучить.

После того, как загрузили его в OllyDbg, настроим HideDebugger 1.23f против использования программой API-функции IsDebuggerPresent.

Взлом программ отладчиком OllyDbg

Посмотрим текущую конфигурацию плагина HideDebugger:

Взлом программ отладчиком OllyDbg

Пусть он защищает только от IsDebuggerPresent. Также откроем список процессов и убедимся, что используем непереименованный файл, то есть имя процесса ‘OLLYDBG.exe’.

Взлом программ отладчиком OllyDbg

Ок, возвращаемся к buggers3. Посмотрим, какие API-функции он использует.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Опа! Единственная функция в списке – это ExitProcess, всё остальное грузится через GetProcAddress, но и сама она в списке не присутствует.

Взлом программ отладчиком OllyDbg

Поставим BP, и что будет, если сделаем RUN?

Взлом программ отладчиком OllyDbg

Видим загружающиеся API-функции, конечно, если находим такую, что нам интересна, идём до RET, чтобы узнать её адрес, и также можем сделать BP EAX, так как именно в EAX будет находится возвращаемый GetProcAddress адрес.

В данном случае ничего интересного нет, поэтому продолжаем, нажав F9.

Взлом программ отладчиком OllyDbg

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

Ок, делаем EXECUTE TILL RETURN, чтобы дойти до RET.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Доходим до RET, и конечно, в EAX находится адрес загружаемой API-функции на моей машине, в данном случае это CreateToolhelp32SnapShot. Чтобы узнать, когда эта функция используется, установим точку останова с помощью BP EAX.

Взлом программ отладчиком OllyDbg

Здесь осталось установить BP на API-функцию.

Взлом программ отладчиком OllyDbg

Снова делаем RUN, чтобы посмотреть, будут ли загружаться ещё какие-нибудь подозрительные функции.

Взлом программ отладчиком OllyDbg

Хорошо, уже знаем, чем это рискованно – для того, чтобы принудительного завершить процесс нужно получить логический номер (о чём мы говорили в главе 20), а это делается с помощью OpenProcess, так что дойдём до RET и установим BP EAX также и на эту функцию.

Взлом программ отладчиком OllyDbg

Другая подозреваемая в убийстве процессов, хе-хе, пока что таким же образом установим на неё и её сестрёнку Process32Next.

Взлом программ отладчиком OllyDbg

Дальше идёт TerminateProcess.

Взлом программ отладчиком OllyDbg

Мы уже знаем, что эта функция закрывает OllyDbg. Пока что не будем устанавливать BP, но эта функция всегда является кандидатом на точку останова, хе-хе.

Взлом программ отладчиком OllyDbg

Другая преступница, хе-хе, устанавливаем на неё BP вышеописанном способом.

В следующий раз мы останавливаемся на API-функции CreateToolhelp32SnapShot.

Взлом программ отладчиком OllyDbg

Стек:

Взлом программ отладчиком OllyDbg

Посмотрим описание этой функции.

Взлом программ отладчиком OllyDbg

То есть эта функция делает «фотографию» (моментальный снимок) процессов, которые запущены на машине, но возвращается нам только логический номер, и в параметрах нет никакого буфера, где должен быть сохранён список процессов. Выполняем до RET.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

И в EAX получаем логический номер. Взлом программ отладчиком OllyDbg

Который в моём случае равен 2C. Мы можем посмотреть информацию о нём с помощью Олли.

Взлом программ отладчиком OllyDbg

Нажмём кнопку H, что откроет окно логических номеров.

Взлом программ отладчиком OllyDbg

Не слишком понятно, что такое 2C, но ладно, программа получала этот номер, сделаем RUN, чтобы посмотреть, как его получить с его помощью доступ к указанному списку процессов.

Взлом программ отладчиком OllyDbg

Останавливаемся на API-функции Process32First, которая вместе c Process32Next служит для чтения полученного моментального снимка, извлекая информацию о выполняющихся процессах.

Взлом программ отладчиком OllyDbg

Ок, вот описание этой функции.

Взлом программ отладчиком OllyDbg

Здесь говорится, что функция получает информацию о первом процессе, записанном в моментальном снимке, чей логический номер передаётся в первом параметре (в моём случае это 2C). Вторым параметром является адрес буфера, куда собственно помещается информация.

Взлом программ отладчиком OllyDbg

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

Взлом программ отладчиком OllyDbg

Буфер, куда сохраняется информация о первом процессе, виден через DUMP, так что делаем «Execute till RET», чтобы она там появилась.

Взлом программ отладчиком OllyDbg

Видим имя первого процесса, которое всегда будет «SYSTEM PROCESS». Делаем RUN и продолжаем.

Взлом программ отладчиком OllyDbg

Ха-ха, а здесь другой трюк, использующий FindWindowA. Окно OllyDbg относится к одноимённому классу, так что можно искать отладчик по имени окна. В данном случае запрашивается класс окна, являющимся главным по отношению к текущему, которым, очевидно, является OllyDbg.

Класс окна можно узнать с помощью следующей утилиты.

http://www.ricnar456.dyndns.org/HERRAMIENTAS/V-W-X-Y-Z/WindowseGREATIS5setup.exe

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

Взлом программ отладчиком OllyDbg

Видим, что во вкладке «Window» выводится имя окна OllyDbg, а во вкладе «Class» - его класс.

Взлом программ отладчиком OllyDbg

Как видим это OllyDbg.

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

Взлом программ отладчиком OllyDbg

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

Взлом программ отладчиком OllyDbg

Хорошо, доходим до RET в API-функции, чтобы посмотреть, вернёт ли она логический номер окна.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Конечно, он совпадает с тем, который отображается в Windowse.

Ладно, трассируем дальше, чтобы посмотреть, что программа делает с окном.

Взлом программ отладчиком OllyDbg

То есть, сравнивает полученный номер с нулём, и если он ему равен, то значит, нет окна с классом OllyDbg, а значит и такого процесса нет. Если же было возвращено значение отличное от нуля, то значит, существует окно с таким классом, и программа вызывает ExitProcess.

Взлом программ отладчиком OllyDbg

Переход сразу ведёт к выходу программ без отображения каких-либо сообщений.

Взлом программ отладчиком OllyDbg

То есть суть в том, что нам нужно, чтобы FindWindowA вернула в EAX ноль.

Ок, плагин HideDebugger 1.23f позволяет не делать это вручную. Откроем его настройки.

Взлом программ отладчиком OllyDbg

Если отметим вторую опцию, то плагин станет защищать нас от обнаружения с помощью FindWindow и EnumWindows (это другая функция, с помощью которой можно узнать имя окна), но нам нужно научиться избегать этих функции вручную и понимать, как это работает, поэтому пока что галочку ставить не будем, так как надо будет перезапустить OllyDbg, чтобы это оказало необходимый эффект. Сделаем так, чтобы переход, который отправляет нас к функции ExitProcess, не был совершён, и выполнение программы продолжилось.

Взлом программ отладчиком OllyDbg

Кликаем два раза на флаге Z, меняем его значение на 1, после чего JNZ не должен совершить переход.

Взлом программ отладчиком OllyDbg

И правда, JNZ не срабатывает.

Взлом программ отладчиком OllyDbg

И доходим до JMP, перепрыгивающего через вызов ExitProcess.

Взлом программ отладчиком OllyDbg

Ок, продолжаем, мы изучили, как предотвратить приём с FindWindowA, а теперь продолжим изучать метод, использующий имена процессов. Делаем RUN.

Взлом программ отладчиком OllyDbg

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

Делаем EXECUTE TILL RETURN и смотрим, что было сохранено.

Взлом программ отладчиком OllyDbg

Здесь находится имя «System» и его PID, равный 4. Посмотрим список процессов.

Взлом программ отладчиком OllyDbg

Здесь видим, что программа делает с каждым процессом. Трассируем.

Взлом программ отладчиком OllyDbg

Видим, что здесь вызывается API-функция lstrcmpA, с помощью которой сравнивается строка «System», являющейся именем процесса, с «buggers3.exe», т.е. именем процесса самого крэкми. Если они равны, то вызывается MessageBoxA, сообщающий «NOT DEBUGGED». Но в данном случае мы сюда не попадём, так что продолжаем трассировать.

Взлом программ отладчиком OllyDbg

Если строки не равны, то результатом сравнения является FFFFFFFF.

Взлом программ отладчиком OllyDbg

И так как это не ноль, то переходим в 40119f.

Взлом программ отладчиком OllyDbg

Здесь видим насыщенную действием часть программы: сравнивается имя первого процесса с «OLLYDBG.EXE», и если они равны, тогда результатом является ноль и перехода не происходит, в следствии чего вызывается OpenProcess, чтобы узнать логический номер процесса, а потом – TerminateProcess, закрывающий его, как это мы уже видели в главе 20-ой.

Взлом программ отладчиком OllyDbg

Видим, что первый процесс не является OllyDbg.exe, поэтому переходим на Process32Next, чтобы найти второй процесс.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

В то же место сохраняется имя второго процесса. Делаем EXECUTE TILL RETURN.

Взлом программ отладчиком OllyDbg

Второй процесс – это smss.exe, чей PID равен 026C. Заглянем в список процессов.

Взлом программ отладчиком OllyDbg

Вот PID, равный 620 в десятеричной системе, то есть 026C в шестнадцатеричной.

Хорошо, похоже, что все выполняющиеся процессы сравниваются один за другим c «OLLYDBG.EXE». Взлом программ отладчиком OllyDbg

И каждый раз условный переход будет переносить нас на 4011B1, до тех пор, пока не встретиться процесс OLLYDBG.exe. Тогда перехода не произойдёт и Олли будет закрыта, так что если мы заменим JNZ на JMP, то избежим этого.

Взлом программ отладчиком OllyDbg

Теперь убираем все точки останова и делаем RUN.

Взлом программ отладчиком OllyDbg

Таким образом, защита была побеждена. Сейчас мы уже знаем, что плагин HideDebugger позволяет спрятать окно OllyDbg от обнаружения с помощью FindWindowA. Также можно попробовать избежать обнаружения процесса и выполнить программу, используя упомянутый ранее способ переименования OllyDbg в PIRULO.exe.

Откроем PIRULO.exe.

Взлом программ отладчиком OllyDbg

Отметим галочкой опцию, включающей защиту от FindWindowA, и нажмём SAVE.

Взлом программ отладчиком OllyDbg

Потом перезапустим OllyDbg.

Взлом программ отладчиком OllyDbg

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

Взлом программ отладчиком OllyDbg

Видим, что имя OLLYDBG не отображается в заголовке окна, а класс?

Взлом программ отладчиком OllyDbg

Видим, что от нахождения по классу плагин нас не защитил, поэтому надо искать другой способ.

Утилита, которая должна помочь нам с тем, что не смог сделать плагин, называется Repair 0.6. Это патчер OllyDbg, и его можно скачать отсюда.

http://www.ricnar456.dyndns.org/HERRAMIENTAS/Q-R-S-T-U/repair0.6.zip

Скачаем, а потом закроем OllyDbg и запустим патчер.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Так что теперь у нас есть третий файл OllyDbg, который называется NVP11.exe. Заглянем в папку, где он находится.

Взлом программ отладчиком OllyDbg

Запустим его и посмотрим, какой у него класс окна.

Взлом программ отладчиком OllyDbg

Видим, что класс окна – это «Nvp11», так же как и имя процесса, а значит, buggers3 теперь должен выполняться превосходно, не требуя каких-либо изменений в нём. Пробуем.

Взлом программ отладчиком OllyDbg

Делаем RUN и…

Взлом программ отладчиком OllyDbg

Хочу сказать, что наш пропатченный OllyDbg с каждым днём становится всё менее подверженным обнаружению, теперь его нельзя найти ни по имени процесса, ни по имени или классу окна, хе-хе, в главе 22 продолжим укреплять отладчик и изучать, как работают другие методы и способы антиотладки, как их понять, как победить вручную и, наконец, какой плагин применить, чтобы не слишком перетрудиться, хе-хе.

  [C] Рикардо Нарваха, пер. Aquila

Обсуждение статьи: Обнаружение OllyDbg по фотографии процессов, по классу окна. Крэкинг ч.21 >>>


При перепечатке ссылка на https://exelab.ru обязательна.



Видеокурс ВЗЛОМ