R0 CREW

Malware Analysis Tutorial 13: Tracing DLL Entry Point (Перевод: coldfire)

Перейти к содержанию

Цели урока:

  1. Изучить соглашение о вызовах в С
  2. Попрактиковать навыки реверс инженеринга

1. Введение

В Уроке 11 была показана техника, которая применяется в Max++, для загрузки своего вредоносного кода, используя «тело» другой DLL, имя которой “lz32.dll”. Начиная с этого урока, мы начнем анализировать возможности вредоносной DLL. В следующем, мы используем «lz32.dll» для обозначения этого вредоносного кода, которые начинается с адреса 0x003C24FB. (В вашем экземпляре Vbox, адрес может отличаться. Посмотрите в Уроке 11 как найти корректный адрес входа lz32.dll).

Сегодня, мы обсудим базовую информацию, которая относится к точке входа DLL и проанализируем первую часть lz32.dll (это не настоящая «lz32.dll», но вредоносный код Max++ находится внутри нее).

2. Подготовка

  1. Удалить все программные и аппаратные точки останова в IMM (смотри View->Breakpoints и View->Hardware Breakpoints).
  2. Перейдите по адресу 0x4012DC и установите аппаратную точку останова там. (почему не аппаратную? Потому что эта область будем само распакована и перезаписана, соответственно программная точка останова будет удалена).
  3. Нажмите SHIFT+F9 что бы оказаться на адресе 0x4012DC. Рис. 1 показывает код, который вы должны увидеть. Как вы можете видеть, он находится прямо перед вызовом RtlAddVectoredException, где аппаратная точка останова установлена для прерывания вызова LdrLoadDll (смотри Урок 11, если интересны детали). В этой точке, код по адресу 0x3C24FB не будет извлечен. Если вы перейдете по адресу 0x3C24FB в этот момент, IMM будет жаловаться на то, что этот адресс не доступен.

Рис. 1. Код по адресу 0x4012DC

  1. Теперь прокрутите вниз приблизительно 2 экрана и поставьте программную точку останова на адрес 0x401417. Он идет прямо за вызовом LdrLoadDll(«lz32.dll»), где Max++ заканчивает загрузку lz32.dll.

Рис. 2. Код по адрес 0x401407

  1. Теперь поставьте точку останова на адрес 0x3C24FB. Следуйте инструкциям ниже:
    Нажмите SHIFT+F9 несколько раз, пока не окажетесь на адресе 0x7C90D500(это где-то внутри ntdll.zwMapViewSection, которая вызывается в LdrLoadDll). Перейдите по адресу 0x3C24FB и установите программную точку останова там. (Вы увидите предупреждение, что ваша точка останова находится вне диапазона. Это происходит из-за того, что автор вируса правильно не сбросил бинарную информацию PE(неправильный размер секции кода — смотри Урок 12 для более подробных деталей). Все должно быть хорошо, нажми ОК.
  2. Если вы нажмете SHIFT+F9 (возможно дважды), вы окажетесь на адресе 0x3C24FB. Если вы окажетесь по адресу 0x401417, это будет значить, что что-то неправильно с IMM (странно, но я не могу объяснить). Вы должны перезапустить отладку(Debug->Restart) и повторить шаги (1) — (6). При выполнение текущих шагов вы должны дважды остановиться на адресе 0x7C90D500 и на адресе 0x3C24FB. Это происходит потому что LdrLoadDll будет пытаться вызвать входную точку DLL.

(Рис. 3 показывает код, который вы должны увидеть. Первая инструкция по адресу 0x3C24FB должна быть CMP DWORD PTR SS:[ESP+8], -2. Если вы выполните несколько инструкций, то вы должны заметить, что вы скоро вернетесь, потому что значение [ESP+8] равно 1.

Рис. 3. Код по адресу 0x3C24FB

  1. Нажмите снова SHIFT+F9, вы окажетесь на адресе 0x401417, затем опять нажмите SHIFT+F9, и вы снова окажетесь на адресе 0x3C24FB. Вы должны были заметить, что [ESP+8] сейчас равно -2 и если вы нажмете F7, то сможете изучить много деталей вредоноса.

До этого момента, вы делаете правильно. Если вы что-то перепутали, вы должны восстановить снимок Max++, потому он автоматически удаляет свой бинарь с диска, т. е. вы не сможете найти его снова.

2. Дополнительная информация о точке входа DLL

DLL, так же как и .exe файлы, имеют точку входа. Эта входная функция будет выполнена, когда DLL будет загружена вызовом системной функции, такой как LdrLoadDLL(). У MSDN есть тона отличных статей на эту тему и вы можете почитать [1] для того, что бы узнать более детально. Ниже вы можете видеть определений функции точки входа DLL, она принимает 3 параметра:

BOOL WINAPI DllMain(
  HINSTANCE [B][U]hinstDLL[/U][/B], // handle to DLL module 
  DWORD [B][U]fdwReason[/U][/B], // reason for calling function 
  LPVOID [B][U]lpReserved[/U][/B] ) // reserved {...}

Задание 1: Обратите внимание на код, находящийся по адресу 0x3C24FB(рис. 3), проверяет значение [ESP+8]. Какой параметр сохраняется в ESP+8?

Нам особенно интерес параметр fwdReason. Где он определен? Читая [1] вы можете найти, что для fwdReason определено несколько макросов, таких как DLL_PROCESS_ATTACH (когда процесс первый раз присоединил DLL), DLL_THREAD_ATTACH (когда поток процесса был присоединен) и т.д… [1] не предоставляет информации про реальные значения этих макросов, но простой поиск в google “#define DLL_PROCESS_ATTACH” позволяет определить значения (гуглите на вашей VM. Многие хостинг сайтов MS могут быть вредоносные). Эти значения могут быть в диапазоне от 1 до 8. Например, значение 1 соответствует DLL_PROCESS_ATTACH. Это значение [ESP+8], когда код по адресу 0x3C24FB выполняется первый раз( который вызывается функцией LdrLoadDLL).

3. Анализ Max++

Если вы обратите внимание на первые пары инструкций, находящиеся по адресу 0x3C24FB, может возникнуть вопрос:

Задание 2: Почему малварь сравнивает [ESP+8] с -2? Какой в этом смысл?

Смысл в том, что когда произойдет легальный вызов ( например, размещенный LdrLoadCall), код на 0x3C24FB вернется немедленно(не причинив вреда). Почему? Потому что, ссылаясь на Урок 12, Max++ разрезает LdrLoadCall и фактически LoadLdrDll не заканчивает свою работу верно(некоторая информация структуры ядра не установлена правильно). Эта информация будет должным образом настроена, потому что код не может вызвать внешние функции(например,те, которые предусмотрены ntdll). Max++ устанавливает эту информацию лично, и вручную взывает функцию, находящийся по адресу 0x3C24FB. Перед вызовом, он устанавливает второй параметр (fwdReason) равным -2(что является значением, которое никогда не будет использовано обычным вызовом из точки входа DLL), так что код знает, что вызыв был сделан от Max++.

Задание 3: Можете ли вы найти какая инструкция вызывает 0x3C24FB второй раз (которая обеспечивает -2 для fwdReason)? (Совет: проверьте содержимое стека) Посмотрите как 0x3C24FB вызывается. Могут ли инструменты статического анализа определить, что 0x3C24FB вызывается кодом Max++?

© Translated by coldfire from r0 Crew

Ссылки

[1] Microsoft, “Dynamic-Link Library Entry-Point Function”

UP