Введение
В процессе реверс-инжиниринга вредоносного ПО аналитик постоянно сталкивается с необходимостью преодолевать многоуровневую обфускацию: прежде чем добраться до интересной логики, часто приходится вручную разбирать кастомные протоколы, восстанавливать конфигурации или извлекать данные из нестандартных контейнеров. Особую категорию таких задач представляет анализ образцов, собранных с помощью конструкторов инсталляторов — они маскируют вредоносную нагрузку под легитимный процесс установки, но при этом требуют специфического подхода к распаковке. Один из них — Smart Install Maker: формат известен давно, но качественных открытых утилит для его разбора до сих пор нет, а существующие решения часто неудобны для интеграции в аналитический пайплайн. При этом формат продолжает активно использоваться злоумышленниками — в частности, APT-группа Librarian Likho (aka Rare Werewolf и Rezet) применяла его в своих кампаниях для доставки вредоносов. В этой статье мы разберем его внутреннюю структуру на примере одной из нагрузок Librarian Likho и поделимся кодом распаковщика на Python, который можно сразу использовать.
Технический анализ
Изначально Smart Install Maker — условно-бесплатная утилита с закрытым исходным кодом, которая использовалась для создания инсталляторов в ОС Windows. Данные в процессе создания инсталлятора также сжимаются, для этого используется формат Microsoft Cabinet (MSCF). Программа была выпущена в 2004 году, а последняя версия (5.04) вышла 29 ноября 2011 года. Именно ее и используют злоумышленники в своих вредоносных кампаниях. Рассмотрим ее далее.
Обзор программы
Интерфейс программы довольно старомоден. В окне конфигурации можно задать как параметры установщика, так и параметры деинсталлятора. Среди них потенциально интересными для злоумышленника (помимо вкладки Files и General) являются:
- Registry. Данная вкладка позволяет конфигурировать ключи реестра и их значения. Например, с ее помощью можно задать ключи автозапуска.
- Commands. В данной вкладке можно задать список команд, выполняемых до или после процесса распаковки основных файлов в инсталляторе.
- Dialogs. Здесь можно указать тип установки. Злоумышленники всегда используют вариант с бесшумной (silent) установкой.
Во вкладке General можно указать степень сжатия и метаинформацию об установщике (none, normal, maximal; влияет на поле степени сжатия MSCF-архива).
Конфигурация
Smart Install Maker написан с использованием популярного в те времена языка Delphi. В корневой директории, помимо самого приложения, нас интересует папка Data. Именно в ней содержатся stub-файлы, используемые в процессе генерации инсталляторов. Первый файл называется Install.exe (stub установщика), второй — Uninstall.exe (stub деинсталлятора). В stub-файл установщика дописываются MSCF-архивы, а также строки конфигурации, включая различные команды. В конец файла записывается структура размером 36 байт, которая выглядит следующим образом:
struct SIM_overlay {
u64 offset_meta;
u64 size_resources;
u64 offset_resources;
u64 payload;
u8 is_compressed; // 0 or 1
u8 installation_type; // 0 = silent
u8 meta_count;
u8 magic;
};
Поле magic всегда содержит байт 0xF1 и является индикатором успешного создания инсталлятора. Поля offset_resources и size_resources содержат смещение и размер MSCF-архива со вспомогательными файлами инсталлятора, такими как иконки. Поле payload содержит смещение до архива (если был указан тип сжатия; в противном случае там просто последовательность файлов, предваряемая заголовками. Этот вариант не является интересным для злоумышленников, так как в случае отсутствия сжатия содержимое всех файлов может быть просканировано статически) с файлами, которые были указаны во вкладке Files при создании инсталлятора.
Поля offset_meta и meta_count содержат, соответственно, смещение до заголовка с метаинформацией об установщике и количество записей. Этот заголовок состоит из последовательности строк, завершаемых нулем, которых всегда 120.
В начале данного блока всегда идет строка с версией Smart Install Maker, дальше последовательно представлены строки, которые указывались при создании инсталлятора во вкладке General. Можно заметить, что некоторые строки представляют собой число и имеют размер 1 байт. Данные строки воспроизводят значения того или иного параметра при создании инсталлятора (например, метод сжатия).
Блок заканчивается размером архива payload без сигнатуры MSCF (в целом эта информация избыточна, так как размер архива можно получить в заголовках самого cabinet-файла). Затем (при наличии) начинается блок модификации реестра. Он выглядит следующим образом:
Запись в нем представляет собой следующий формат (здесь и далее разделителем является нулевой байт):
X1 PATH KEY VAL X2 X3 X4, где:
- X1 — раздел реестра (значения от 0 до 6 для соответствующей ветки).
- X2 — тип значения (REG_SZ, REG_BINARY, REG_DWORD, REG_EXPAND_SZ).
- X3 — флаг overwrite.
- X4 — флаг uninstall.
Прежде чем описывать следующий блок, уточним формат архива с установочными файлами. В конце файла конфигурация содержит поле payload — оно указывает, где именно начинается этот архив. Архив основан на формате Microsoft Cabinet, но модифицирован: сигнатура MSCF удалена для скрытия от простого сканирования, а имена файлов заменены на порядковые числа (0, 1, 2...). Следующий блок как раз содержит расшифровку: настоящие имена файлов и пути для их записи. Данные в нем идут строго в порядке нумерации файлов внутри архива.
Формат записи здесь следующий:
PATH X1 X2, где:
- X1 — флаг overwrite (что делать, если файл уже присутствует).
- X2 — флаг uninstall.
Также можно заметить последовательность символов @$&%NUM. Это закодированные переменные окружения. Их значения могут быть следующими:
vars = {
"@$&%01": "%ProgramFiles%",
"@$&%04": "%InstallPath%",
"@$&%20": "%UserName%",
"@$&%21": "%Language%",
"@$&%22": "%ComputerName%",
"@$&%36": "%ProgramFiles64%",
"@$&%02": "%WindowsDir%",
"@$&%03": "%SystemDir%",
"@$&%16": "%CommonFiles%",
"@$&%05": "%TempDir%",
"@$&%06": "%Desktop%",
"@$&%08": "%ProgramsDir%",
"@$&%09": "%StartMenu%",
"@$&%11": "%Favourites%",
"@$&%14": "%StartUp%",
"@$&%34": "%Templates%",
"@$&%26": "%AppData%",
"@$&%17": "%SystemDrive%",
}
После блока файлов следует блок команд, которые хранятся в обычном plaintext и не подвергаются каким-либо трансформациям, за исключением замены переменных окружения.
Формат команды:
X1 command params X2 X3 X4, где:
- X1 (run type) — 0=application, 1=shell executable.
- X2 (run as) — 1=normal, 3=maximize, 6=minimize, 0=hide.
- X3 (run schedule) — 0=before_unpacking, 1=after_unpackinng.
- X4 (wait until the application finishes) — 0=no, 1=yes.
Заключение
Зная перечисленные вводные, несложно реализовать свой анпакер, что мы и сделали. Наш распаковщик на Python корректно обрабатывает оверлей конфигурации, восстанавливает оригинальные имена файлов и пути, декодирует переменные окружения, а также извлекает команды и правки реестра — все это в полностью статическом режиме, без запуска кода.
Важно помнить, что Smart Install Maker — лишь один из множества «конструкторов», которые злоумышленники адаптируют под свои нужды. Понимание внутренней логики таких инструментов, а не просто использование готовых утилит, позволяет быстрее реагировать на новые модификации и обходить простые методы сокрытия.
Надеемся, что этот небольшой разбор поможет коллегам экономить время на рутинной распаковке и сосредоточиться на том, что действительно важно — анализе поведения и тактик противника.

































































