Windows, в основном, написана на языке программирования С.
В данном языке (соответственно и в памяти Windows) имеется такой тип данных как структура (тип данных, объединяющий несколько полей определённого типа (integer, boolean и т.п.). Из структур создаются конкретные объекты (в т.ч. процессы, дескрипторы файлов, сокеты и т.п.).
Таким образом задача исследования дампа памяти Windows сводится к поиску указанных выше структур и изучению их свойств (например, таких свойств как название запущенного процесса, время его запуска и т.п.).
Структура _KPRCB (Processor Region Control Block) содержит адреса текущего активного потока, следующего запланированного потока и простаивающего потока. Виртуальной адрес этой структуры в ОС известен.
Каждый поток представлен объектом структуры _ETHREAD, который в свою очередь содержит объект структуры _KTHREAD.
_KTHREAD содержит ссылку на процесс (объект структуры _EPROCESS), к которому относится этот поток.
Как сказано выше каждый процесс представлен объектом структуры _EPROCESS.
Структуры _EPROCESS хранятся в невыгружаемом пуле памяти.
В каждом объекте структуры _EPROCESS имеется поле ActiveProcessLinks с указателем на структуру _LIST_ENTRY из двух элементов с ссылками на предыдущий и следующий процессы (предыдущий _EPROCESS и следующий _EPROCESS).
То есть последовательность _EPROCESS образуют двусвязный список.
Ссылка на первый (головной) элемент двусвязного списка (это первый процесс – system) содержится в символе (переменной) PsActiveProcessHead.
Символы (символы отладки) это текстовое обозначение (облегчает читаемость отладочной информации) адресов входов функций, переменных и т.п.
Информация о PsActiveProcessHead содержится в KDBG – структуре ядра Windows с отладочной информацией.
Каждый процесс имеет:
_ETHREAD - каждый процесс имеет минимум 1 поток. Таким образом через перечень всех потоков (объект _ETHREAD) можно выйти на все процeссы.
CSRSS - так как CSRSS создаёт все процессы и потоки (кроме себя самого и запущенного до него) в его памяти имеется информация о них.
PspCid - в таблице ядра PspCid (отладочная информация) содержатся ссылки на все процессы и потоки
SessionProcessLinks - процессы пользовательской сессии
tagDesktop - процессы рабочего стола
В общем поиск каких либо объектов в памяти (процессов и т.п.) можно выполнить следующими способами:
Volatility может работать с:
Функциональность volatility строится на плагинах – по это сути команды, которые позволяют получить из дампа те или иные сведения (в составе volatility таких плагинов около 200).
Если, к примеру, установить т.н. Windows Standalone Executable пакет volatility, например с сайта volatility или через менеджер пакетов chocolatey, то в такой версии volatility может не оказаться профилей с последними версиями Windows.
Поэтому лучше выполнить установку следующим образом.
Установить python можно через chocolatey или через обычный инсталлятор.
pip install openpyxl
pip install ujson
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
На этом установка закончена и перейдя в папку с volatility можно запускать этот фреймворк скриптом vol.py.
Дамп проще всего создать с помощью программы dumpit из пакета Comae-Toolkit. Скачать этот пакет можно с следующей страницы comae(требуется регистрация).
Для создания дампа памяти достаточно запустить файл dumpite.exe.
Дамп сохранится в текущей директории.
На диске должно быть столько свободного места, какой размер ОЗУ.
Для указания профиля ОС в volatility, нужно узнать версию исследуемой ОС и ее билд.
winver
Эту информацию можно записать в имени файла дампа.
Запуск сервера
dumpite.exe /l /f дамп.raw
Передача данных на сервер
dumpit.exe /t сервер /s 1 /rc4 ключ
Опция сервер это IP-адрес сервера
Дешифровка дампа на сервере
dumpit.exe /rc4 ключ /unpack зашифрованный.raw расшифрованный.raw
Winpmem сохраняет несколько потоков информации в контейнере (формат AFF4 - архив файлов (может быть сжатым или нет), данный формат читается с помощью recall).
В этих потоках, помимо дампа всей памяти, имеется метаинформация, данные отдельных драйверов и т.п. Соответственно с дампом памяти в контейнере winpmem volatility (который, как сказано выше, содержит не только дамп памяти) напрямую не может работать.
Что бы volatility прочитал дамп, созданный winpmem нужно сохранить результат работы данной утилиты в «сыром» (raw) формате и указать папку в которую производится сохранение:
winpmem --format raw -o папка\
или
winpmem --format raw -o фай.zip
Если первым способом дамп не удастся получить, то можно использовать вторую команду. Для использования, созданного указанной выше (второй) командой, дампа его надо будет разархивировать и в открытом архиве найти самый большой файл – собственно это и будет нужный нам дамп.
Для тех утилит анализа дампа, которые могут напрямую работать с форматом AFF4 дамп памяти можно создать так
winpmem_1.3.exe -o дамп.raw
Перед началом исследования дампа памяти в volatility, нужно подобрать подходящий профиль операционной системы.
Перечень поддерживаемых volatility профилей
python.exe vol.py --info
Профиль - это запись вида Win10x64_17763.
В списке необходимо найти подходящий профиль и проверить что он работает. Самый простой способ проверки выполнить команду
python.exe vol.py -f дамп.dmp --profile=профиль pstree
На запущенной исследуемой машине
По метаинформации о дампе памяти
python.exe vol.py -f дамп --imageinfo
По информации отладчика в ядре (работает очень медленно)
python.exe vol.py -f дамп --kdbgscan
В крайнем случае можно перебирать разные профили, пока не найдется подходящий и в выводе плагина pstree (команда выше) не будут отображаться корректные названия процессов.
В общем случае с помощью volatility следует выполнить:
python.exe vol.py -h
python.exe vol.py плагин --help
python.exe vol.py -f дамп --profile=профиль плагин > файл
или (может вывести результат не только в текстовом формате)
python.exe vol.py -f дамп --profile=профиль плагин --output-file=файл
При этом надо учитывать возможность маскировки нелегитимных процессов под легитимные.
Для этого надо знать названия таких процессов, стандартное расположение их исполняемых файлов, порядок запуска этих процессов при старте ОС, и кто из них для кого является родителем/потомком.
Перечень процессов извлекается из двусвязного списка на первый элемент которого указывает символ PsActiveProcessHead.
Этот плагин не позволяют обнаружить завершённые и скрытые процессы (скрытые с помощью техники direct kernel object manipulation - DKOM) так как производят поиск в двусвязном списке процессов.
В выводе pslist Offset (V) это смещение виртуального (V) адрес объекта (структуры) _EPROCESS ядра.
Это смещение необходимо для указания в качестве параметра некоторых других плагинов volatility (когда такой плагин должен выдавать информацию о конкретном процессе). :
Начиная с Windows XP и 2003 сессия 0 изолирована от пользовательских сессий (то есть в современных ОС всегда будет 0 сессия и по сессии на каждого работающего в системе пользователя)
python vol.py -f дамп --profile=профиль pslist
Аналогичен pslist, но графически (отступами и точками) отображает связь родительских
Сканирует дамп и ищет в ней объекты_EPROCESS (может выявить скрытые процессы).
python vol.py -f дамп --profile=профиль psscan
python vol.py -f дамп --profile=профиль --output=dot --output-file=результат.dot
Просмотреть вывод в формате .dot можно с помощью программы Graphviz.
Плагин psxview позволяет сопоставить результаты работы плагинов, показывающих информацию о процессах.
Опция –apply-rules выводит Ok если отсутствие процесс не найденного каким-либо плагином является нормальным в силу особенностей данного процесса (например, если он и не должен присутствовать в структуре, которую исследует)
Этот плагин получает список DLL из двусвязанного списка (структура _LDR_DATA_TABLE_ENTRY) на который указывает InLoadOrderModuleList из PEB. ``cmd python vol.py -f дамп –profile=профиль dlllist –pid=PID
или, для скрытых процессов (вывод psscan)
```cmd
python vol.py -f дамп --profile=профиль dlllist --offset=смещение (P)
python vol.py -f --profile=профиль dlllist --offset=смещение (P)
python vol.py -f дамп --profile=профиль handles --pid=PID --object-type=тип
Типы дескрипторов: *Process *Thread, *Key *Event *File *Mutant *Token *Port
Плагин получает информацию из структуры COMMAND_HISTORY.
python vol.py psscan -f дамп --profile=профиль cmdscan
Если в исследуемом ОС в настройках консоли был изменен максимальный размер истории команд данному плагину надо сообщить соответствующий параметр. Плагином consoles, который получает информацию из структуры CONSOLE_INFORMATION, можно узнать не только выполняемые команды, но и их результат.
python vol.py -f дамп --profile=профиль consoles
python vol.py -f дамп --profile=профиль dlllist --pid=PID
python vol.py -f дамп --profile=профиль envars
Плагин ищет скрытые, инжектированные процессы в пользовательской области памяти.
python vol.py -f дамп --profile=профиль malfind -p PID
Hollowing – это метод инжекции кода при котором в копия процесса приостанавливается и в не меняется исполняемый код, затем процесс возобновляется.
Плагин сравнивает VAD и PEB блоки процесса -
VAD и PEB содержат информацию о памяти процесса.
python vol.py psscan -f дамп --profile=профиль hollowfind
python vol.py -f дамп --profile=профиль getsids
python vol.py -f дамп --profile=профиль privs
Опция –silent отображает только те привилегии, которые не были у процесса по умолчанию.
python vol.py -f дамп --profile=профиль enumfunc
python vol.py -f дамп --profile=профиль procdump --dump-dir=папка –p PID
python.exe vol.py -f дамп.dmp --profile=профиль svcscan
python.exe vol.py -f дамп.dmp --profile=профиль netscan
Для разных версий Windows для получения этой информации надо использовать разные плагины - см. справку по командам.
python vol.py -f дамп --profile=профиль hivelist
python vol.py -f дамп --profile=профиль printkey -K "ветка"
python vol.py -f дамп --profile=профиль hivedump --offset-hive смещение (V)
python vol.py -f дамп --profile=профиль hashdump
По всей видимости описанный тут плагин не работает с последними версиями Windows 10.
Можно выявлять подозрительные процессы сравнивая образ, снятый с ОС до запуска подозрительного ПО (baseline дамп) с дампом, снятым после запуска такого ПО.
Плагины baseline не входят в дистрибутив volatility – их надо скачать и скопировать в папку volatility/volatility/plugins.
python vol.py -f дамп2 processbl -B дамп1 -U
Кроме процессов (processbl) можно сравнивать: