Обзор
Это мой анализ программы-вымогателя DIAVOL.
DIAVOL — это относительно новая программа-вымогатель, которая использует уникальный метод с шелл-кодом для запуска своих основных функций и RSA для шифрования файлов.
Вредоносная программа содержит жестко закодированную конфигурацию, в которой хранится такая информация, как файлы для шифрования и открытый ключ RSA, но она также может запрашивать эту информацию с удаленного сервера злоумышленника.
В отличие от большинства основных программ-вымогателей, схема шифрования этой новой вредоносной программы относительно медленная из-за рекурсивного метода обхода файлов.
IOCS
Большое спасибо Curated Intelligence (https://twitter.com/CuratedIntel )за предоставленный образец.
Анализируемый образец представляет собой 64-битный исполняемый файл Windows.
MD5: f4928b5365a0bd6db2e9d654a77308d7
SHA256: ee13d59ae3601c948bd10560188447e6faaeef5336dcd605b52ee558ff2a8588
Сэмпл: (https://bazaar.abuse.ch/sample/ee13d59ae3601c948bd10560188447e6faaeef5336dcd605b52ee558ff2a8588/)
Записка с требованием выкупа
Содержимое примечания о выкупе по умолчанию хранится в виде открытого текста в конфигурации DIAVOL. Вредоносная программа также может запросить записку о выкупе со своего удаленного сервера и переопределить ее по умолчанию.
Имя файла примечания о выкупе от DIAVOL — README-FOR-DECRYPT.txt.
Статический анализ кода
Анти-анализ: запуск функций с шеллкодом
Для анти-анализа DIAVOL загружает шелл-код, содержащий его основные функции, в память и выполняет его динамически, что немного усложняет статический анализ.
Сначала вредоносное ПО вызывает VirtualAlloc, чтобы выделить два буфера памяти для последующей загрузки этих шелл-кодов.
Когда DIAVOL хочет выполнить определенную функцию, он вызывает функцию для загрузки шелл-кода в память и выполняет инструкцию вызова для передачи управления шелл-коду.
Во-первых, чтобы загрузить шелл-код в память, DIAVOL извлекает растровое изображение, соответствующее заданному имени ресурса, вызывая LoadBitmapW, CreateCompatibleDC, SelectObject и GetObjectW.
Затем он вызывает GetDIBits для получения битов растрового изображения и копирует их в буфер шеллкода в виде DIB.
В отличие от обычного шеллкода, DIAVOL не использует вручную PEB для динамического разрешения импорта. Вредоносное ПО загружает "JPEG" с тем же именем в разделе ресурсов, извлекает список импортированных функций с соответствующими DLL и вручную вызывает LoadLibraryA и GetProcAddress для разрешения его для шелл-кода. Разрешенные адреса API хранятся в конце буфера, поэтому шелл-код может вызывать эти API, используя их точные смещения, что делает загруженную полезную нагрузку независимой от позиции.
Ниже приведено растровое изображение и список импортированных API, извлеченных из Resource Hacker.
Поскольку каждый шелл-код должен быть независимым от позиции, мы можем просто загрузить его в IDA для статического анализа после извлечения. Однако адреса API не будут иметь смысла, когда IDA загрузит шелл-код, потому что они относятся к тому месту, где в памяти вредоносного ПО находятся библиотеки DLL.
Чтобы исправить это, нам просто нужно переименовать адреса API в том порядке, в котором они появляются в соответствующем ресурсе JPEG. После переименования шеллкод должен корректно декомпилироваться, и мы можем начать на нем наш статический анализ.
Аргументы командной строки
DIAVOL может работать как с аргументами командной строки, так и без них.
Ниже приведен список аргументов, которые могут быть предоставлены оператором.
Создание идентификатора бота
Первая функция, которую выполняет DIAVOL, — это генерация идентификатора бота путем загрузки и выполнения шелл-кода из ресурса GENBOTID.
Перед запуском шелл-кода DIAVOL вызывает time64, чтобы получить текущую метку времени в системе, и использует ее в качестве начального значения для srand для инициализации генератора псевдослучайных чисел.
Затем он генерирует следующую структуру и передает ее шелл-коду. Поле bot_ID позже используется для регистрации жертвы на удаленном сервере злоумышленника, а жертва_ID — это идентификатор жертвы, который записывается в записке с требованием выкупа. RSA_CRYPT_BUFF — это буфер, который позже используется для шифрования файлов.
Чтобы сгенерировать идентификатор жертвы, шелл-код создает уникальный GUID с помощью CoCreateGuid и использует его как случайное число для индексации строки "0123456789ABCDEF", чтобы сгенерировать случайную 32-символьную строку.
Чтобы сгенерировать идентификатор бота, вредоносное ПО сначала вызывает GetComputerNameA и GetUserNameA, чтобы получить имя компьютера и имя пользователя. Он также вызывает RtlGetVersion для получения версии компьютера жертвы и использует ее для индексации строки "0123456789ABCDEF" для создания 8-символьной строки.
Затем идентификатор бота создается в следующем строковом формате.
** + + "_W" + <8_character_string_from_OS_version> + "."**
Наконец, чтобы заполнить поле RSA_CRYPT_BUFF, вредоносная программа вызывает функцию rand для создания случайного 1024-байтового буфера.
Жестко закодированная конфигурация
Конфигурация DIAVOL хранится в памяти в открытом виде.
Чтобы извлечь его, вредоносное ПО выделяет следующую структуру с помощью LocalAlloc и заполняет ее, используя жестко запрограммированные значения из памяти.
Ниже приведены жестко запрограммированные значения конфигурации.
Регистрация бота
Чтобы зарегистрировать жертву как бота, DIAVOL сначала формирует содержимое POST-запроса, который затем отправляется на удаленный сервер регистрации.
Это делается путем объединения идентификатора бота , сгенерированного при создании идентификатора бота, и жестко запрограммированного идентификатора группы в конфигурации в следующем формате.
cid=<bot_ID>&group=<group_ID>&ip_local1=111.111.111.111&ip_local2=222.222.222.222&ip_external=2.16.7.12
Далее вредоносное ПО выделяет память для следующей структуры перед загрузкой и выполнением шелл-кода из ресурса REGISTER.
Для отправки POST-запроса используется шелл-код InternetOpenA для инициализации использования приложением функций WinINet, InternetConnectA для подключения к серверу C2, HttpOpenRequestA для открытия POST-запроса в указанном доменном каталоге и HttpSendRequestA для отправки созданного POST-запроса.
Наконец, вредоносная программа вызывает HttpQueryInfoA для запроса и возврата ответа сервера.
Переопределение конфигурации
Помимо использования параметров командной строки, DIAVOL также может запрашивать различные значения со своего удаленного сервера, чтобы переопределить поля конфигурации, в отличие от большинства основных программ-вымогателей.
Сначала вредоносное ПО проверяет, правильно ли зарегистрирована жертва в качестве бота на главном сервере регистрации, проверяя, соответствует ли код ответа сервера 200.
Затем он загружает и выполняет шелл-код из ресурса FROMNET для запроса различных значений конфигурации.
Для вызовов шелл-кода вредоносное ПО выделяет следующую структуру, прежде чем передать ее в качестве параметра.
Для каталога домена адреса сервера имя поля зависит от поля конфигурации, которое запрашивает вредоносное ПО. После завершения регистрации DIAVOL запрашивает следующие имена полей:
-key: ключ RSA в кодировке Base64.
-services: стоп-лист служб
-priority: целевые файлы для шифрования в первую очередь
-ignore: имена файлов, чтобы избежать шифрования
-ext: имена файлов для включения шифрования
-wipe: имена файлов для удаления
-landing: записка о выкупе
Шелл-код вызывает InternetConnectA для подключения к серверу C2, HttpOpenRequestA для открытия GET-запроса и HttpSendRequestA для отправки запроса. Затем он вызывает InternetReadFile, чтобы прочитать ответ сервера для запрошенного поля и вернуть его.
Далее, поскольку списки в конфигурации содержат переменные среды, DIAVOL разрешает их, вызывая GetEnvironmentVariableW, и преобразует их в нижний регистр с помощью CharLowerBuffW.
Наконец, записка о выкупе в конфигурации переворачивается, а строка "%cid_bot%" заменяется сгенерированным идентификатором жертвы.
Остановка служб
DIAVOL загружает и выполняет шелл-код из ресурса SERVPROC, чтобы остановить службы, указанные в конфигурации.
Получив список служб, которые необходимо остановить, шелл-код перебирает список и останавливает их с помощью диспетчера управления службами.
Сначала он вызывает OpenSCManagerW для получения дескриптора диспетчера управления службами со всеми правами доступа, OpenServiceW для получения дескриптора целевой службы и ControlService для отправки кода остановки управления для ее остановки.
Завершающие процессы
DIAVOL загружает и выполняет шелл-код из ресурса KILLPR для завершения процессов, указанных в конфигурации.
Сначала шелл-код вызывает CreateToolhelp32Snapshot, чтобы сделать снимок всех процессов в системе. Используя моментальный снимок, он перебирает каждый процесс, используя Process32FirstW и Process32NextW. Для каждого процесса его исполняемое имя сравнивается с каждым именем в списке процессов конфигурации, которые должны быть завершены.
Инициализация RSA
Перед шифрованием файлов DIAVOL устанавливает криптографические буферы, которые впоследствии используются для шифрования файлов.
Во-первых, он выделяет память для следующей структуры перед загрузкой и выполнением шелл-кода из ресурса RSAINIT.
Задача шеллкода состоит в том, чтобы заполнить поле RSA_FOOTER для последующего использования при шифровании файла.
Во-первых, он вызывает CryptStringToBinaryW для декодирования открытого ключа RSA с помощью Base64 и CryptAcquireContextW для получения дескриптора соответствующего поставщика криптографических услуг.
Затем вредоносное ПО вызывает CryptImportKey, чтобы импортировать открытый ключ RSA и получить дескриптор ключа. Он вызывает VirtualAlloc для выделения буфера памяти и делит буфер RSA_CRYPT_BUFF на 117-байтовые блоки. Для каждого блока DIAVOL добавляет его в выделенный буфер и вызывает CryptEncrypt, чтобы зашифровать его с помощью дескриптора ключа RSA.
Наконец, закодированный буфер размером 2304 байта будет скопирован в буфер RSA_FOOTER. Как это и буфер RSA_CRYPT_BUFF используются, будет обсуждаться позже при шифровании файлов
Поиск дисков для шифрования
DIAVOL загружает и выполняет шелл-код из ресурса ENMDSKS для перечисления и поиска всех дисков в системе, когда режим шифрования из командной строки — локальный, сетевой, сканирование или все.
В качестве параметров шелл-код получает список файлов, чтобы избежать шифрования, и буфер для хранения имен дисков, найденных при переборе.
Сначала шелл-код вызывает GetLogicalDriveStringsW для получения списка всех дисков в системе. Для каждого диска его имя преобразуется в нижний регистр и передается в GetDriveTypeW в качестве параметра для получения его типа.
Диск обрабатывается только в том случае, если его тип DRIVE_REMOTE или DRIVE_FIXED и его имя отсутствует в списке файлов, которые следует избегать.
Если диск подходит для шифрования, его имя добавляется к буферу дисков из параметра шеллкода.
Если диск является удаленным, вредоносное ПО вызывает WNetGetConnectionW для получения имени связанного с ним сетевого ресурса.
Наконец, используя имя сетевого ресурса, вредоносная программа вызывает gethostbyname для получения структуры хоста, которая содержит IP-адрес удаленного хоста.
Наконец, DIAVOL добавляет этот IP-адрес в список файлов, чтобы избежать шифрования.
Сканирование целевых сетевых ресурсов через SMB
DIAVOL имеет два разных шеллкода для сканирования сетевых ресурсов с использованием SMB в ресурсах SMBFAST и SMB.
Шелл-код SMBFAST используется для сканирования общих сетевых ресурсов из списка целевых хостов, заданного параметром командной строки «-h».
Перед запуском этого шелл-кода DIAVOL выделяет память для следующей структуры, содержащей информацию о сетевых хостах, подлежащих перечислению для общих ресурсов.
Вредонос также выделяет память для этой структуры, чтобы получить имя всех сканируемых сетевых ресурсов. Затем обе структуры передаются шеллкоду в качестве параметров.
Поскольку шелл-код SMBFAST сканирует только имена хостов в заданном целевом списке, он просматривает список и записывает каждое имя общего сетевого ресурса в поле curr_network_share_name для обработки.
Во-первых, вредоносное ПО вызывает gethostbyname, чтобы получить структуру хоста для текущего имени общего ресурса. Используя структуру, он извлекает список IP-адресов хоста и добавляет его в поле remote_host_IP_list.
Затем для каждого полученного от хоста IP-адреса вредоносное ПО записывает его в буфер DIAVOL_SMB_STRUCT->DNS_server_name. Затем он передается в качестве параметра вызову NetShareEnum для получения информации о каждом общем ресурсе на сервере с этим IP-адресом.
Затем для каждого ресурса на сервере DIAVOL добавляет его в буфер DIAVOL_SMB_LIST->SMB_net_share_list в следующем формате.
<Server_IP_Address>//<Resource_Name>//
Имя ресурса извлекается из shi1_netname из структуры SHARE_INFO_1, полученной в результате предыдущего вызова NetShareEnum.
Окончательный список позже используется для шифрования этих общих ресурсов.
Сканирование сетевых ресурсов в таблице ARP через SMB
Шелл-код SMB используется для сканирования общих сетевых ресурсов с хостов, извлеченных из таблицы протокола разрешения адресов (ARP).
Перед запуском этого шелл-кода DIAVOL выделяет память для структуры DIAVOL_SMB_STRUCT и структуры DIAVOL_SMB_LIST, аналогичной шелл-коду SMBFAST.
Сначала шелл-код вызывает GetIpNetTable для получения таблицы сопоставления IPv4-физических адресов на машине жертвы.
Используя эту таблицу, вредоносное ПО извлекает список структур MIB_IPNETROW, содержащих записи для IP-адресов в таблице ARP. Для каждой структуры MIB_IPNETROW DIAVOL вызывает GetIfEntry для получения информации для указанного интерфейса на локальном компьютере.
Это мой анализ программы-вымогателя DIAVOL.
DIAVOL — это относительно новая программа-вымогатель, которая использует уникальный метод с шелл-кодом для запуска своих основных функций и RSA для шифрования файлов.
Вредоносная программа содержит жестко закодированную конфигурацию, в которой хранится такая информация, как файлы для шифрования и открытый ключ RSA, но она также может запрашивать эту информацию с удаленного сервера злоумышленника.
В отличие от большинства основных программ-вымогателей, схема шифрования этой новой вредоносной программы относительно медленная из-за рекурсивного метода обхода файлов.
IOCS
Большое спасибо Curated Intelligence (https://twitter.com/CuratedIntel )за предоставленный образец.
Анализируемый образец представляет собой 64-битный исполняемый файл Windows.
MD5: f4928b5365a0bd6db2e9d654a77308d7
SHA256: ee13d59ae3601c948bd10560188447e6faaeef5336dcd605b52ee558ff2a8588
Сэмпл: (https://bazaar.abuse.ch/sample/ee13d59ae3601c948bd10560188447e6faaeef5336dcd605b52ee558ff2a8588/)
Записка с требованием выкупа
Содержимое примечания о выкупе по умолчанию хранится в виде открытого текста в конфигурации DIAVOL. Вредоносная программа также может запросить записку о выкупе со своего удаленного сервера и переопределить ее по умолчанию.
Имя файла примечания о выкупе от DIAVOL — README-FOR-DECRYPT.txt.
Статический анализ кода
Анти-анализ: запуск функций с шеллкодом
Для анти-анализа DIAVOL загружает шелл-код, содержащий его основные функции, в память и выполняет его динамически, что немного усложняет статический анализ.
Сначала вредоносное ПО вызывает VirtualAlloc, чтобы выделить два буфера памяти для последующей загрузки этих шелл-кодов.
Когда DIAVOL хочет выполнить определенную функцию, он вызывает функцию для загрузки шелл-кода в память и выполняет инструкцию вызова для передачи управления шелл-коду.
Во-первых, чтобы загрузить шелл-код в память, DIAVOL извлекает растровое изображение, соответствующее заданному имени ресурса, вызывая LoadBitmapW, CreateCompatibleDC, SelectObject и GetObjectW.
Затем он вызывает GetDIBits для получения битов растрового изображения и копирует их в буфер шеллкода в виде DIB.
В отличие от обычного шеллкода, DIAVOL не использует вручную PEB для динамического разрешения импорта. Вредоносное ПО загружает "JPEG" с тем же именем в разделе ресурсов, извлекает список импортированных функций с соответствующими DLL и вручную вызывает LoadLibraryA и GetProcAddress для разрешения его для шелл-кода. Разрешенные адреса API хранятся в конце буфера, поэтому шелл-код может вызывать эти API, используя их точные смещения, что делает загруженную полезную нагрузку независимой от позиции.
Ниже приведено растровое изображение и список импортированных API, извлеченных из Resource Hacker.
Поскольку каждый шелл-код должен быть независимым от позиции, мы можем просто загрузить его в IDA для статического анализа после извлечения. Однако адреса API не будут иметь смысла, когда IDA загрузит шелл-код, потому что они относятся к тому месту, где в памяти вредоносного ПО находятся библиотеки DLL.
Чтобы исправить это, нам просто нужно переименовать адреса API в том порядке, в котором они появляются в соответствующем ресурсе JPEG. После переименования шеллкод должен корректно декомпилироваться, и мы можем начать на нем наш статический анализ.
Аргументы командной строки
DIAVOL может работать как с аргументами командной строки, так и без них.
Ниже приведен список аргументов, которые могут быть предоставлены оператором.
Создание идентификатора бота
Первая функция, которую выполняет DIAVOL, — это генерация идентификатора бота путем загрузки и выполнения шелл-кода из ресурса GENBOTID.
Перед запуском шелл-кода DIAVOL вызывает time64, чтобы получить текущую метку времени в системе, и использует ее в качестве начального значения для srand для инициализации генератора псевдослучайных чисел.
Затем он генерирует следующую структуру и передает ее шелл-коду. Поле bot_ID позже используется для регистрации жертвы на удаленном сервере злоумышленника, а жертва_ID — это идентификатор жертвы, который записывается в записке с требованием выкупа. RSA_CRYPT_BUFF — это буфер, который позже используется для шифрования файлов.
Чтобы сгенерировать идентификатор жертвы, шелл-код создает уникальный GUID с помощью CoCreateGuid и использует его как случайное число для индексации строки "0123456789ABCDEF", чтобы сгенерировать случайную 32-символьную строку.
Чтобы сгенерировать идентификатор бота, вредоносное ПО сначала вызывает GetComputerNameA и GetUserNameA, чтобы получить имя компьютера и имя пользователя. Он также вызывает RtlGetVersion для получения версии компьютера жертвы и использует ее для индексации строки "0123456789ABCDEF" для создания 8-символьной строки.
Затем идентификатор бота создается в следующем строковом формате.
** + + "_W" + <8_character_string_from_OS_version> + "."**
Наконец, чтобы заполнить поле RSA_CRYPT_BUFF, вредоносная программа вызывает функцию rand для создания случайного 1024-байтового буфера.
Жестко закодированная конфигурация
Конфигурация DIAVOL хранится в памяти в открытом виде.
Чтобы извлечь его, вредоносное ПО выделяет следующую структуру с помощью LocalAlloc и заполняет ее, используя жестко запрограммированные значения из памяти.
Ниже приведены жестко запрограммированные значения конфигурации.
Регистрация бота
Чтобы зарегистрировать жертву как бота, DIAVOL сначала формирует содержимое POST-запроса, который затем отправляется на удаленный сервер регистрации.
Это делается путем объединения идентификатора бота , сгенерированного при создании идентификатора бота, и жестко запрограммированного идентификатора группы в конфигурации в следующем формате.
cid=<bot_ID>&group=<group_ID>&ip_local1=111.111.111.111&ip_local2=222.222.222.222&ip_external=2.16.7.12
Далее вредоносное ПО выделяет память для следующей структуры перед загрузкой и выполнением шелл-кода из ресурса REGISTER.
Для отправки POST-запроса используется шелл-код InternetOpenA для инициализации использования приложением функций WinINet, InternetConnectA для подключения к серверу C2, HttpOpenRequestA для открытия POST-запроса в указанном доменном каталоге и HttpSendRequestA для отправки созданного POST-запроса.
Наконец, вредоносная программа вызывает HttpQueryInfoA для запроса и возврата ответа сервера.
Переопределение конфигурации
Помимо использования параметров командной строки, DIAVOL также может запрашивать различные значения со своего удаленного сервера, чтобы переопределить поля конфигурации, в отличие от большинства основных программ-вымогателей.
Сначала вредоносное ПО проверяет, правильно ли зарегистрирована жертва в качестве бота на главном сервере регистрации, проверяя, соответствует ли код ответа сервера 200.
Затем он загружает и выполняет шелл-код из ресурса FROMNET для запроса различных значений конфигурации.
Для вызовов шелл-кода вредоносное ПО выделяет следующую структуру, прежде чем передать ее в качестве параметра.
Для каталога домена адреса сервера имя поля зависит от поля конфигурации, которое запрашивает вредоносное ПО. После завершения регистрации DIAVOL запрашивает следующие имена полей:
-key: ключ RSA в кодировке Base64.
-services: стоп-лист служб
-priority: целевые файлы для шифрования в первую очередь
-ignore: имена файлов, чтобы избежать шифрования
-ext: имена файлов для включения шифрования
-wipe: имена файлов для удаления
-landing: записка о выкупе
Шелл-код вызывает InternetConnectA для подключения к серверу C2, HttpOpenRequestA для открытия GET-запроса и HttpSendRequestA для отправки запроса. Затем он вызывает InternetReadFile, чтобы прочитать ответ сервера для запрошенного поля и вернуть его.
Далее, поскольку списки в конфигурации содержат переменные среды, DIAVOL разрешает их, вызывая GetEnvironmentVariableW, и преобразует их в нижний регистр с помощью CharLowerBuffW.
Наконец, записка о выкупе в конфигурации переворачивается, а строка "%cid_bot%" заменяется сгенерированным идентификатором жертвы.
Остановка служб
DIAVOL загружает и выполняет шелл-код из ресурса SERVPROC, чтобы остановить службы, указанные в конфигурации.
Получив список служб, которые необходимо остановить, шелл-код перебирает список и останавливает их с помощью диспетчера управления службами.
Сначала он вызывает OpenSCManagerW для получения дескриптора диспетчера управления службами со всеми правами доступа, OpenServiceW для получения дескриптора целевой службы и ControlService для отправки кода остановки управления для ее остановки.
Завершающие процессы
DIAVOL загружает и выполняет шелл-код из ресурса KILLPR для завершения процессов, указанных в конфигурации.
Сначала шелл-код вызывает CreateToolhelp32Snapshot, чтобы сделать снимок всех процессов в системе. Используя моментальный снимок, он перебирает каждый процесс, используя Process32FirstW и Process32NextW. Для каждого процесса его исполняемое имя сравнивается с каждым именем в списке процессов конфигурации, которые должны быть завершены.
Инициализация RSA
Перед шифрованием файлов DIAVOL устанавливает криптографические буферы, которые впоследствии используются для шифрования файлов.
Во-первых, он выделяет память для следующей структуры перед загрузкой и выполнением шелл-кода из ресурса RSAINIT.
Задача шеллкода состоит в том, чтобы заполнить поле RSA_FOOTER для последующего использования при шифровании файла.
Во-первых, он вызывает CryptStringToBinaryW для декодирования открытого ключа RSA с помощью Base64 и CryptAcquireContextW для получения дескриптора соответствующего поставщика криптографических услуг.
Затем вредоносное ПО вызывает CryptImportKey, чтобы импортировать открытый ключ RSA и получить дескриптор ключа. Он вызывает VirtualAlloc для выделения буфера памяти и делит буфер RSA_CRYPT_BUFF на 117-байтовые блоки. Для каждого блока DIAVOL добавляет его в выделенный буфер и вызывает CryptEncrypt, чтобы зашифровать его с помощью дескриптора ключа RSA.
Наконец, закодированный буфер размером 2304 байта будет скопирован в буфер RSA_FOOTER. Как это и буфер RSA_CRYPT_BUFF используются, будет обсуждаться позже при шифровании файлов
Поиск дисков для шифрования
DIAVOL загружает и выполняет шелл-код из ресурса ENMDSKS для перечисления и поиска всех дисков в системе, когда режим шифрования из командной строки — локальный, сетевой, сканирование или все.
В качестве параметров шелл-код получает список файлов, чтобы избежать шифрования, и буфер для хранения имен дисков, найденных при переборе.
Сначала шелл-код вызывает GetLogicalDriveStringsW для получения списка всех дисков в системе. Для каждого диска его имя преобразуется в нижний регистр и передается в GetDriveTypeW в качестве параметра для получения его типа.
Диск обрабатывается только в том случае, если его тип DRIVE_REMOTE или DRIVE_FIXED и его имя отсутствует в списке файлов, которые следует избегать.
Если диск подходит для шифрования, его имя добавляется к буферу дисков из параметра шеллкода.
Если диск является удаленным, вредоносное ПО вызывает WNetGetConnectionW для получения имени связанного с ним сетевого ресурса.
Наконец, используя имя сетевого ресурса, вредоносная программа вызывает gethostbyname для получения структуры хоста, которая содержит IP-адрес удаленного хоста.
Наконец, DIAVOL добавляет этот IP-адрес в список файлов, чтобы избежать шифрования.
Сканирование целевых сетевых ресурсов через SMB
DIAVOL имеет два разных шеллкода для сканирования сетевых ресурсов с использованием SMB в ресурсах SMBFAST и SMB.
Шелл-код SMBFAST используется для сканирования общих сетевых ресурсов из списка целевых хостов, заданного параметром командной строки «-h».
Перед запуском этого шелл-кода DIAVOL выделяет память для следующей структуры, содержащей информацию о сетевых хостах, подлежащих перечислению для общих ресурсов.
Вредонос также выделяет память для этой структуры, чтобы получить имя всех сканируемых сетевых ресурсов. Затем обе структуры передаются шеллкоду в качестве параметров.
Поскольку шелл-код SMBFAST сканирует только имена хостов в заданном целевом списке, он просматривает список и записывает каждое имя общего сетевого ресурса в поле curr_network_share_name для обработки.
Во-первых, вредоносное ПО вызывает gethostbyname, чтобы получить структуру хоста для текущего имени общего ресурса. Используя структуру, он извлекает список IP-адресов хоста и добавляет его в поле remote_host_IP_list.
Затем для каждого полученного от хоста IP-адреса вредоносное ПО записывает его в буфер DIAVOL_SMB_STRUCT->DNS_server_name. Затем он передается в качестве параметра вызову NetShareEnum для получения информации о каждом общем ресурсе на сервере с этим IP-адресом.
Затем для каждого ресурса на сервере DIAVOL добавляет его в буфер DIAVOL_SMB_LIST->SMB_net_share_list в следующем формате.
<Server_IP_Address>//<Resource_Name>//
Имя ресурса извлекается из shi1_netname из структуры SHARE_INFO_1, полученной в результате предыдущего вызова NetShareEnum.
Окончательный список позже используется для шифрования этих общих ресурсов.
Сканирование сетевых ресурсов в таблице ARP через SMB
Шелл-код SMB используется для сканирования общих сетевых ресурсов с хостов, извлеченных из таблицы протокола разрешения адресов (ARP).
Перед запуском этого шелл-кода DIAVOL выделяет память для структуры DIAVOL_SMB_STRUCT и структуры DIAVOL_SMB_LIST, аналогичной шелл-коду SMBFAST.
Сначала шелл-код вызывает GetIpNetTable для получения таблицы сопоставления IPv4-физических адресов на машине жертвы.
Используя эту таблицу, вредоносное ПО извлекает список структур MIB_IPNETROW, содержащих записи для IP-адресов в таблице ARP. Для каждой структуры MIB_IPNETROW DIAVOL вызывает GetIfEntry для получения информации для указанного интерфейса на локальном компьютере.

