О Imphash

Если вы не знакомы, imphash означает хэш импорта всех импортированных библиотек в файле Windows Portable Executable (PE). Вы можете быстро начать играть с ним с его реализацией на Python здесь:
https://github.com/erocarrera/pefile

Для вычисления «импхэша» все импортированные библиотеки и связанные с ними функции выгружаются в строковом формате, объединяются, а затем криптографически хешируются. Virus Total также делает это с PE-файлами, которые он видит в своих ежедневных отправках, поэтому важно понимать, как это работает и почему.

Зачем это рассчитывать?

Все просто: авторы вредоносных программ - люди, а люди придерживаются того, что знают. Они идут в одни и те же водопои. Таким образом, когда автор вредоносного ПО настраивает несколько вещей, чтобы отбросить сигнатуру своего вредоносного EXE или DLL, высока вероятность того, что их впечатления останутся идентичными. Это делает imphash хорошим способом отслеживания жизненного цикла семейств вредоносных программ и их авторов. Подробнее об этом читайте в блоге FireEye:
https://www.fireeye.com/blog/threat-research/2014/01/tracking-malware-import-hashing.html

Как это работает в коде?

Предположим, у вас есть следующий фрагмент в верхней части файла C ++ .cpp вашего вредоносного ПО:

#include ‹WtsApi32.h›

#pragma comment (lib, «WtsApi32.lib»)

Есть и другие способы указать вашему компоновщику C ++ включить библиотеку, но они требуют изменения файлов проекта и указания каталогов импорта, поэтому они не такие переносимые и не так понятны следующему разработчику, который читает ваш код, как #pragma, который ясно указывает, что вам нужно загрузить файл WtsApi32.lib.

Этот комментарий #pragma для включения этой библиотеки является импортом, поэтому он будет отображаться в списке импортов, которые проект python pefile выберет.

python3

pe = pefile.PE ('path / to / exe.exe')
для записи в pe.DIRECTORY_ENTRY_IMPORT:
print ('\ t' + entry.dll.decode ('utf-8') )

Вы должны увидеть WTSAPI32.DLL в списке импорта, если вы запускали этот питон против нашего гипотетического фрагмента вредоносного ПО после его компиляции в EXE-файл. Это API Microsoft, поэтому не исключено, что хорошее программное обеспечение будет его использовать, однако этот конкретный API используется не так часто, как некоторые другие. Возможно, проблема не в этом единственном API, а в комбинации этого импортированного API с другим набором, который вы используете, что делает ваше вредоносное ПО уникальным.

Какие есть варианты у разработчика вредоносного ПО?

Один из вариантов - сказать себе: «У меня лихорадка, и единственный рецепт - больше стадий, гм… стадий». Затем перейдите к модульному разделению вредоносного ПО, загружая каждый модуль в память только при необходимости. , и делайте базовые этапы простыми, чтобы их впечатления не были такими уникальными. Минусы этого подхода: он сложен и, хотя это хорошая практика для разработки вредоносных программ, опытный разработчик признает, что даже их модули более поздней стадии в конечном итоге будут захвачены в форме PE компетентным судебным экспертом.

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

Глядя на наш пример импорта C ++ (оператор прагмы выше), предположим, что мы сделали это следующим образом ...

#include ‹WtsApi32.h›

// закомментируйте, нам это больше не понадобится:

// # комментарий прагмы (lib, «WtsApi32.lib»)

void MalFunction ()
{

LoadLibrary («WtsApi32.dll»);

}

Для простого импорта это может быть все, что вам нужно. Повторно запустите приведенный выше пример python3 pefile, и вы заметите, что WTSAPI32.DLL выпадет из списка, и теперь импхеш будет другим.

Но для более сложных случаев использования вам потребуется не только загрузить библиотеку в память, но также потребуется найти и использовать определенные функции в этой DLL, как в этом примере:

// объявляем определение типа CryptStringToBinaryA (функция Base64) из Crypt32

// сигнатура этого метода буквально копирует / вставляет фактическую функцию CryptStringToBinaryA

// все, что нам нужно сделать, это следовать шаблону typedef с указателем __stdcall, чтобы настроить его:

typedef BOOL (__ stdcall * pCryptStringToBinaryA) (

LPCSTR pszString,

DWORD cchString,

DWORD dwFlags,

БАЙТ * pbBinary,

DWORD * pcbBinary,

DWORD * pdwSkip,

DWORD * pdwFlags

);

// получаем дескриптор Crypt32.dll:

HMODULE hCrypt32 = LoadLibrary («Crypt32.dll»);

// получаем указатель на CryptStringToBinaryA () на основе нашего предыдущего определения типа:
pCryptStringToBinaryA pCrypt = (pCryptStringToBinaryA) GetProcAddress (hCrypt32, «CryptStringToBinaryA»);

// теперь мы можем использовать наш указатель, как если бы вы вызывали импортированную функцию:

if (! pCrypt («здесь какая-то строка base64», 0, CRYPT_STRING_BASE64,…

В этом более сложном примере мы убрали импорт CRYPT32.DLL из-под любопытных глаз imphash и pefile. Во время выполнения наша маленькая вредоносная программа обнаружит DLL в файловой системе хоста жертвы, загрузит ее и сделает ее пригодной для использования. На самом деле это было не так уж и сложно.

Проницательный читатель заметит, что мы только что обменяли Crypt32 из таблицы импорта PE-файла на строки «Crypt32.dll» и «CryptStringToBinaryA» в PE-файле. Да, мы сделали. Но есть и другие способы запутать строки в двоичном файле (тема на другой день).

Imphashes под ложным флагом

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

Имея в руках образец артефакта, вы можете пройти его таблицу импорта, используя библиотеку pefile python3, а затем просто добавить ссылки в свой C ++ для сопоставления, убедившись, что вы динамически загружаете любые библиотеки, необходимые для выполнения вашей задачи, которые НЕ находятся в целевом объекте. таблица импорта артефакта. Следите за оптимизацией компилятора / компоновщика - вам может потребоваться больше, чем просто ссылка, вам может потребоваться кодовый путь, который действительно касается функций в этих пространствах имен, чтобы они не были оптимизированы из вашего окончательного PE-файла. Такой подход не обязательно сделает вашу вредоносную программу полностью похожей на другой артефакт, только на импхэш, но это может быть инструмент, который вам понадобится в вашем наборе инструментов для этой операции.

Удачной компиляции и связывания…