Категория > Новости > Малварь на просвет. Используем Python для динамического анализа вредоносного кода - «Новости»
Малварь на просвет. Используем Python для динамического анализа вредоносного кода - «Новости»23-05-2021, 00:00. Автор: Jenkin |
|
Малварь на просвет. Учимся быстро искать признаки вредоносного кода». Для отслеживания жизнедеятельности приложений существует целый арсенал готовых средств, среди которых самое известное — утилита Process Monitor из Sysinternals Suite. Эта тулза в рекламе не нуждается, она неплохо документирована и пользуется заслуженной популярностью. Process Monitor способен отслеживать все изменения в файловой системе Windows, мониторить операции создания и уничтожения процессов и потоков, регистрировать и отображать происходящее в реестре, а также фиксировать операции загрузки DLL-библиотек и драйверов устройств. ![]() Отслеживать вызовы API-функций можно с помощью утилиты API Monitor французской компании Rohitab. Туториал по работе с этой тулзой можно найти на сайте программы, правда на английском языке. API Monitor Самый главный недостаток этих утилит (как, впрочем, и других широко распространенных программ такого рода) именно в их популярности. Потому что с ними отлично знакомы не только аналитики, но и вирусописатели. Далеко не любая малварь позволит использовать подобные инструменты и безнаказанно исследовать свое поведение в системе. Наиболее продвинутые трояны фиксируют любые попытки запуска антивирусов и средств анализа состояния ОС, а затем либо пытаются всеми правдами и неправдами прибить соответствующий процесс, либо прекращают активные действия до лучших времен. Тем не менее существуют способы перехитрить малварь. Один из наиболее очевидных — изобрести собственный инструмент, который будет уметь (хотя бы частично) то же самое, что делают Process Monitor, API Monitor и им подобные программы. Чем мы, благословясь, и займемся. Для работы мы будем использовать Python (не зря же он считается одним из самых хакерских языков программирования). Отслеживать интересующие нас события, связанные с реестром, файловой системой или процессами, можно двумя путями: используя специализированные API-функции Windows и при помощи механизмов WMI (Windows Management Instrumentation, или инструментарий управления Windows). То есть, помимо Python, нам понадобятся модуль pywin32 и модуль WMI. Установить их очень просто (на самом деле достаточно поставить только пакет WMI, а он уже самостоятельно подгрузит pywin32): pip install pywin32pip install wmiЧтобы отследить вызовы API-функций, понадобится модуль WinAppDbg. Этот модуль работает только со второй версией Python (если говорить точнее, то потребуется 2.5, 2.6 или 2.7), поэтому старый Python рано окончательно списывать в утиль. Тем более что автор WinAppDbg пока не планирует переписывать модуль под третью версию в связи с необходимостью рефакторинга большого объема кода, о чем прямо говорит в документации. Установить модуль можно через pip: pip install winappdbgCкачав и установив все необходимые модули, приступим к таинству написания собственного инструмента для динамического анализа малвари. Отслеживаем процессыОтслеживать процессы будем с помощью механизма WMI. Это делается достаточно просто: import wminotify_filter = "creation"process_watcher = wmi.WMI().Win32_Process.watch_for(notify_filter)while True: new_process = process_watcher() print(new_process.Caption) print(new_process.CreationDate)Здесь
Далее (в третьей строке) мы создаем объект‑наблюдатель def date_time_format(date_time): year = date_time[:4] month = date_time[4:6] day = date_time[6:8] hour = date_time[8:10] minutes = date_time[10:12] seconds = date_time[12:14] return '{0}/{1}/{2} {3}:{4}:{5}'.format(day, month, year, hour, minutes, seconds)Вообще, делать такие вещи просто в бесконечном цикле не очень хорошо, поэтому мы оформим все это в виде класса, чтобы потом запускать его в отдельном потоке. Таким образом мы получим возможность отслеживать в одном потоке, например, моменты создания процессов, а в другом — их уничтожения. Итак, класс class ProcessMonitor(): def __init__(self, notify_filter='operation'):self._process_property = {'Caption': None,'CreationDate': None,'ProcessID': None,}self._process_watcher = wmi.WMI().Win32_Process.watch_for(notify_filter) def update(self):process = self._process_watcher()self._process_property['EventType'] = process.event_typeself._process_property['Caption'] = process.Captionself._process_property['CreationDate'] = process.CreationDateself._process_property['ProcessID'] = process.ProcessID @property def event_type(self):return self._process_property['EventType'] @property def caption(self):return self._process_property['Caption'] @property def creation_date(self):return date_time_format(self._process_property['CreationDate']) @property def process_id(self):return self._process_property['ProcessID']При инициализации класса мы создаем список свойств процесса Перейти обратно к новости |