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

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Продолжаем углубляться в различные методы антиотладки. Сейчас будем использовать крэкми, которое было специально модифицировано для целей данной статьи.

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

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

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

42f29467be890e4201a5e20ec8ce218a.png

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

eb856896790c18281744602e208593b7.png

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

c8496e377cdef3cb01529268c3cb3648.png

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

e3f35f380f21aba30a09907816579d80.png

5ad93b964355e5b6d9e27d50bf9c0107.png

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

5436510c95127ffd3703b210e69fbfa1.png

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

2ce34e77f778594a725f791dd185b413.png

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

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

828b9ad997a503f3595bb7ff11f26bd8.png

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

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

ea5d910cac637b312715955a63fce8a0.png

815d71ba0c9a5cd2a6c24ebe5e97f135.png

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

04ef80eb4aed0f649a4c28cd62078f41.png

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

dc3cf8da983f3ef39e92eca42e7bb4c4.png

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

867c8045d3804247460989f6e6afa1b9.png

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

500c9227dd4eb9c7d0d5f451430abd04.png

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

af40800daef208fc7dcf47c24648464d.png

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

bf0afcae8db8be48161931a52f83350a.png

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

25ee8b61e25d482bc6193d287e2f7221.png

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

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

22a4780b62f3e9ddde8c7c3c384c486e.png

Стек:

8c0e045847619a522e18b368f76a2de1.png

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

fdf07df29b559b3c3b0298f5e987523d.png

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

e790cea754261105700011779a26a8a7.png

c9d83afa19f0a4b2218006ac48c34738.png

И в EAX получаем логический номер. 08d382ac804ddc26f6db49d104fa4a96.png

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

2ea910db37c6a4b4ae4f66092a2882dd.png

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

c4a5f9c7cf428b15b3ad7ea93663180a.png

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

4a5cd41f83bd366fa059cef950370e16.png

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

4f904f0bddf09028b24d312748d46e27.png

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

9a9a11f461cd0999d55616c9dd6249b4.png

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

1c62843a2da43664da4944f84e559760.png

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

556084ad62f1cc2341676dc7a1bf80b7.png

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

683fa41c833dcfa15f4ccd88870dbef3.png

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

64761f1891b97a88970a77e02ef555e6.png

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

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

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


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

e0bb2796b11312bb927169f5959e3973.png

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

738e30e82b65d2f4dfbca5d5fcdb8edd.png

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

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

7345c64d30044bab903d17cb51feb1db.png

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

3f3fef09d67e71b8402c9ab2b631b3bc.png

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

6f69edca83ea4d81c57a13d1df5349ea.png

9e2dee90c119b52614001e66c48ed614.png

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

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

a9952c663802f4c960ac2f5525fcac86.png

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

c88ff75427189405807c9e538eca43a2.png

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

a6d69834bdc35cd66e9a5eea1fb4c9ed.png

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

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

43f6026bfb548efe124aa3155ddbcae2.png

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

42d38c3332e89fcf5928fdc966a45ce4.png

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

364fe52f29acc4f455d622ecd9b38e7f.png

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

8cbaa626c63ce2f09f6ad4731c90a299.png

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

405651b90b85e3763f906b1228881bab.png

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

92f5534678a456902283e8e23350020f.png

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

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

c3bbba04aa2535539eda7ace2f0993c2.png

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

5a7f3318789db3b91d64094b0013ae36.png

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

5b44d59980510808e729f3d447914f82.png

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

e39ee06c3f4a6e47b019061cb12bd1ca.png

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

942bbb6dfbfc503c3ffa00a0a325d5bf.png

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

9a99e07becd1d0a17d86f3d2e24a6271.png

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

0cb4e9afd1a838deddde6bc9e2d5e647.png

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

2be0387721da4eb350bb5900dc99ee44.png

0d0d32118e30a6223834eaa55950d848.png

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

2bc2e3793472a061ccd0d9b78b3ff3cf.png

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

36f4e584cde4a9f74e763e97733675ed.png

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

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

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

4dc3f52aedb39850d7b508050a519425.png

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

7d9fd882c7eb78b02c8bddd537df8375.png

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

Откроем PIRULO.exe.

e2b33e29e58bed3019e653efa28a1204.png

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

54c49e089cdb594e2050b6b2232f4380.png

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

27911912c25a68fa92029a84efb1b0bd.png

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

0eb8de816f1b4d6c58349567a5a0c612.png

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

d3e50a800958a240670a26a2b2d099cd.png

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

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

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


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

cc7fa4e0a3e0515c6f8fe39f762c3cbb.png

f553bbd8523fdcf3cb333e0f41fffcef.png

4c6642b686ca926ef02fea2e9fba74ba.png

cd1e8aa2d9cc29cc2c3705ff2d3a755c.png

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

5aad971875e044de6430698e1c423ef1.png

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

a320a9eb2cd0bbd35890fbf569b4b052.png

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

aa7e10ce70693d35c4b44454c6f83120.png

Делаем RUN и…

834378eb999e2c097f79c09d45d456cd.png

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

О нас

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

    Dark-Time 2015 - 2022

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

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

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