How to dump driver

How to dump driver

Dump-File Targets

For an introduction and overview of crash dump files, see Crash Dump Files.

Opening Dump Files

To open a crash dump file for use as a debugger target, use OpenDumpFile or OpenDumpfileWide. These methods are similar to the .opendump debugger command.

NoteВ В The engine doesn’t completely attach to the dump file until the WaitForEvent method has been called. When a dump file is created from a process or kernel, information about the last event is stored in the dump file. After the dump file is opened, the next time execution is attempted, the engine will generate this event for the event callbacks. Only then does the dump file become available in the debugging session. See Debugging Session and Execution Model for more details.

Additional files can be used to assist in debugging a crash dump file. The methods AddDumpInformationFile and AddDumpInformationFileWide register files containing page-file information to be used when the next dump file is opened. These methods must be called before the dump file is opened. GetNumberDumpFiles will return the number of such files that were used when the current dump file was opened and GetDumpFile will return a description of these files.

User-mode minidump files contain several streams of information. These streams can be read using the Request operation DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM.

Creating Dump Files

Вскрытие покажет: анализируем драйвер Windows x64, защищенный VMProtect

How to dump driver. Смотреть фото How to dump driver. Смотреть картинку How to dump driver. Картинка про How to dump driver. Фото How to dump driver

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

Одним из таких популярных решений уже давно является протектор VMProtect. После того как вирусописатели стали активно использовать для своих программ подобные взломанные протекторы, антивирусные компании создали «черные» и «серые списки» таких решений и начали детектировать образцы по самому коду протекторов. Сейчас наблюдается очередная волна активного использования VMProtect злоумышленниками для защиты вредоносного ПО от детектирования и анализа. Но и исследователи не стоят на месте: есть замечательные решения по деобфускации и девиртуализации VMProtect. Основное из них — VTIL Project исследователя Can Bölük. Но и оно, к сожалению, не является панацеей.

Текущая волна использования VMProtect характеризуется активным применением протектора китайскими вирусописателями для защиты своих вредоносных драйверов Windows x64. Известно, что анализ подобных драйверов — головная боль вирусных аналитиков. Получив очередной такой драйвер на анализ, Андрей Жданов, специалист по проактивному поиску киберугроз Group-IB, решил поделиться достаточно простыми подходами, которые облегчат анализ этих вредоносных программ.

1. The Interactive Disassembler (IDA) 7.0 и выше

2. Виртуальная среда — гостевая ОС Windows 7 x64 или выше

4. Volatility (я использовал Volatility 3)

Этап 1: получение дампа драйвера

Загружаем драйвер в виртуальной среде. Для этого можно воспользоваться штатной утилитой sc.exe:

sc create binpath= type= kernel start= demand

Или загрузить драйвер с помощью утилиты DriverLoader, которая использует функцию NtLoadDriver:

Если при загрузке возникли проблемы, связанные с цифровой подписью драйвера, — можно воспользоваться утилитой dseo013b.exe (Driver Signature Enforcement Overrider).

После успешной загрузки снимаем полный дамп памяти. Если виртуальная машина (например, VMware) при снимке создает корректный дамп памяти, то можно обойтись и снимком памяти.

Используем Volatility для извлечения всех модулей ядра из дампа:

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

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

Этап 2. Получение списка вызовов импортируемых функций

How to dump driver. Смотреть фото How to dump driver. Смотреть картинку How to dump driver. Картинка про How to dump driver. Фото How to dump driver

FF 15 08 2A 00 00 call cs:LoadLibraryA

VMProtect заменяет его на следующий вызов:

E8 08 72 03 00call vmp_LoadLibraryA

Функция vmp_LoadLibraryA в процессе работы получает фактический адрес функции LoadLibraryA и передает ей управление. Но, как мы видим, после вызова такой обфусцированной функции может оставаться байт, что надо учитывать при анализе в IDA. Возврат из обфусцированной функции в этом случае осуществляется правильно, на следующий после этого байта адрес.

How to dump driver. Смотреть фото How to dump driver. Смотреть картинку How to dump driver. Картинка про How to dump driver. Фото How to dump driver

В итоге получаем список RVA (Relative Virtual Address) таких функций в текстовом файле:

Этап 3. Получение оригинальных адресов импортируемых функций

Чтобы получить адреса оригинальных импортируемых функций, воспользуемся кодом самих обфусцированных функций VMProtect. Для этого загрузим полученный дамп драйвера как shellcode в отладчике x64dbg в виртуальной среде. Для запуска в качестве shellcode можно воспользоваться готовой утилитой или разработать свою, которая просто выделяет память (VirtualAlloc), копирует туда shellcode и передает ему управление. Однако здесь следует сделать замечание: это справедливо для дампа, где RVA и позиции в файле совпадают. В противном случае необходимо загружать дамп как PE-файл, по секциям.

Передавать управление на заголовок MZ драйвера мы, конечно, не будем, а поместим на это место код вызова каждой обфусцированной функции. Будем пошагово отлаживать ее код и в конечном итоге извлекать оригинальный адрес импортируемой функции. С помощью x64dbgpy и скрипта на Python можно полностью автоматизировать этот процесс: сначала скрипт считывает из текстового файла список RVA обфусцированных функций, а по окончании сохраняет уже в другой текстовый файл список RVA и соответствующих им оригинальных адресов импортируемых функций:

. dump (создание файла дампа)

Команда . dump создает файл аварийного дампа пользовательского режима или режима ядра.

Параметры

Параметры
Представляет один или несколько из следующих параметров.

/a
Создайте дампы для всех процессов (требуется-u).

/c
Добавьте комментарий (не поддерживается во всех форматах).

/j
Укажите адрес JIT_DEBUG_INFO.

/o
Перезаписывает существующий файл дампа с тем же именем. Если этот параметр не используется и существует файл с таким же именем, файл дампа не записывается.

/u
Добавьте уникальный идентификатор к имени дампа.

/f [фуллоптионс]
(Режим ядра:) Создает полный дамп памяти.

(Пользовательский режим:) Создает полный дамп пользовательского режима. Дополнительные сведения см. в разделе разновидности User-Mode файлов дампа. Несмотря на их имена, самый крупный файл минидампа фактически содержит больше информации, чем полный дамп пользовательского режима. Например, . dump/МФ или . dump/MA создает больший и полный файл, чем . dump/f. В пользовательском режиме . dump/m [миниоптионс] всегда является предпочтительным для . dump/f.

фуллоптионДействие
yДобавляет сведения о регистрации AVX в файл дампа.
миниоптионДействие
аСоздает малый дамп со всеми необязательными дополнениями. Параметр/ma эквивалентен/Мффхут — он добавляет полные данные памяти, обрабатывает данные, выгруженные сведения о модулях, основную информацию о памяти и потоковую информацию в Малый дамп. Любой сбой при чтении памяти приводит к завершению создания минидампа.
AПараметр/mA эквивалентен/MA, за исключением того, что он игнорирует любые сбои при чтении недоступной памяти и возобновляет создание минидампа.
fДобавляет данные о полном объеме памяти в Малый дамп. Будут добавлены все доступные зафиксированные страницы, принадлежащие целевому приложению.
FДобавляет все основные сведения о памяти в Малый дамп. При этом в Малый дамп будет добавлен поток, содержащий все основные сведения о памяти, а не только сведения о допустимой памяти. Это позволяет отладчику воссоздать полную структуру виртуальной памяти процесса при отладке минидампа.
hДобавляет данные об дескрипторах, связанных с целевым приложением, в Малый дамп.
uДобавляет выгруженные сведения о модуле в Малый дамп. он доступен только в Windows Server 2003 и более поздних версиях Windows.
tДобавляет дополнительные сведения о потоке в Малый дамп. Это включает время потока, которое может отображаться при отладке минидампа с помощью команды! unextension или. ттиме (отображение времени потока).
iДобавляет дополнительную память в Малый дамп. Дополнительная память — это любая память, на которую ссылается указатель в стеке или резервном хранилище, а также небольшая область, окружающая этот адрес.
pДобавляет в Малый дамп блок среды процесса (ПЕБ) и данные блока среды потока (ТЕБ). это может быть полезно, если требуется доступ к Windows системным сведениям о процессах и потоках приложения.
wДобавляет все зафиксированные закрытые страницы для чтения и записи в Малый дамп.
dДобавляет все сегменты данных для чтения и записи в образ исполняемого файла в Малый дамп.
cДобавляет разделы кода в изображения.
rУдаляет из минидампа эти части стека и памяти хранилища, которые не подходят для повторного создания трассировки стека. Локальные переменные и другие значения типа данных также удаляются. Этот параметр не делает малый дамп меньше (поскольку эти разделы памяти просто обнуляются), но это полезно, если требуется защитить конфиденциальность других приложений.
RУдаляет полные пути модулей из минидампа. Будут добавлены только имена модулей. Это полезный вариант, если требуется защитить конфиденциальность структуры каталогов пользователя.
даДобавляет сведения о регистрации AVX в файл дампа.

Параметры режима ядра

В режиме ядра доступны следующие параметры.

/k
Создание дампа только с памятью ядра.

/ка
Создайте дамп с активной памятью ядра и режимом пользователя.

Дополнительные сведения

Описание файлов дампа режима ядра и объяснение их использования см. в разделе файлы дампа режима ядра. Описание файлов дампа пользовательского режима и объяснение их использования см. в разделе файлы дампа пользовательского режима.

Комментарии

Эту команду можно использовать в различных ситуациях.

При отладке в режиме реального времени эта команда направляет целевое приложение для создания файла дампа, но целевое приложение не завершается.

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

Во время отладки аварийного дампа эта команда создает новый файл аварийного дампа из старого файла. Это полезно при наличии большого файла аварийного дампа и необходимости создать его меньше.

Вы можете контролировать, какой тип файла дампа будет создан:

Невозможно указать, какой процесс будет выгружен. Выполняется дамп всех запущенных процессов.

Параметры /КСК, /КСР, /КСПи /КСТ используются для хранения сведений об исключениях и контексте в файле дампа. Это позволяет выполнить команду . еккср (отображать запись контекста исключения) для этого файла дампа.

В следующем примере создается Малый дамп пользовательского режима, содержащий всю память и сведения об обработке:

Сведения об обработке можно прочитать с помощью команды ! Handle Extension.

.dump (Create Dump File)

The .dump command creates a user-mode or kernel-mode crash dump file.

Parameters

Options
Represents one or more of the following options.

/b[a]
Package dump in a CAB and delete dump. Additional information is included if the a option is specified.

/c
Add a comment (not supported in all formats).

/j
Provide a JIT_DEBUG_INFO address.

/o
Overwrites an existing dump file with the same name. If this option is not used and there is a file with the same file name, the dump file is not written.

/u
Append unique identifier to dump name.

/f[FullOptions]
(Kernel mode:) Creates a complete memory dump.

(User mode:) Creates a full user-mode dump. For more information, see Varieties of User-Mode Dump Files. Despite their names, the largest minidump file actually contains more information than a full user-mode dump. For example, .dump /mf or .dump /ma creates a larger and more complete file than .dump /f. In user mode, .dump /m[MiniOptions] is always preferable to .dump /f.

You can add the following FullOptions to change the contents of the dump file; the option is case-sensitive.

FullOptionEffect
yAdds AVX register information to the dump file.

/m[MiniOptions]
Creates a small memory dump (in kernel mode) or a minidump (in user mode) For more information, see User-Mode Dump Files. If neither /f nor /m is specified, /m is the default.

In user mode, /m can be followed with additional MiniOptions specifying extra data that is to be included in the dump. If no MiniOptions are included, the dump will include module, thread, and stack information, but no additional data. You can add any of the following MiniOptions to change the contents of the dump file; they are case-sensitive.

Kernel Mode Options

The following options are available in kernel mode.

/k
Create a dump with kernel memory only.

/ka
Create a dump with active kernel and user mode memory.

Additional Information

For a description of kernel-mode dump files and an explanation of their use, see Kernel-Mode Dump Files. For a description of user-mode dump files and an explanation of their use, see User-Mode Dump Files.

Remarks

This command can be used in a variety of situations:

During live user-mode debugging, this command directs the target application to generate a dump file, but the target application does not terminate.

During live kernel-mode debugging, this command directs the target computer to generate a dump file, but the target computer does not crash.

During crash dump debugging, this command creates a new crash dump file from the old one. This is useful if you have a large crash dump file and want to create a smaller one.

You can control what type of dump file will be produced:

In user mode, .dump /m[MiniOptions] is the best choice. Although «m» stands for «minidump», the dump files created by using this MiniOption can vary in size from very small to very large. By specifying the proper MiniOptions you can control exactly what information is included. For example, .dump /ma produces a dump with a great deal of information. The older command, .dump /f, produces a moderately large «standard dump» file and cannot be customized.

You cannot specify which process is dumped. All running processes will be dumped.

The /xc, /xr, /xp, and /xt options are used to store exception and context information in the dump file. This allows the .ecxr (Display Exception Context Record) command to be run on this dump file.

The following example will create a user-mode minidump, containing full memory and handle information:

Handle information can be read by using the !handle extension command.

. dump (создание файла дампа)

Команда . dump создает файл аварийного дампа пользовательского режима или режима ядра.

Параметры

Параметры
Представляет один или несколько из следующих параметров.

/a
Создайте дампы для всех процессов (требуется-u).

/c
Добавьте комментарий (не поддерживается во всех форматах).

/j
Укажите адрес JIT_DEBUG_INFO.

/o
Перезаписывает существующий файл дампа с тем же именем. Если этот параметр не используется и существует файл с таким же именем, файл дампа не записывается.

/u
Добавьте уникальный идентификатор к имени дампа.

/f [фуллоптионс]
(Режим ядра:) Создает полный дамп памяти.

(Пользовательский режим:) Создает полный дамп пользовательского режима. Дополнительные сведения см. в разделе разновидности User-Mode файлов дампа. Несмотря на их имена, самый крупный файл минидампа фактически содержит больше информации, чем полный дамп пользовательского режима. Например, . dump/МФ или . dump/MA создает больший и полный файл, чем . dump/f. В пользовательском режиме . dump/m [миниоптионс] всегда является предпочтительным для . dump/f.

фуллоптионДействие
yДобавляет сведения о регистрации AVX в файл дампа.
миниоптионДействие
аСоздает малый дамп со всеми необязательными дополнениями. Параметр/ma эквивалентен/Мффхут — он добавляет полные данные памяти, обрабатывает данные, выгруженные сведения о модулях, основную информацию о памяти и потоковую информацию в Малый дамп. Любой сбой при чтении памяти приводит к завершению создания минидампа.
AПараметр/mA эквивалентен/MA, за исключением того, что он игнорирует любые сбои при чтении недоступной памяти и возобновляет создание минидампа.
fДобавляет данные о полном объеме памяти в Малый дамп. Будут добавлены все доступные зафиксированные страницы, принадлежащие целевому приложению.
FДобавляет все основные сведения о памяти в Малый дамп. При этом в Малый дамп будет добавлен поток, содержащий все основные сведения о памяти, а не только сведения о допустимой памяти. Это позволяет отладчику воссоздать полную структуру виртуальной памяти процесса при отладке минидампа.
hДобавляет данные об дескрипторах, связанных с целевым приложением, в Малый дамп.
uДобавляет выгруженные сведения о модуле в Малый дамп. он доступен только в Windows Server 2003 и более поздних версиях Windows.
tДобавляет дополнительные сведения о потоке в Малый дамп. Это включает время потока, которое может отображаться при отладке минидампа с помощью команды! unextension или. ттиме (отображение времени потока).
iДобавляет дополнительную память в Малый дамп. Дополнительная память — это любая память, на которую ссылается указатель в стеке или резервном хранилище, а также небольшая область, окружающая этот адрес.
pДобавляет в Малый дамп блок среды процесса (ПЕБ) и данные блока среды потока (ТЕБ). это может быть полезно, если требуется доступ к Windows системным сведениям о процессах и потоках приложения.
wДобавляет все зафиксированные закрытые страницы для чтения и записи в Малый дамп.
dДобавляет все сегменты данных для чтения и записи в образ исполняемого файла в Малый дамп.
cДобавляет разделы кода в изображения.
rУдаляет из минидампа эти части стека и памяти хранилища, которые не подходят для повторного создания трассировки стека. Локальные переменные и другие значения типа данных также удаляются. Этот параметр не делает малый дамп меньше (поскольку эти разделы памяти просто обнуляются), но это полезно, если требуется защитить конфиденциальность других приложений.
RУдаляет полные пути модулей из минидампа. Будут добавлены только имена модулей. Это полезный вариант, если требуется защитить конфиденциальность структуры каталогов пользователя.
даДобавляет сведения о регистрации AVX в файл дампа.

Параметры режима ядра

В режиме ядра доступны следующие параметры.

/k
Создание дампа только с памятью ядра.

/ка
Создайте дамп с активной памятью ядра и режимом пользователя.

Дополнительные сведения

Описание файлов дампа режима ядра и объяснение их использования см. в разделе файлы дампа режима ядра. Описание файлов дампа пользовательского режима и объяснение их использования см. в разделе файлы дампа пользовательского режима.

Комментарии

Эту команду можно использовать в различных ситуациях.

При отладке в режиме реального времени эта команда направляет целевое приложение для создания файла дампа, но целевое приложение не завершается.

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

Во время отладки аварийного дампа эта команда создает новый файл аварийного дампа из старого файла. Это полезно при наличии большого файла аварийного дампа и необходимости создать его меньше.

Вы можете контролировать, какой тип файла дампа будет создан:

Невозможно указать, какой процесс будет выгружен. Выполняется дамп всех запущенных процессов.

Параметры /КСК, /КСР, /КСПи /КСТ используются для хранения сведений об исключениях и контексте в файле дампа. Это позволяет выполнить команду . еккср (отображать запись контекста исключения) для этого файла дампа.

В следующем примере создается Малый дамп пользовательского режима, содержащий всю память и сведения об обработке:

Сведения об обработке можно прочитать с помощью команды ! Handle Extension.

Источники информации:

Добавить комментарий

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