
Внедрение DLL-библиотек в процесс explorer с помощью значков
Это техника внедрения DLL в проводник Windows, использующая диалог смены значка в Windows.
Она может обманом заставить пользователей загрузить вредоносную DLL в процесс проводника:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
Кроме того, её можно использовать для внедрения DLL из другого процесса в проводник:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
Помимо кода, DLL также используются для хранения таких ресурсов, как значки. В демонстрации видно, что стандартные значки хранятся в shell32.dll:

Вообще-то в современных версиях Windows они хранятся в shell32.dll.mui, но в диалоге по-прежнему отображается shell32.dll
Чтобы процесс проводника мог отобразить в диалоге все значки, хранящиеся в DLL, ему необходимо загрузить DLL в память для её разбора.
Кроме того, DLL в Windows могут определять опциональную функцию DllMain, которая вызывается при загрузке или выгрузке DLL с помощью функций LoadLibrary и FreeLibrary.
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
Это означает, что если проводник загружает DLL с функцией DllMain, код, определённый в DllMain, выполняется в памяти проводника.
И именно это здесь и делается. Вдобавок DLL маскируется под значок:
«Значок» — это на самом деле простой DLL-файл с расширением .ico, который открывает приложение «Калькулятор» с ресурсом значка, добавленным с помощью Resource Hacker. (Значок также можно добавить в Visual Studio)
Есть некоторые аномалии во внешнем виде значка в представлении папки. Я тестировал это на двух разных версиях Windows 10 (самой новой и более старой) и на Windows 11.
В обеих версиях Windows 10 значок, хранящийся внутри DLL, не отображался после изменения расширения на .ico

Однако в самой новой версии Windows 10 это работало, пока я не попытался открыть «значок» в приложении «Фото». С тех пор мне не удалось воспроизвести это.

В Windows 11 замаскированная DLL отображалась как обычный значок в представлении Проводника. Однако при открытии в приложении «Фото» выводится ошибка.
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
Помимо обмана пользователя с целью ручной загрузки DLL, у атакующего также есть возможность использовать эту технику для программного внедрения DLL-файла в процесс проводника:
Сначала во временном каталоге создаётся папка, и свойства папки открываются с помощью SHObjectProperties. Чтобы получить дескриптор окна независимо от языка системы, используется EnumWindows с функцией обратного вызова, которая проверяет уникальное имя папки во всех открытых окнах.

Через страницу свойств вызывается диалог смены значка, дескриптор которого также получается с помощью EnumWindows. Наконец, путь к значку изменяется на DLL (в данном случае с расширением .ico), что заставляет проводник загрузить DLL после нажатия кнопки OK.
Это очень скрытный способ внедрения DLL в процесс Проводника, поскольку он не использует обычные API для внедрения DLL. Правда, при этом появляются два коротких всплывающих окна, которые, впрочем, не слишком мешают. Поэтому эта техника может использоваться злоумышленником как метод обхода антивируса для выполнения кода через легитимный процесс проводника или для загрузки руткита UMD.
Кроме того, распространение DLL, замаскированных под файлы .ico, может быть интересным вектором атаки.
Чтобы получить нужные дескрипторы окон, я использовал Spy++ — инструмент, который устанавливается вместе с Visual Studio.

Огромное спасибо Биллу Г. из Microsoft за красивый значок папки!
Спасибо случайному парню из интернета за красивый значок для внедрения!