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

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

AnGel

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

AnGel

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

Следующим упаковщиком на шкале сложности является aspack, очень похожий на UPX, и для которого у нас есть крэкми UnPackMe_ASPack2.12.exe, использовавшееся в главе 32.

Для практики установим OllyDump в директорию с плагинами, чтобы сделать дамп с его помощью.

Здесь была ссылка, но она устарела. Возможно, поможет вот
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
.


Открываем OllyDbg, защищённый плагинами от обнаружения, и находим OEP с помощью метода PUSHAD.

c5731e9c87be111fdfe9181f93551dc5.png

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

b13f99b7668f38423be9cf841e389db5.png

Видим начальный PUSHAD, который проходим с помощью F7, а затем делаем

63e594b10f64898a5a28405801076fa1.png

ESP-FOLLOW IN DUMP, чтобы установить в DUMP’е железную (hardware) точку останова на доступ к значениям двух регистров, которые сохраняются инструкцией PUSHAD.

9198ba9f11a6cf9504ddc9e0b4113e82.png

Затем нажимаем F9.

9a18edf907055fd31d702fbef83a16ef.png

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

621f5e600b4d7a39888147313931dc0e.png

Как видим, код был не понят, выходим из анализа.

2096ff29c8048b658ca419f9004fa460.png

И видим, что если проанализировать его ещё раз, всё становится гораздо лучше.

a16485b2c061a7b4c322014d0fb302a1.png

Затем приступаем к дампу файла. Идём в меню PLUGINS и ищем там OllyDump.

fbbb1b8efaa2bef81002062a1113eff3.png

4f1ec014080c268b994186c02780c5bc.png

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

Ещё одна важная фишка – это опция «REBUILD IMPORT», находящаяся внизу окна. OllyDbg пытается сделать работу IMP REC’а, для чего ему служат METHOD1 и METHOD2, которые могут работать для простых упаковщиков. Вы можете сделать два дампа, используя каждый из этих методов, и посмотреть, работает ли хотя бы один из них. Это не всегда срабатывает, но иногда может.

Мы снимаем галочку с «REBUILD IMPORT», так как мы будем использовать IMP REC для большей надёжности.

36f70fae4c0cd38fe9f0300237c2f350.png

Ок, сейчас сделаем дамп и посмотрим, что из этого выйдет.

988f72758e3460b746de5baf8ec1c0c8.png

Вот дамп, если запустим его без починки IAT, то может запуститься без проблем, но только на моей машине, а может выдать ошибку. Посмотрим.

4819a265979d9185a901cdea5be08a6f.png

Ок, не закрывая упакованный архив, который остановлен на точке входа, открываем IMP REC и выбираем вышеуказанный процесс в выпадающем меню.

Возвращаемся в OllyDbg, чтобы найти значения начала IAT, её размера и OEP.

OEP равна 404000, то есть в IMP REC это будет 4000, так как нужно отнять базу образа, равную 400000.

Ищем начало и конец IAT, для этого нам нужно найти вызов какой-нибудь API-функции. Прямо под OEP есть вызов GetModuleHandleA.

b377f043b1c725d2fea576a75c73f196.png

Отмечаем данную строку, затем правая кнопка мыши и FOLLOW.

330327cc766f3e6dfdcdfea86dc6a0fc.png

af83f9699e897d45449c26437ace3b9c.png

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

Это значит, что здесь используется косвенный вызов для перехода на функцию, поэтому выяснить, откуда считывается адрес API (а он считывается из IAT), легко.

Легко видеть, что 4011F4 – это элемент IAT, где сохраняется адрес API-функции GetModuleHandleA.

Те, кто хочет увидеть косвенные переходы, могут поискать FF 25, чтобы их найти.

5dad61a1cfb24e6376c7b377bfce078f.png

И получаем тот же результат, так как JMP к GetModuleHandleA читает значения из того же элемента IAT.

Идём в DUMP, чтобы посмотреть данный элемент в частности и IAT в общем.

c52bfefd47db95537822afee19545195.png

Здесь видимо, что все элементы соответствующие тем, что мы видели в начале, все идут в секцию кода той же DLL. Посмотрим с помощью VIEW-M, какой DLL они соответствуют.

a6953eb1879f285094d3d057399d6854.png

36aca76c1ff7a2f6ceb21018dd2b77b8.png

Все находятся внутри указанной секции, поэтому видим, что эти элементы, относящиеся к Kernel32.dll, указывают на секцию CODE.

Здесь же можем посмотреть конец IAT. Снизу от 401218 особенно ничего нет, так что конец IAT – это 401218, и теперь нам осталось найти начало.

c275628b0dc204a7be698de160532f93.png

Видим разделяющие нули, а после них другую группу элементов.

fff12177b850aa4dcb4d0e77dbdd1a6e.png

Которые точно являются элементами, смотрим адреса, куда на которые они указывают (10xx или 11xx), Это не DLL, ни что-нибудь ещё, так как самый нижний адрес в карте памяти – это 10000.

942ae33c8cc0386f645922a4e4f4eb08.png

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

70eb5196233d16cadbe8dac3080f4aa0.png

Видим, что среди нулей есть другая группа элементов, указывающих на адреса 77Dxxxxx. Смотрим в карте памяти, какой DLL они соответствуют.

870df5412966816b6527d330dc273598.png

Видим, что они принадлежат User32.dll.

Также видим, что в карте памяти есть много других DLL, таких как GDI32 и Ntdll, которые могут загружаться упаковщиком для собственного использования, а не для использования программой. Чтобы проверить это, сделаем в этом же списке SEARCH FOR – ALL INTERMODULAR CALLS.

148ddac805950152d126a8d47beb297f.png

d926ef9374e50e75cdd424f29c0b88d1.png

Видим, что есть вызовы 3-х DLL, две из них – те, которые мы нашли, и другая – это Ntdll. Смотрим.

Если, например, перейдём к вызовам этой DLL.

5646dd6ba684eaea0ad5cf5b943048f6.png

Видим, что соответствующий элемент находится в 401200, то есть это смешение (mezclada – чего-то я не совсем понял, о чём он толкует, кто понял – отпишитесь – прим. пер.) с kernel32.dll.

43a3ca81cbfbacce68a463df8b2d5479.png

То же самое относится и к другой из указанных DLL, которая смешана с kernel32.dll. Мы не заметили, что эти две секции кода находятся рядом друг с другом, но это так.

b15dc89e5bd008b6cbb1366d7e3fc5b6.png

d20633084b338e3ce26063ac31c727f9.png

Ок, посмотрим какие проблемы могут быть из-за подобного начала IAT. Вот все эти элементы:

c66b9769161cfa6faa70aaeb6a706159.png

Начала IAT находится в 40119C, которое совпадает с меньшим значением, найденным в таблице переходов.

30549ac249d2a4bf59bf0ae179e1c9ce.png

Видим, что оно самое маленькое из всех этих значений, так что у нас получается:



OEP=4000
RVA или НАЧАЛО IAT=119C
РАЗМЕР = КОНЕЦ МИНУС НАЧАЛО = 401218-40119c = 7C
a2f4f6b89f17a423ad2961113f7988ed.png

Задаём эти значения в IMP REC, чтобы посмотреть, что получится, видим, что оба смешанных элемента относятся к ntdll и kernel32.

749c381bd6c98f49589915def0ec3f7d.png

Видим, что указанная часть не та, которая соответствует мусорным элементам, и внизу видим, что у нас есть только элементы для kernel32, и если посмотрим редко встречающиеся элементы, соответствующие 401200 b 401210, то увидим, что:

8372a89316111faa9d1e42c57e9be9ee.png

Заменяем его на похожие элементы, соответствующие kernel32.dll, и что это будет означать?

70ca6097c377474f82e2c592b2835dd3.png

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

Хорошо, теперь нам осталось убрать мусор из середины. Проверяем эти элементы и смотрим, если написано NO, то это мусор. Чтобы убедиться в этом, идём к одному из них.

a0a7334789579432a02d688e9012485c.png

Отмечаем первый, нажимаем правую кнопку мыши и выбираем DISASSEMBLE-HEX VIEW.

a7703ddb50b4f2486a3ed533f35a35c2.png

ce09f0b0c800f7bbfe2d3a1301407cff.png

Здесь видим, что это не приводит нас к реально существующему месту, так что отмечаем все элементы как мусор.

bd4d32b57d2e24f623e63a07e6f3de93.png

Нажимаем SHOW INVALID, а затем, держа все эти элементы отмеченными, нажимаем на правую кнопку мыши и выбираем CUT THUNKS.

4199c9ba9544bbe617017a9e47d32126.png

ae5af7b3405c80251d402f4fac7a762b.png

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

Теперь можно нажать FIX DUMP, так как все элементы отмечены как YES, то есть как правильные.

5a70b9c27e1e91a67be8bce10e9e81f0.png

И создаётся dumpaspack_.exe, файл, который предположительно должен быть починен, запускаем и смотрим, так ли это.

5bb3f97696fde1268b76450fb1aa8e0e.png

Работает превосходно, поэтому на этот раз здесь и остановимся. Сложность нужно повышать постепенно.
 

О нас

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

    Dark-Time 2015 - 2024

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

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

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