Малварь на просвет. Учимся быстро искать признаки вредоносного кода

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

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

Виды анализа исполняемых файлов

Статический анализ предполагает анализ файла без его запуска на выполнение. Он может быть базовым — в этом случае мы не анализируем непосредственно инструкции процессора в файле, а производим поиск нетипичных для обычных файлов артефактов (например, таких как строки или названия и последовательности API-функций), либо расширенным — в этом случае файл дизассемблируется и производится исследование инструкций, поиск их характерных для вредоносных программ последовательностей и определение того, что именно делала программа.

Динамический анализ заключается в исследовании файла с его запуском в системе. Он тоже может быть базовым и расширенным. Базовый динамический анализ — это исследование файла с его запуском без использования средств отладки, он заключается в отслеживании событий, связанных с этим файлом (например, обращение к реестру, дисковые операции, взаимодействие с сетью и т. п.). Расширенный динамический анализ заключается в исследовании поведения запущенного файла с применением средств отладки.

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

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

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

 

Инструментарий

 

HEX-редакторы

Один из основных инструментов статического базового анализа — это HEX-редактор. Их много, но в первую очередь необходимо отметить Hiew. Это безусловный лидер и бестселлер. Помимо непосредственно функций HEX-редактора, в нем реализовано еще много дополнительных возможностей, связанных с анализом файла: это и дизассемблер, и просмотрщик секций импорта и экспорта, и анализатор заголовка исполняемых файлов. Главный недостаток — все это не бесплатно (хотя и весьма недорого — от 555 рублей).

HEX-редактор Hiew

Если не хочется тратить деньги, то можно обратить внимание, например, на Hex Editor Neo (есть бесплатный вариант) или на HxD Hex Editor.

 

Детекторы упаковщиков

Если есть подозрение, что файл упакован, то с помощью детектора упаковщиков можно попытаться определить, какой упаковщик при этом использовался, и попробовать распаковать исследуемый файл. Долгое время безусловным лидером здесь была программа PEiD, и в принципе можно пользоваться и ей, однако поддержка давно прекращена и новых сигнатур для определения типов упаковщика уже никто не выпускает. Альтернатива — Exeinfo PE.

Exeinfo PE

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

 

Специализированные утилиты для исследования исполняемых файлов Windows

Программа CFF Explorer из пакета Explorer Suite — это настоящий швейцарский нож для исследователя PE-файлов. Позволяет получить огромное количество разнообразной информации обо всех компонентах структуры PE-файла и, помимо прочего, может служить HEX-редактором.

CFF Explorer

Так что настоятельно рекомендую CFF Explorer, тем более что программа бесплатная.

 

Python-модуль pefile

Python-модуль pefile позволит обойтись при анализе PE-файлов исключительно интерпретатором Python. С ним практически все операции по базовому статическому анализу можно реализовать путем написания небольших скриптов. Прелесть всего этого в том, что заниматься исследованием PE-файлов можно в Linux.

Модуль присутствует в PyPi, и установить его можно через pip:

pip install pefile

 

Yara

Ну и в завершение всего списка весьма популярный и востребованный инструмент, ставший своеобразным стандартом в среде антивирусной индустрии, — проект Yara. Разработчики позиционируют его как инструмент, который помогает исследователям малвари идентифицировать и классифицировать вредоносные сэмплы. Исследователь может создать описания для разного типа малвари в виде так называемых правил, используя текстовые или бинарные паттерны.

 

Меры предосторожности

Чтобы обезопасить систему при проведении базового статического анализа подозрительных файлов, необходимо:

  • установить запрет на операцию чтения и выполнения анализируемого файла (вкладка «Безопасность» в контекстном меню «Свойства»);
  • сменить разрешение файла с .exe на какое-нибудь другое (или вообще убрать расширение анализируемого файла);
  • не пытаться открыть файл текстовыми процессорами и браузерами.

Можно обойтись этими мерами и не использовать виртуальную среду, хотя для полной безопасности можешь установить, например, Virtual Box и проводить анализ в нем (тем более что для динамического анализа без виртуалки, как правило, не обойтись).

 

Определение типа файла

Я думаю тебе известно, что признак PE-файла в Windows — это не только расширение .exe, .dll, .drv или .sys. Внутри него содержатся и другие отличительные черты. Первая из них — это сигнатура из байт вида «MZ» (или 0x4d, 0x5a в шестнадцатеричном представлении) в самом начале файла. Вторая — сигнатура также из двух байт PE и двух нулевых байтов следом (или 0x50, 0x45, 0x00, 0x00 в шестнадцатеричном представлении).

Смещение этой сигнатуры относительно начала файла записано в так называемом DOS-заголовке в поле e_lfanew, которое находится по смещению 0x3c от начала файла.

По большому счету наличие этих двух сигнатур в файле и подходящее расширение свидетельствует о том, что перед нами именно PE-файл, однако при желании можно посмотреть еще значение поля Magic опционального заголовка (Optional Header). Это значение находится по смещению 0x18 относительно начала сигнатуры PE. Значение этого поля определяет разрядность исполняемого файла:

  • значение 0x010b говорит о том, что файл 32-разрядный (помни, что в памяти числа располагаются с обратной последовательностью байт, сначала младший байт и далее старшие байты, то есть число 0x010b будет представлено последовательностью 0x0b, 0x01);
  • значение 0x020b говорит о том, что файл 64-разрядный.

Посмотреть это все можно несколькими способами. Первый — с помощью HEX-редактора.

Признаки PE-файла в HEX-редакторе Hiew

Второй — используя CFF Explorer или Exeinfo PE. Они наглядно показывают значения указанных сигнатур.

Третий способ — использовать возможности Python, запустив такой скрипт:

with open(<путь к файлу>, 'rb') as file:
  # прочитаем первые 1000 байт файла (больше и не надо)
  buffer = file.read(1000)

  e_ifanew = int.from_bytes(buffer[0x3c:0x40], byteorder='little')
  mz_signature = buffer[0x0:0x2]
  pe_signature = buffer[e_ifanew:e_ifanew + 0x4]
  magic = buffer[e_ifanew + 0x18:e_ifanew + 0x1a]
  if mz_signature == b'MZ' and pe_signature == b'PEx00x00':
  if magic == b'x0bx01':
    print('Файл', sys.argv[1], 'является исполнимым PE32 файлом Windows.')
  elif magic == b'x0bx02':
    print('Файл', sys.argv[1], 'является исполнимым PE64 файлом Windows.')
  else:
    print('Файл', sys.argv[1],'не является PE файлом Windows.')

Или можешь использовать вот такое правило для Yara:

import "pe" //импортируем Yara-модуль pe
rule is_pe_file
{
  strings:
    $MZ_signature = "MZ"

  condition:
    ($MZ_signature at 0) and (pe.is_32bit() or pe.is_64bit())
}

 

Поиск в VirusTotal по хешу

Отправить на VirusTotal для проверки можно не только сам файл, но и его хеш (md5, sha1 или sha256). В этом случае, если такой же файл уже анализировался, VirusTotal покажет результаты этого анализа, при этом сам файл на VirusTotal мы не засветим.

Думаю, как узнать хеш файла, ты прекрасно знаешь. В крайнем случае можно написать небольшой скрипт на Python:

import hashlib
with open(<путь к файлу>, 'rb') as file:
  buffer = file.read()
  print('md5 =', hashlib.md5(buffer).hexdigest())
  print('sha1 =', hashlib.sha1(buffer).hexdigest())
  print('sha256 =', hashlib.sha256(buffer).hexdigest())

Результат подсчета хеша шлем на VirusTotal либо применяем мои рекомендации из статьи «Тотальная проверка. Используем API VirusTotal в своих проектах» и автоматизируем этот процесс с помощью небольшого скрипта на Python.

import sys
import requests

## будем использовать 2-ю версию API VirusTotal
api_url = 'https://www.virustotal.com/vtapi/v2/file/report'
## не забудь про ключ доступа к функциям VirusTotal
params = dict(apikey=<ключ доступа к API VirusTotal>, resource=str(sys.argv[1]))

response = requests.get(api_url, params=params)
if response.status_code == 200:
  result = response.json()
  if result['response_code'] == 1:
    print('Обнаружено:', result['positives'], '/', result['total'])
    print('Результаты сканирования:')
    for key in result['scans']:
      print('t' + key, '==>', result['scans'][key]['result'])
  elif result['response_code'] == -2:
    print('Запрашиваемый объект находится в очереди на анализ.')
  elif result['response_code'] == 0:
    print('Запрашиваемый объект отсутствует в базе VirusTotal.')
  else:
    print('Ошибка ответа VirusTotal.')
else:
  print('Ошибка ответа VirusTotal.')

Как видишь, скрипт получает значение хеша, переданного в виде аргумента командной строки, формирует все нужные запросы для VirusTotal и выводит результаты анализа.

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

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *