• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Создание собственной среды для вредоносных программ с помощью PANDA - Часть 1

NokZKH

Переводчик
Забанен
Регистрация
09.02.2019
Сообщения
99
Реакции
121
Пожалуйста, обратите внимание, что пользователь заблокирован
Динамический анализ является фундаментальной техникой в компьютерной безопасности и широко распространен в сфере анализа вредоносных программ. Идея состоит в том, чтобы выполнить программу в контролируемой среде и затем отслеживать эту среду, чтобы понять поведение вредоносного ПО. Это привлекательно, потому что позволяет нам делать точный и конкретный анализ, основанный на реальных исполнениях. Мы используем наши наблюдения для различных целей, таких как определение того, является ли данный образец вредоносным или нет, идентификация каналов связи, общая распаковка и многое другое. Для этого существует множество систем, как систем с открытым исходным кодом, таких как Cuckoo Sandbox, CAPE sandbox, Spengler и Drakvuf, так и коммерческих решений, таких как LastLine, VMRay и многих других.

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

Цель этого поста в блоге - показать, как выполнить анализ определенного приложения Windows с использованием инфраструктуры PANDA. Более конкретно, в этом посте мы рассмотрим:
  1. Обзор PANDA с точки зрения авторов плагинов
  2. Как настроить инфраструктуру для записи и воспроизведения систем Windows (без владения ключом Windows CD)
  3. Как создать инфраструктуру, которая позволяет легко записывать / воспроизводить приложения, существующие вне системы анализа
  4. Как использовать существующие плагины PANDA для анализа гостевой системы
Вы можете найти скрипты, используемые в этом посте на Github

Обзор PANDA
PANDA является аббревиатурой от Platform for Architecture-Neutral Dynamic Analysis и в основном состоит из NYU, MIT Lincoln lab и Северо-восточного университета. Проект активно поддерживается на Github здесь и поставляется с обширным руководством, расположенным здесь. По сравнению со многими другими системами динамического анализа, отличительной особенностью PANDA является то, что анализ выполняется вне песочницы. В частности, это означает, что PANDA создает гостевую виртуальную машину, и весь анализ основан на интерпретации состояния гостя из виртуального оборудования.

Архитектура и особенности PANDA
PANDA создан на основе полнофункционального эмулятора QEMU и в настоящее время синхронизируется с версией QEMU 2.9.1. Центральным аспектом PANDA является система, которая позволяет записывать и воспроизводить выполнение всей ОС как способ быстрого обратного инжиниринга. Фреймворк удобен для пользователя в том смысле, что имеет обширную архитектуру плагинов и поставляется со многими существующими плагинами (на момент написания этой статьи в репозитории PANDA было более 40 плагинов). В дополнение к этому, PANDA также имеет функцию для перевода промежуточного представления QEMU, TCG, в код LLVM, который позволяет писать полнофункциональные инструменты динамического анализа посредством проходов LLVM. Это мощная функция, которая объединяет две структуры анализа программ QEMU и LLVM, для использования синергизма между ними.

1.png

Рабочий процесс PANDA, как показано в официальном руководстве .

В этом посте мы делаем акцент на использовании PANDA, создавая плагины, а не расширяя ядро PANDA. На рисунке ниже мы показываем основные компоненты, которые позволяют писать плагины PANDA. С высокоуровневой точки зрения плагины взаимодействуют с QEMU двумя основными способами: (1) посредством обратных вызовов инструментария и (2) посредством API проверки, который отображает состояние гостевой системы, например, состояние памяти. Вместе мы называем эти два интерфейса плагина.

2.png

Основные компоненты PANDA с точки зрения написания плагинов. Красные линии между плагинами показывают зависимости.

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


Имя обратного вызоваТриггерная точка
PANDA_CB_BEFORE_BLOCK_EXECПеред выполнением каждого базового блока
PANDA_CB_AFTER_BLOCK_EXECПосле выполнения каждого базового блока
PANDA_CB_INSN_EXECПеред выполнением инструкции
PANDA_CB_AFTER_INSN_EXECПосле выполнения инструкции
PANDA_CB_VIRT_MEM_AFTER_READПосле чтения виртуальной памяти
PANDA_CB_VIRT_MEM_AFTER_WRITEПосле записи в виртуальную память
PANDA_CB_HD_READКаждый HDD прочитан
PANDA_CB_HD_WRITEКаждый HDD пишет
PANDA_CB_ASID_CHANGEDПосле ASID (идентификатор адресного пространства - он же PGD) напишите

По сути, эти обратные вызовы позволяют нам перехватывать выполнение всякий раз, когда происходит специальное событие, например, перед выполнением каждой гостевой инструкции, и выполнения кода C / C ++. Кроме того, PANDA рекомендует авторам плагинов повторно использовать функциональные возможности друг друга и проводить сложные анализы путем использования каждого плагина в качестве «атомарного объекта». Таким образом, PANDA поддерживает различные функции, позволяющие подключаемым модулям зависеть от других подключаемых модулей, а также функции импорта/экспорта.

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



Имя функцииОписание
panda_physical_memory_rwЧитает или пишет в физическую память
panda_virt_to_physПреобразует виртуальный адрес в физический адрес
panda_virtual_memory_readЧитает виртуальную память
panda_virtual_memory_writeПишет в виртуальную память
panda_in_kernelОпределяет, выполняется ли в данный момент выполнение в ядре
panda_current_spВозвращает текущее значение указателя стека

В дополнение к этому, обратные вызовы PANDA обеспечивают легкий доступ к структуре QEMU CPUState, которая дает нам доступ к специфическим для гостевой машины функциям, например, к регистрам. Таким образом, поскольку наш анализ выполняется за пределами гостевой системы, мы должны выполнить анализ «снизу вверх», интерпретируя двоичные данные и создавая абстракции вверх по отношению к конструкциям уровня ОС. Этот процесс называется интроспекцией виртуальной машины (VMI), и PANDA предоставляет множество плагинов, которые могут сделать это для различных операционных систем.

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



Название плагинаОписание
syscalls2Предоставляет обратные вызовы, которые разрешают уведомление всякий раз, когда в гостевой системе происходят системные вызовы, и могут предоставлять параметры для каждого системного вызова.
callstack_instrОтслеживает вызовы функций и возвращает гостей.
покрытиеУкажите адрес и размер каждого выполняемого блока, а также идентификатор процесса и идентификатор потока во время выполнения блока.
stringsearchПоиск строк, которые читаются или записываются в память в разных точках.
taint2Полный системный динамический анализ заражения.
tainted_netПозволяет пользователю портить входящие сетевые пакеты и выполнять квест на исходящих сетевых пакетах.
ida_taint2Извлекает информацию о том, какие инструкции оперировали с испорченными данными, которые можно визуализировать в IDA.
win7x86introСамоанализ виртуальной машины для Windows 7 32-bit.
winxp86introСамоанализ виртуальной машины для Windows XP 32-bit.
osi_linuxСамоанализ виртуальной машины для Linux.

Сборка PANDA
Чтобы начать работать с PANDA, первым делом нужно скомпилировать исходный код. PANDA поставляется с простой системой сборки для Ubuntu, и для этого поста в блоге я использовал чистую установку Ubuntu 16.04 на компьютере VirtualBox.

Код:
$ git clone https://github.com/panda-re/panda
Cloning into 'panda'...
remote: Enumerating objects: 62, done.
remote: Counting objects: 100% (62/62), done.
remote: Compressing objects: 100% (59/59), done.
remote: Total 356047 (delta 29), reused 20 (delta 3), pack-reused 355985
Receiving objects: 100% (356047/356047), 191.65 MiB | 6.52 MiB/s, done.
Resolving deltas: 100% (283761/283761), done.
Checking connectivity... done.

$ ./panda/panda/scripts/install_ubuntu.sh
...
...
[ panda_install ] PANDA is built and ready to use in panda/build/[ arch ]-softmmu/qemu-system-[ arch ].
$

Включение анализа приложений Windows в PANDA
Запись и воспроизведение образа разработчика для Windows

В этом посте цель состоит в том, чтобы включить анализ произвольных приложений Windows, и первый шаг к достижению нашей цели - включить запись и воспроизведение исполнений Windows. Для этого нам нужен образ Windows, и мы получим его с официальной веб-страницы Microsoft, где они предлагают образы разработчиков для тестирования ваших приложений. Мы будем использовать одно из этих изображений, в данном случае это образ Windows 7, и преобразовать их в удобный формат - от VirtualBox-совместимого до QEMU-friendly. Сценарий ниже загрузит изображение и преобразует его в формат QCOW2, который может использоваться PANDA.

Код:
# Create a working directory
mkdir sandbox_base
cd sandbox_base

# Download the disk image from Microsofts' website
# (URL from https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)
wget https://az792536.vo.msecnd.net/vms/VMBuild_20150916/VirtualBox/IE8/IE8.Win7.VirtualBox.zip

# Unzip the virtualbox zip
unzip IE8.Win7.VirtualBox.zip

# Untar the .ova
tar -xvf IE8\ -\ Win7.ova

# Create a qcow image from the .vmdk file.
## First install qemu utils
sudo apt-get install qemu-utils

## Then create our image
qemu-img convert -O qcow2 IE8\ -\ Win7-disk1.vmdk IE8_win7_disk1.qcow2
chmod +x ./IE8_win7_disk1.qcow2

## Clean up some of the unnecessary files
rm IE8\ -\ Win7-disk1.vmdk
rm IE8\ -\ Win7.ova

Запустив этот скрипт, мы получаем образ qcow2, готовый к выполнению с помощью PANDA в IE8-win7-disk1.qcow. Чтобы проверить, способен ли PANDA выполнить наш образ, выполните команду $panda/build/i386-softmmu/qemu-system-i386 IE8-win7-disk1.qcow2, которая должна запустить компьютер с Windows. Предполагая, что всё работает, следующий шаг должен гарантировать, что мы можем записать и воспроизвести выполнение. Для этого достаточно просто запустить нашу виртуальную машину, а затем использовать команды PANDA begin_record NAME и end_record, где NAME - это просто произвольное имя, которое вы даете записи.

Процесс записи исполнения в PANDA показан в выводе ниже.

Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 ./IE8_win7_disk1.qcow2
QEMU 2.8.50 monitor - type 'help' for more information
(qemu) main-loop: WARNING: I/O thread spun for 1000 iterations

(qemu) begin_record sample
(qemu) writing snapshot:        ./sample-rr-snp
opening nondet log for write :  ./sample-rr-nondet.log

(qemu) end_record
(qemu) Time taken was: 17 seconds.
Checksum of guest memory: 0x13bbbcdb

$ ls -la
total 24767408
drwxrwx--- 1 root vboxsf        4096 Jul 16 10:23 .
drwxrwx--- 1 root vboxsf        4096 Jul 16 10:02 ..
-rwxrwx--- 1 root vboxsf 11149049856 Jul 16 10:23 IE8_win7_disk1.qcow2
-rwxrwx--- 1 root vboxsf  4573000704 Sep 23  2015 IE8 - Win7-disk1.vmdk
-rwxrwx--- 1 root vboxsf  4573019136 Sep 23  2015 IE8 - Win7.ova
-rwxrwx--- 1 root vboxsf       17138 Sep 23  2015 IE8 - Win7.ovf
-rwxrwx--- 1 root vboxsf  4497629147 Sep 23  2015 IE8.Win7.VirtualBox.zip
-rwxrwx--- 1 root vboxsf     1989146 Jul 16 10:23 sample-rr-nondet.log
-rwxrwx--- 1 root vboxsf   567470712 Jul 16 10:23 sample-rr-snp

Файлы, созданные PANDA, которые нам нужны для воспроизведения, приведены в sample-rr-nondet.log и sample-rr-snp. Файл sample-rr-snp содержит моментальный снимок памяти в начале записи, а файл sample-rr-nondet.log содержит входные данные для ЦП, необходимые для воспроизведения.

Наконец, для воспроизведения исполнения мы используем параметр командной строки -replay NAME, принятый qemu PANDA. Процесс воспроизведения исполнения, который мы только что записали, показан в выводе ниже.

Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 -replay sample
QEMU 2.8.50 monitor - type 'help' for more information
(qemu) loading snapshot
... done.
opening nondet log for read :   ./sample-rr-nondet.log
./sample-rr-nondet.log:  2420013644 instrs total.
sample:    24200159 (  1.00%) instrs.    0.94 sec.  1.55 GB ram.
sample:    48400287 (  2.00%) instrs.    1.32 sec.  1.56 GB ram.
sample:    72600415 (  3.00%) instrs.    1.57 sec.  1.57 GB ram.
sample:    96800548 (  4.00%) instrs.    1.86 sec.  1.57 GB ram.
sample:   121000684 (  5.00%) instrs.    2.20 sec.  1.58 GB ram.
sample:   145200825 (  6.00%) instrs.    2.45 sec.  1.58 GB ram.
sample:   169400959 (  7.00%) instrs.    2.86 sec.  1.59 GB ram.
sample:   193601097 (  8.00%) instrs.    3.13 sec.  1.59 GB ram.
sample:   217801234 (  9.00%) instrs.    3.43 sec.  1.60 GB ram.
sample:   242001368 ( 10.00%) instrs.    3.70 sec.  1.60 GB ram.
sample:   266201509 ( 11.00%) instrs.    4.04 sec.  1.60 GB ram.
sample:   290401644 ( 12.00%) instrs.    4.37 sec.  1.60 GB ram.
sample:   314601792 ( 13.00%) instrs.    4.76 sec.  1.61 GB ram.
sample:   338801916 ( 14.00%) instrs.    5.11 sec.  1.61 GB ram.
sample:   363002047 ( 15.00%) instrs.    5.44 sec.  1.61 GB ram.
sample:   387202184 ( 16.00%) instrs.    5.85 sec.  1.62 GB ram.
sample:   411402321 ( 17.00%) instrs.    6.36 sec.  1.64 GB ram.
sample:   435602458 ( 18.00%) instrs.    6.76 sec.  1.65 GB ram.
sample:   459802597 ( 19.00%) instrs.    7.13 sec.  1.65 GB ram.
sample:   484002729 ( 20.00%) instrs.    7.49 sec.  1.65 GB ram.
sample:   508202874 ( 21.00%) instrs.    8.04 sec.  1.66 GB ram.
sample:   532403004 ( 22.00%) instrs.    8.49 sec.  1.67 GB ram.
sample:   556603162 ( 23.00%) instrs.    8.80 sec.  1.67 GB ram.
sample:   580803278 ( 24.00%) instrs.    9.20 sec.  1.67 GB ram.
sample:   605003437 ( 25.00%) instrs.    9.61 sec.  1.68 GB ram.
sample:   629203557 ( 26.00%) instrs.    9.99 sec.  1.68 GB ram.
sample:   653403687 ( 27.00%) instrs.   10.34 sec.  1.68 GB ram.
sample:   677603838 ( 28.00%) instrs.   10.71 sec.  1.68 GB ram.
sample:   701803983 ( 29.00%) instrs.   11.07 sec.  1.68 GB ram.
sample:   726004095 ( 30.00%) instrs.   11.59 sec.  1.69 GB ram.
sample:   750204256 ( 31.00%) instrs.   12.00 sec.  1.69 GB ram.
sample:   774404373 ( 32.00%) instrs.   12.42 sec.  1.70 GB ram.
sample:   798604517 ( 33.00%) instrs.   12.89 sec.  1.70 GB ram.
sample:   822804653 ( 34.00%) instrs.   13.32 sec.  1.71 GB ram.
sample:   847004777 ( 35.00%) instrs.   13.64 sec.  1.71 GB ram.
sample:   871204927 ( 36.00%) instrs.   13.99 sec.  1.72 GB ram.
sample:   895405049 ( 37.00%) instrs.   14.23 sec.  1.72 GB ram.
sample:   919605204 ( 38.00%) instrs.   14.50 sec.  1.72 GB ram.
sample:   943805323 ( 39.00%) instrs.   14.86 sec.  1.72 GB ram.
sample:   968005462 ( 40.00%) instrs.   15.18 sec.  1.72 GB ram.
sample:   992205600 ( 41.00%) instrs.   15.65 sec.  1.72 GB ram.
sample:  1016405732 ( 42.00%) instrs.   16.02 sec.  1.72 GB ram.
sample:  1040605868 ( 43.00%) instrs.   16.43 sec.  1.73 GB ram.
sample:  1064806008 ( 44.00%) instrs.   16.92 sec.  1.74 GB ram.
sample:  1089006140 ( 45.00%) instrs.   17.50 sec.  1.75 GB ram.
sample:  1113206282 ( 46.00%) instrs.   17.80 sec.  1.75 GB ram.
sample:  1137406418 ( 47.00%) instrs.   18.23 sec.  1.75 GB ram.
sample:  1161606552 ( 48.00%) instrs.   18.65 sec.  1.76 GB ram.
sample:  1185806690 ( 49.00%) instrs.   19.06 sec.  1.76 GB ram.
sample:  1210006826 ( 50.00%) instrs.   19.39 sec.  1.76 GB ram.
sample:  1234206960 ( 51.00%) instrs.   19.58 sec.  1.76 GB ram.
sample:  1258407119 ( 52.00%) instrs.   19.75 sec.  1.76 GB ram.
sample:  1282607232 ( 53.00%) instrs.   19.90 sec.  1.76 GB ram.
sample:  1306807373 ( 54.00%) instrs.   20.16 sec.  1.76 GB ram.
sample:  1331007508 ( 55.00%) instrs.   20.37 sec.  1.76 GB ram.
sample:  1355207641 ( 56.00%) instrs.   20.61 sec.  1.76 GB ram.
sample:  1379407783 ( 57.00%) instrs.   20.84 sec.  1.76 GB ram.
sample:  1403607935 ( 58.00%) instrs.   21.03 sec.  1.76 GB ram.
sample:  1427808058 ( 59.00%) instrs.   21.28 sec.  1.76 GB ram.
sample:  1452008195 ( 60.00%) instrs.   21.42 sec.  1.76 GB ram.
sample:  1476208331 ( 61.00%) instrs.   21.73 sec.  1.76 GB ram.
sample:  1500408467 ( 62.00%) instrs.   21.97 sec.  1.76 GB ram.
sample:  1524608600 ( 63.00%) instrs.   22.24 sec.  1.76 GB ram.
sample:  1548808755 ( 64.00%) instrs.   22.49 sec.  1.77 GB ram.
sample:  1573008870 ( 65.00%) instrs.   22.75 sec.  1.77 GB ram.
sample:  1597209007 ( 66.00%) instrs.   23.01 sec.  1.77 GB ram.
sample:  1621409143 ( 67.00%) instrs.   23.26 sec.  1.77 GB ram.
sample:  1645609281 ( 68.00%) instrs.   23.54 sec.  1.77 GB ram.
sample:  1669809415 ( 69.00%) instrs.   23.81 sec.  1.77 GB ram.
sample:  1694009557 ( 70.00%) instrs.   24.12 sec.  1.77 GB ram.
sample:  1718209694 ( 71.00%) instrs.   24.38 sec.  1.77 GB ram.
sample:  1742409825 ( 72.00%) instrs.   24.66 sec.  1.77 GB ram.
sample:  1766609962 ( 73.00%) instrs.   24.90 sec.  1.77 GB ram.
sample:  1790810100 ( 74.00%) instrs.   25.10 sec.  1.77 GB ram.
sample:  1815010235 ( 75.00%) instrs.   25.31 sec.  1.77 GB ram.
sample:  1839210376 ( 76.00%) instrs.   25.53 sec.  1.77 GB ram.
sample:  1863410512 ( 77.00%) instrs.   25.73 sec.  1.77 GB ram.
sample:  1887610645 ( 78.00%) instrs.   25.97 sec.  1.77 GB ram.
sample:  1911810792 ( 79.00%) instrs.   26.18 sec.  1.77 GB ram.
sample:  1936010916 ( 80.00%) instrs.   26.50 sec.  1.78 GB ram.
sample:  1960211054 ( 81.00%) instrs.   26.75 sec.  1.78 GB ram.
sample:  1984411191 ( 82.00%) instrs.   27.04 sec.  1.78 GB ram.
sample:  2008611326 ( 83.00%) instrs.   27.37 sec.  1.78 GB ram.
sample:  2032811464 ( 84.00%) instrs.   27.59 sec.  1.78 GB ram.
sample:  2057011604 ( 85.00%) instrs.   27.83 sec.  1.78 GB ram.
sample:  2081211751 ( 86.00%) instrs.   28.10 sec.  1.78 GB ram.
sample:  2105411880 ( 87.00%) instrs.   28.48 sec.  1.78 GB ram.
sample:  2129612008 ( 88.00%) instrs.   28.72 sec.  1.79 GB ram.
sample:  2153812144 ( 89.00%) instrs.   29.03 sec.  1.79 GB ram.
sample:  2178012287 ( 90.00%) instrs.   29.23 sec.  1.79 GB ram.
sample:  2202212431 ( 91.00%) instrs.   29.52 sec.  1.79 GB ram.
sample:  2226412555 ( 92.00%) instrs.   29.71 sec.  1.79 GB ram.
sample:  2250612689 ( 93.00%) instrs.   29.91 sec.  1.79 GB ram.
sample:  2274812829 ( 94.00%) instrs.   30.09 sec.  1.79 GB ram.
sample:  2299012962 ( 95.00%) instrs.   30.30 sec.  1.79 GB ram.
sample:  2323213104 ( 96.00%) instrs.   30.48 sec.  1.79 GB ram.
sample:  2347413235 ( 97.00%) instrs.   30.67 sec.  1.79 GB ram.
sample:  2371613380 ( 98.00%) instrs.   30.86 sec.  1.79 GB ram.
sample:  2395813517 ( 99.00%) instrs.   31.04 sec.  1.79 GB ram.
./sample-rr-nondet.log:  log is empty.
./sample-rr-nondet.log:  log is empty.
Replay completed successfully. 1
Time taken was: 32 seconds.
Stats:
RR_INPUT_1 number = 0, size = 0 bytes
RR_INPUT_2 number = 0, size = 0 bytes
RR_INPUT_4 number = 7256, size = 101584 bytes
RR_INPUT_8 number = 33198, size = 597564 bytes
RR_INTERRUPT_REQUEST number = 6113, size = 85582 bytes
RR_EXIT_REQUEST number = 0, size = 0 bytes
RR_SKIPPED_CALL number = 570, size = 1204398 bytes
RR_END_OF_LOG number = 1, size = 10 bytes
RR_PENDING_INTERRUPTS number = 0, size = 0 bytes
RR_EXCEPTION number = 0, size = 0 bytes
max_queue_len = 133
Checksum of guest memory: 0x13bbbcdb
Replay completed successfully 2.

$

Разборка Windows для быстрого анализа
Эмуляция - это трудоемкий процесс, и желательно ускориться местах, которые очевидны. Особая стратегия, которая может ускорить эмуляцию, состоит в том, чтобы настроить гостевую систему в максимально ориентированное на производительность состояние. Мы можем сделать это с системами Windows, ограничив количество визуальных эффектов следующими шагами:
  1. Нажмите кнопку "Домой"
  2. Щелкните правой кнопкой мыши на "Мой компьютер"
  3. Выберите "Свойства"
  4. Перейдите к "Информация о производительности и инструменты"
  5. Выберите "Настроить визуальные эффекты"
  6. Выберите опцию "Настроить для лучшей производительности" и нажмите "Применить".
В этот момент вы увидите, как графический интерфейс Windows меняется на более примитивный, очень похожий на интерфейс Windows-2000.

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

Структура, которую мы настроим, состоит в том, чтобы передавать целевое приложение на виртуальную машину через виртуальный CD-ROM в QEMU, а затем выполнять команды на нашей виртуальной машине, отправляя соответствующие нажатия клавиш виртуальной машине. Это реализовано фреймворком malrec от Брендана Долана-Гавитта здесь .

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

Чтобы создать снимок, запустите виртуальную машину в PANDA и запустите интерфейс командной строки Windows в гостевой среде, достигнув состояния, показанного на следующем рисунке.

3.png


На этом этапе введите savevm в интерфейсе командной строки QEMU, чтобы сохранить состояние виртуальной машины:

Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 ./IE8_win7_disk1.qcow2
QEMU 2.9.1 monitor - type 'help' for more information
(qemu) savevm

Это создает моментальный снимок состояния, который мы можем запустить мгновенно, и поскольку командная строка находится в "фокусе" гостя, мы можем управлять гостевым компьютером извне, отправляя нажатия клавиш на машину. Для запуска снимка мы используем -loadvmflag, как показано в следующей команде:

Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 ./IE8_win7_disk1.qcow2 -loadvm 1

Архитектура окружающей инфраструктуры
Запись исполнения образца

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


Код:
 copy D:\\sample C:\\Users\\IEUser\\Desktop\\sample.exe
 start C:\\Users\\IEUser\\Desktop\\sample.exe

Следующий скрипт Python автоматизирует этот процесс:

Код:
import os
import sys
import time
import subprocess
import argparse
import string
import shutil

# Configs
PANDA_BASE = os.path.join(os.path.realpath(__file__), "panda")
PANDA_x86 = os.path.join(PANDA_BASE, "build", "i386-softmmu", "qemu-system-i386")
IMG_PATH = os.path.join(os.path.realpath(__file__), "sandbox_base/IE8_win7_disk1.qcow2")

PANDA_flags = [
        "-monitor", "stdio",
        "-show-cursor",
        "-m", "8192",
        "-loadvm", "1",
        IMG_PATH
    ]
TIME_TO_EXECUTE = 20

def log_info(msg):
    print("[ + ] %s"%(msg))

def log_exit(msg):
    print("[ - ] %s"%(msg))
    exit(0)

def guest_type(s, p):

    keymap = {
        '-': 'minus',
        '=': 'equal',
        ' [ ': 'bracket_left',
        ' ] ': 'bracket_right',
        ';': 'semicolon',
        '\'': 'apostrophe',
        '\\': 'backslash',
        ',': 'comma',
        '.': 'dot',
        '/': 'slash',
        '*': 'asterisk',
        ' ': 'spc',
        '_': 'shift-minus',
        '+': 'shift-equal',
        '{': 'shift-bracket_left',
        '}': 'shift-bracket_right',
        ':': 'shift-semicolon',
        '"': 'shift-apostrophe',
        '|': 'shift-backslash',
        '<': 'shift-comma',
        '>': 'shift-dot',
        '?': 'shift-slash',
        '\n': 'ret',
    }

    for c in s:
        if c in string.ascii_uppercase:
            key = 'shift-' + c.lower()
        else:
            key = keymap.get(c, c)

        p.stdin.write("sendkey %s\n"%(key))
        time.sleep(.5)

def record_execution(sample, recording_time):
    '''
    
    '''
    log_info("Recording execution %s"%(sample))
    log_info("Recording for %d seconds"%(recording_time))


    # Create new temporary sample
    new_sample = "sample"
    shutil.copy(sample, new_sample)


    # Create an ISO file of the sample file
    cmd = []
    cmd.append("/usr/bin/genisoimage")
    cmd.append("-iso-level")
    cmd.append("4")
    cmd.append("-l")
    cmd.append("-R")
    cmd.append("-J")
    cmd.append("-o")
    cmd.append("sample.iso")
    cmd.append(new_sample)   

    try:
        subprocess.check_call(cmd)
        log_info("Made an iso file for the sample")
    except Exception:
        print(traceback.format_exc())
        print(sys.exc_info()[ 0 ])
        log_exit("Could not make any iso file for the sample")

    # Launch PANDA
    cmd = []
    cmd.append(PANDA_x86)
    for flag in PANDA_flags:
        cmd.append(flag)

    panda_stdout_path = "panda.stdout"
    panda_stderr_path = "panda.stderr"
    panda_stdout = open(panda_stdout_path, 'w+')
    panda_stderr = open(panda_stderr_path, 'w+')

    #log_info("Executing command: %s"%(" ".join(cmd)))
    p = subprocess.Popen(cmd,
            stdin = subprocess.PIPE,
            stdout = panda_stdout,
            stderr = panda_stderr)

    p.stdin.write("MARK\n")

    # Check whenever the virtual machine is ready for us to interact with it.
    f_out = open(panda_stdout_path, "r")
    while True:
        content = f_out.read()
        if "MARK" in content:
            log_info("VM started") 
            break
        f_out.seek(0)
        time.sleep(0.5)

    # Sleep for 1 second
    time.sleep(1)

    # Configure QEMU so the sample.iso file is mounted in the cdrom.
    p.stdin.write("change ide1-cd0 sample.iso\n")   

    # Sleep for 3 seconds
    time.sleep(5)

    # Because the cd-rom was mounted, a window in the guest was opened,
    # close this window now by sending the escape key to the guest.
    p.stdin.write("sendkey esc\n")
    
    # Write the command in the guest command line interface to
    # copy the sample in the cd-rom drive onto the guest desktop.
    copy_cmd = " copy D:\\sample C:\\Users\\IEUser\\Desktop\\sample.exe\n"
    guest_type(copy_cmd, p)

    # Sleep for 5 seconds to make sure the guest finished it's tasks.
    time.sleep(5)

    # Start writing the command that will execute the sample inside
    # the guest machine. Notice that we don't actually execute the command
    # as there is no \n at the end of the line. We do this because we want to
    # start recording the guest execution before the application executes
    start_cmd = "start C:\\Users\\IEUser\\Desktop\\sample.exe"
    guest_type(start_cmd, p)

    # Now begin recording before we launch the above command
    p.stdin.write("begin_record sample\n")
    
    # Now send the final \n that will launch the execution command.
    guest_type("\n", p)     

    log_info("Started recording and executed the sample in the guest machine")


    log_info("Recording for: %d seconds"%(TIME_TO_EXECUTE))
    time.sleep(TIME_TO_EXECUTE)

    # End the record
    p.stdin.write("end_record\n")

    # Exit the VM
    p.stdin.write("q\n")

    log_info("Recording is over, shutting the VM down")
    p.stdin.write("q\n")
    time.sleep(3)

    while True:
        poll = p.poll()
        if poll == None:
            time.sleep(1)
        else:
            log_info("VM is shut down")
            break

    log_info("Finished recording the sample execution")

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument(
            "-sample",
            help = "The sample to executed",
            required = True)

    parser.add_argument(
            "-time",
            help = "The number of seconds to record an execution",
            type = int,
            default = 25)

    args = parser.parse_args(args = sys.argv[1:])

    record_execution(args.sample, args.time)

Мы можем использовать этот сценарий следующим образом, где аргумент -sample указывает путь в хост-системе к сэмплу, который будет выполнен во время записи.

Код:
$ python vm_record.py -sample ./sample_app/msg_app.exe
[+] Recording execution msg_app.exe
[+] Recording for 25 seconds
Warning: Creating ISO-9660:1999 (version 2) filesystem.
Warning: ISO-9660 filenames longer than 31 may cause buffer overflows in the OS.
Total translation table size: 0
Total rockridge attributes bytes: 247
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
191 extents written (0 MB)
[+] Made an iso file for the sample
[+] VM started
[+] Started recording and executed the sample in the guest machine
[+] Recording for: 20 seconds
[+] Recording is over, shutting the VM down
[+] VM is shut down
[+] Finished recording the sample execution

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

Код:
import os
import sys
import subprocess
import argparse
import time

# Configs
PANDA_BASE = os.path.join(os.path.realpath(__file__), "panda")
PANDA_x86 = os.path.join(PANDA_BASE, "build", "i386-softmmu", "qemu-system-i386")
IMG_PATH = os.path.join(os.path.realpath(__file__), "sandbox_base/IE8_win7_disk1.qcow2")

PANDA_flags = [
        "-monitor", "stdio",
        "-show-cursor",
        "-m", "8192",
    ]

# The PADNA plugins we would like to use
PANDA_plugins = []

def log_info(msg):
    print("[+] %s"%(msg))

def log_exit(msg):
    print("[-] %s"%(msg))
    exit(0)

def replay_recording(snapshot_name):
    '''
    Replays a recording
    '''
    
    log_info("Replaying %s"%(snapshot_name))

    # Launch PANDA
    cmd = []
    cmd.append(PANDA_x86)
    cmd.append("-replay")
    cmd.append(snapshot_name)
    
    for flag in PANDA_flags:
        cmd.append(flag)

    for plugin_cmdline in PANDA_plugins:
        cmd.append(plugin_cmdline)

    # Output files
    panda_stdout_path = "replay_panda.stdout"
    panda_stderr_path = "replay_panda.stderr"
    panda_stdout = open(panda_stdout_path, 'w+')
    panda_stderr = open(panda_stderr_path, 'w+')

    log_info("Launching replay %s"%(" ".join(cmd)))
    try:
        p = subprocess.Popen(
                " ".join(cmd),
                shell=True,
                stdout = panda_stdout,
                stderr = panda_stderr,
                preexec_fn = os.setsid)
    except:
        log_exit("Could not complete replay")

    log_info("Replay launched")

    while True:
        poll = p.poll()
        if poll == None:
            time.sleep(1)
        else:
            log_info("Replaying finished")
            break

    log_info("Analysis process finished, exiting")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument(
            "-recording",
            help = "The name of the recording to replay",
            required = True)

    args = parser.parse_args(args = sys.argv[1:])
    replay_recording(args.recording)

Мы можем использовать этот сценарий следующим образом, где -recording указывает имя записи, которую мы хотим воспроизвести.

Код:
$ python vm_replay.py -recording sample
[ + ] Replaying sample
[ + ] Launching replay /home/davkor/code/panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 -replay sample
[ + ] Replay launched
[ + ] Replaying finished
[ + ] Analysis process finished, exiting

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

Мониторинг процессов нашей системы
Первый шаг, который мы предпринимаем - это использование двух плагинов для интроспекции виртуальной машины (VMI) PANDA, osi и win7x86intro, для мониторинга процессов, которые выполняются в записанной системе. Самоанализ виртуальной машины - это метод, который позволяет нам интерпретировать состояние гостевой системы исключительно на основе интерпретации гостевого оборудования. Мы должны сделать это, потому что мы делаем весь наш анализ вне системы, которую мы контролируем. Дополнительным преимуществом этого является то, что гостевая система остается относительно прозрачной по сравнению с размещением специфических для анализа артефактов в гостевой системе, таких как драйвер анализа. Недостатком является то, что мы должны выводить абстракции на уровне ОС исключительно из наблюдения за памятью, и мы не можем использовать для этого обычные API, предоставляемые Windows.

Подход, который мы используем, заключается в расширении нашего сценария vm_replay.py для поддержки запуска плагинов, когда мы воспроизводим выполнение. Причина, по которой мы это делаем, заключается в том, что командные строки PANDA могут быстро стать очень длинными и утомительными для работы, поэтому мы предпочитаем контролировать использование плагинов более программным способом.

Код:
"-panda osi -os windows-32-7 -panda win7x86intro -panda osi_test"

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

Код:
import os
import sys
import subprocess
import argparse
import time

# Configs
PANDA_BASE = os.path.join(os.path.realpath(__file__), "panda")
PANDA_x86 = os.path.join(PANDA_BASE, "build", "i386-softmmu", "qemu-system-i386")
IMG_PATH = os.path.join(os.path.realpath(__file__), "sandbox_base/IE8_win7_disk1.qcow2")

PANDA_flags = [
        "-monitor", "stdio",
        "-show-cursor",
        "-m", "8192",
    ]

# The PADNA plugins we would like to use
PANDA_plugins = [
        "-panda osi -os windows-32-7 -panda win7x86intro -panda osi_test"
    ]

def log_info(msg):
    print("[+] %s"%(msg))

def log_exit(msg):
    print("[-] %s"%(msg))
    exit(0)

def replay_recording(snapshot_name):
    '''
    Replays a recording
    '''
    
    log_info("Replaying %s"%(snapshot_name))

    # Launch PANDA
    cmd = []
    cmd.append(PANDA_x86)
    cmd.append("-replay")
    cmd.append(snapshot_name)
    
    for flag in PANDA_flags:
        cmd.append(flag)

    for plugin_cmdline in PANDA_plugins:
        cmd.append(plugin_cmdline)

    # Output files
    panda_stdout_path = "replay_panda.stdout"
    panda_stderr_path = "replay_panda.stderr"
    panda_stdout = open(panda_stdout_path, 'w+')
    panda_stderr = open(panda_stderr_path, 'w+')

    log_info("Launching replay %s"%(" ".join(cmd)))
    try:
        p = subprocess.Popen(
                " ".join(cmd),
                shell=True,
                stdout = panda_stdout,
                stderr = panda_stderr,
                preexec_fn = os.setsid)
    except:
        log_exit("Could not complete replay")

    log_info("Replay launched")

    while True:
        poll = p.poll()
        if poll == None:
            time.sleep(1)
        else:
            log_info("Replaying finished")
            break

    log_info("Analysis process finished, exiting")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument(
            "-recording",
            help = "The name of the recording to replay",
            required = True)

    args = parser.parse_args(args = sys.argv[1:])
    replay_recording(args.recording)

Мы можем использовать этот скрипт следующим образом:

Код:
$ python vm_replay.py -recording sample
[+] Replaying sample
[+] Launching replay /home/davkor/code/panda/build/i386-softmmu/qemu-system-i386 -replay sample -monitor stdio -show-cursor -m 8192 -panda osi -os windows-32-7 -panda win7x86intro -panda osi_test
[+] Replay launched
[+] Replaying finished
[+] Analysis process finished, exiting
$ cat ./replay_panda.stdout                                                                                   
QEMU 2.9.1 monitor - type 'help' for more information
(qemu) OSI grabbing Windows introspection backend.
loading snapshot
... done.
opening nondet log for read :   ./sample-rr-nondet.log
Current process: drvinst.exe PID:1592 PPID:556

Process list (46 procs):
  System                4       0
  smss.exe              224     4
  csrss.exe             296     288
  wininit.exe           332     288
  csrss.exe             344     324
  services.exe          400     332
  lsass.exe             416     332
  lsm.exe               424     332
  winlogon.exe          432     324
  svchost.exe           556     400
  svchost.exe           632     400
  svchost.exe           680     400
  svchost.exe           800     400
  svchost.exe           844     400
  svchost.exe           932     400
  userinit.exe          1076    432
  explorer.exe          1084    1076
  dwm.exe               1140    800
  svchost.exe           1196    400
  BGINFO.EXE            1284    1084
  spoolsv.exe           1376    400
  taskhost.exe          1412    400
  svchost.exe           1468    400
  cmd.exe               1552    1084
  conhost.exe           1560    344
  vmicsvc.exe           1660    400
  vmicsvc.exe           1692    400
  vmicsvc.exe           1740    400
  vmicsvc.exe           1776    400
  vmicsvc.exe           1804    400
  svchost.exe           1832    400
  cygrunsrv.exe         1976    400
  wlms.exe              2028    400
  cygrunsrv.exe         880     1976
  conhost.exe           1020    296
  sshd.exe              1136    880
  sppsvc.exe            1052    400
  sppsvc.exe            1052    400
  drvinst.exe           1280    556
  drvinst.exe           756     556
  drvinst.exe           1536    556
  SearchIndexer.        1512    400
  drvinst.exe           1592    556
  svchost.exe           1932    400
  dllhost.exe           2104    556
  rundll32.exe          2112    556
  dinotify.exe          2128    1296

-------------------------------------------------

Dynamic libraries list (24 libs):
        0x00a50000      266240  DrvInst.exe              C:\Windows\system32\DrvInst.exe
        0x77800000      1314816 ntdll.dll                C:\Windows\SYSTEM32\ntdll.dll
        0x75c40000      868352  kernel32.dll             C:\Windows\system32\kernel32.dll
        0x75bc0000      307200  KERNELBASE.dll           C:\Windows\system32\KERNELBASE.dll
        0x76180000      704512  msvcrt.dll               C:\Windows\system32\msvcrt.dll
        0x77460000      1691648 SETUPAPI.dll             C:\Windows\system32\SETUPAPI.dll
        0x75c10000      159744  CFGMGR32.dll             C:\Windows\system32\CFGMGR32.dll
        0x75f60000      663552  RPCRT4.dll               C:\Windows\system32\RPCRT4.dll
        0x75d70000      659456  ADVAPI32.dll             C:\Windows\system32\ADVAPI32.dll
        0x77950000      102400  sechost.dll              C:\Windows\SYSTEM32\sechost.dll
        0x777b0000      319488  GDI32.dll                C:\Windows\system32\GDI32.dll
        0x76640000      823296  USER32.dll               C:\Windows\system32\USER32.dll
        0x77a20000      40960   LPK.dll                  C:\Windows\system32\LPK.dll
        0x76440000      643072  USP10.dll                C:\Windows\system32\USP10.dll
        0x77680000      585728  OLEAUT32.dll             C:\Windows\system32\OLEAUT32.dll
        0x76010000      1425408 ole32.dll                C:\Windows\system32\ole32.dll
        0x75980000      73728   DEVOBJ.dll               C:\Windows\system32\DEVOBJ.dll
        0x750f0000      57344   devrtl.DLL               C:\Windows\system32\devrtl.DLL
        0x77a30000      126976  IMM32.DLL                C:\Windows\system32\IMM32.DLL
        0x76570000      835584  MSCTF.dll                C:\Windows\system32\MSCTF.dll
        0x74f70000      86016   SPINF.dll                C:\Windows\system32\SPINF.dll
        0x75a60000      192512  WINTRUST.dll             C:\Windows\system32\WINTRUST.dll
        0x75a90000      1183744 CRYPT32.dll              C:\Windows\system32\CRYPT32.dll
        0x75970000      49152   MSASN1.dll               C:\Windows\system32\MSASN1.dll

Kernel module list (130 modules):
        0x82851000      4235264 ntoskrnl.exe             \SystemRoot\system32\ntoskrnl.exe
        0x8281a000      225280  hal.dll                  \SystemRoot\system32\halmacpi.dll
        0x80bb2000      32768   kdcom.dll                \SystemRoot\system32\kdcom.dll
        0x8b404000      544768  mcupdate.dll             \SystemRoot\system32\mcupdate_GenuineIntel.dll
        0x8b489000      69632   PSHED.dll                \SystemRoot\system32\PSHED.dll
        0x8b49a000      32768   BOOTVID.dll              \SystemRoot\system32\BOOTVID.dll
        0x8b4a2000      270336  CLFS.SYS                 \SystemRoot\system32\CLFS.SYS
        0x8b4e4000      421888  CI.dll                   \SystemRoot\system32\CI.dll
        0x8b54b000      528384  Wdf01000.sys             \SystemRoot\system32\drivers\Wdf01000.sys
        0x8b5cc000      57344   WDFLDR.SYS               \SystemRoot\system32\drivers\WDFLDR.SYS
        0x8b5da000      294912  ACPI.sys                 \SystemRoot\system32\drivers\ACPI.sys
        0x8b622000      36864   WMILIB.SYS               \SystemRoot\system32\drivers\WMILIB.SYS
        0x8b62b000      32768   msisadrv.sys             \SystemRoot\system32\drivers\msisadrv.sys
        0x8b633000      172032  pci.sys                  \SystemRoot\system32\drivers\pci.sys
        0x8b65d000      45056   vdrvroot.sys             \SystemRoot\system32\drivers\vdrvroot.sys
        0x8b668000      69632   partmgr.sys              \SystemRoot\System32\drivers\partmgr.sys

....
....
....

-------------------------------------------------

Current process: sample.exe PID:2312 PPID:1552

Process list (47 procs):
  System              4    0
  smss.exe            224    4
  csrss.exe           296    288
  wininit.exe         332    288
  csrss.exe           344    324
  services.exe        400    332
  lsass.exe           416    332
  lsm.exe             424    332
  winlogon.exe        432    324
  svchost.exe         556    400
  svchost.exe         632    400
  svchost.exe         680    400
  svchost.exe         800    400
  svchost.exe         844    400
  svchost.exe         932    400
  userinit.exe        1076    432
  explorer.exe        1084    1076
  dwm.exe             1140    800
  svchost.exe         1196    400
  BGINFO.EXE          1284    1084
  spoolsv.exe         1376    400
  taskhost.exe        1412    400
  svchost.exe         1468    400
  cmd.exe             1552    1084
  conhost.exe         1560    344
  vmicsvc.exe         1660    400
  vmicsvc.exe         1692    400
  vmicsvc.exe         1740    400
  vmicsvc.exe         1776    400
  vmicsvc.exe         1804    400
  svchost.exe         1832    400
  cygrunsrv.exe       1976    400
  wlms.exe            2028    400
  cygrunsrv.exe       880    1976
  conhost.exe         1020    296
  sshd.exe            1136    880
  sppsvc.exe          1052    400
  drvinst.exe         1280    556
  drvinst.exe         756    556
  drvinst.exe         1536    556
  SearchIndexer.      1512    400
  drvinst.exe         1592    556
  svchost.exe         1932    400
  dllhost.exe         2104    556
  rundll32.exe        2112    556
  dinotify.exe        2128    1296
  sample.exe          2312    1552

-------------------------------------------------

No mapped dynamic libraries.

Kernel module list (130 modules):
    0x82851000    4235264    ntoskrnl.exe             \SystemRoot\system32\ntoskrnl.exe
    0x8281a000    225280    hal.dll                  \SystemRoot\system32\halmacpi.dll
    0x80bb2000    32768    kdcom.dll                \SystemRoot\system32\kdcom.dll
    0x8b404000    544768    mcupdate.dll             \SystemRoot\system32\mcupdate_GenuineIntel.dll
    0x8b489000    69632    PSHED.dll                \SystemRoot\system32\PSHED.dll
    0x8b49a000    32768    BOOTVID.dll              \SystemRoot\system32\BOOTVID.dll
    0x8b4a2000    270336    CLFS.SYS                 \SystemRoot\system32\CLFS.SYS
    0x8b4e4000    421888    CI.dll                   \SystemRoot\system32\CI.dll
    0x8b54b000    528384    Wdf01000.sys             \SystemRoot\system32\drivers\Wdf01000.sys
    0x8b5cc000    57344    WDFLDR.SYS               \SystemRoot\system32\drivers\WDFLDR.SYS
    0x8b5da000    294912    ACPI.sys                 \SystemRoot\system32\drivers\ACPI.sys
    0x8b622000    36864    WMILIB.SYS               \SystemRoot\system32\drivers\WMILIB.SYS
    0x8b62b000    32768    msisadrv.sys             \SystemRoot\system32\drivers\msisadrv.sys
    0x8b633000    172032    pci.sys                  \SystemRoot\system32\drivers\pci.sys

...
...
...

Обратите внимание, что вывод в ./replay_panda.stdout становится довольно большим, так как состояние системы печатается каждый раз, когда происходит переключение контекста. В частности, размер моего выходного файла был 236 МБ. Кроме того, мы можем видеть в выводе все процессы, выполняющиеся в системе, библиотеки DLL, загруженные текущим выполняющимся процессом, а также модули ядра. Из вырезанного вывода мы показываем, что PANDA правильно наблюдает за выполнением нашего процесса sample.exe, что подтверждает нам, что наш процесс действительно выполнялся внутри системы.

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

Выводы
В этой статье мы рассмотрели, как настроить среду анализа с помощью PANDA, которая позволяет нам проводить удобный анализ системы, которая запускает данное приложение по нашему выбору. В этом небольшом путешествии мы рассмотрели несколько тем, а именно: (0) вводный обзор PANDA, (1) включение анализа на основе Windows с помощью PANDA, (2) создание подходящей инфраструктуры записи и воспроизведения вокруг PANDA и, наконец, (3) пример того, как использовать существующий плагин PANDA для извлечения артефактов гостевой системы.

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

Переведено специально для https://xss.pro
Переводчик статьи - https://xss.pro/members/177895/
Оригинал -
https://adalogics.com/blog/Building-a-custom-malware-sandbox-with-PANDA-Part-1
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх