Сегодня мы окунемся в историю и прильнем к ее анналам. Те, кто застал конец прошлого века, когда компьютеры были большими, а трава зеленой, прекрасно помнят, как устанавливали себе на компьютер игры и приложения с купленных на рынке компакт‑дисков: для этого использовался инсталлятор Wise Installer.
Эта разработка команды Wise Solution (что в переводе означает «Мудрые решения») в те времена была практически монополистом среди инсталляторов всевозможного софта. При всем богатстве зоопарка современных аналогов актуальных дистрибутивов на этой платформе практически не осталось, но мы попробуем вспомнить прошлое и поковыряться во внутренностях такого дистрибутива.
Итак, постановка задачи. Предположим, мы нашли на старом диске дистрибутив некоей жизненно важной утилиты, но она категорически отказывается устанавливаться, пока не установлена другая, основная программа (отсутствующая у тебя и совершенно тебе ненужная). В пакет той самой «большой программы» эта утилита изначально входила. Сообщение об ошибке, после которого инсталлятор закрывается, выглядит вот так.

Требуется найти способ, как инсталлировать утилиту без основной программы.
Идентифицировать защиту даже и не нужно — она сама при запуске корявыми синими буквами выдает, что это Wise Installer Wizard. Detect It Easy тоже соглашается с этим.

Запускаем инсталлятор из отладчика x32dbg и при появлении окна сообщения прерываем программу. Смотрим стек вызовов.

Видно, что окно сообщения реализовано с использованием функции DialogBoxParamA
, которая вызывается из загадочной библиотеки glcb36c.
. А она, в свою очередь, находится во временном подкаталоге системы.
Легко убедиться, что при каждом новом запуске инсталлятора название у нее разное, но файл один и тот же. Вытаскиваем его из временного каталога наружу и препарируем при помощи IDA. Самый нижний адрес возврата 10001EA8
принадлежит основной функции WiseMain
, из нее вызывается функция sub_10003C7C
, в свою очередь вызывающая диалоговое окно сообщения. И этот вызов выглядит весьма интересно.

Очень похоже на обработчик опкодов интерпретатора. Указатель на текущую команду которого IDA почему‑то называет nLength
. Попробуем потрассировать шитый код покомандно в нашем любимом отладчике x64dbg.
Нас немного огорчает то обстоятельство, что библиотека glcb36c.
мало того что не загружается сразу, так вдобавок материализуется в процессе работы во временном каталоге под разными именами, а это затрудняет установку на нее точек останова. Но мы уже опытные хакеры и знаем, как с этим бороться.
В параметрах x64dbg на вкладке «События» ставим галку на «Прерываться на точке входа DLL», после чего запускаем инсталлятор. Пока что нам сильно везет — первая же остановка выводит нас на точку входа в библиотеку со знакомым названием glc60fb.
, у которой вдобавок и экспорты идентичны требуемым.

Теперь и точку останова можно ставить на выборку команд, благо библиотека еще и на фиксированные адреса садится. Остановившись на ней, посмотрим в окне дампа, откуда считывается текущая команда.

На первый взгляд все выглядит как типичный откомпилированный шитый код инсталляционного скрипта. Если в свойствах нашей точки останова поставить в поле условия 0
, а в поле текста журнала {
, то в журнале можно получить лог последовательности выполнения команд с их адресами следующего вида:
...
460BE1: 0
460C29: 9
460C8C: 9
460CDB: 9
460D5C: 9
460DDD: 9
460E31: 9
460EDA: 1B
460EDB: 9
460F3E: 9
460F92: 9
460FF0: 9
46104E: 9
461169: 9
461203: C
46121B: 9
46126F: 9
4612DC: D
461918: 9
461AB1: 9
461C81: 9 | ...
Все это очень замечательно, но пока что мы не знаем ни названий команд, ни синтаксиса, ни их реального действия. Мы и сам скрипт видели только в окне отладчика, поэтому начнем с его извлечения.
Погуглив, мы к своему удивлению обнаруживаем, что, несмотря на свою винтажность, формат Wise Installer практически не документирован и очень беден на утилиты для реверса. Существует несколько практически однотипных утилит‑распаковщиков: WiseUnpacker, ExWise, HWUN и E_WISE (к сожалению, за давностью лет эти проекты, похоже, канули в Лету, я их смог найти лишь на архивных сайтах).
Как я уже говорил, все это практически однотипные распаковщики инсталляционных архивов, даже без восстановления имен файлов, содержащихся в пакете. Конечно, инсталляционный скрипт без особого труда обнаруживается в распакованных файлах, но есть и кое‑что поинтереснее.
Создатели утилиты REWise попытались пойти чуть дальше и реверсировать инсталляционный скрипт. К сожалению, похоже, им надоело это безблагодатное дело еще на самом первоначальном этапе, поэтому опция декомпиляции скрипта -z
сохранилась только в отладочном варианте, который по умолчанию отключен. Попробуем воспользоваться их наработками для лучшего понимания структуры и функционирования интерпретатора инсталляционного скрипта.
Итак, натравив REWize на наш инсталляционный модуль, получаем в консоль огромную простыню даже не декомпилированного кода, а, скорее, отладочного лога покомандной разборки инсталляционного скрипта. Он имеет следующий вид:
...0x16 'W32INST_PATH_'0x00 2440 0x00000000 0x000011B4 1999-01-21 14:40:08 9728 0000000000000000000000000000000000000000 20CC89C5 'TEMP/W32INST_PATH_' "(null)" "(null)" "(null)" "(null)" "(null)" "(null)"0x09 09 '(null)' 'f16' '(null)' '(null)'- "0_x7FBB_FILEVERSION_x7F"- "0_x7FBB_FILEVERSION_x7F"- "0_x7FBB_FILEVERSION_x7F"- "0_x7FBB_FILEVERSION_x7F"- "0_x7FBB_FILEVERSION_x7F"0x09 09 '(null)' 'f16' '(null)' '(null)'- "0_x7FBB_VERSION_x7F"- "0_x7FBB_VERSION_x7F"- "0_x7FBB_VERSION_x7F"- "0_x7FBB_VERSION_x7F"- "0_x7FBB_VERSION_x7F"0x09 09 '(null)' 'f16' '(null)' '(null)'...
По‑прежнему ни фига не понятно, кроме того, что первое слева Hex-число — это код операции, а следующая за ним мешанина строк и чисел — ее параметры.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее