• Уменьшение отступа

    Обратная связь

    (info@ru-sfera.pw)

Описание Модифицируем стаб SFX WinRAR


Антоха

Уважаемый пользователь
Форумчанин
Регистрация
26.12.2012
Сообщения
2 780
Репутация
4 652
Статейка из в дополнение к теме ВАЖНО - Делаем крутой крипто-джойнер и обходим детект VT



Речь пойдет о тривиальной модификации стаба самораспаковывающегося архива , которая состоит в следующем: сделать, чтобы SFX-архив при обычном запуске просто извлекал свое содержимое, а при попытке открытия с помощью WinRAR - запрашивал ввод пароля. Зачем это? Да так, увидел и решил попробовать.
Стаб SFX-архива - это обычный исполняемый файл, оверлей которого содержит полезную нагрузку, сформированную пользователем: файлы, которые необходимо распаковать, и настройки, задаваемые при создании архива. Эта основа находится в директории, куда был установлен WinRAR, и называется Default.SFX.

Воспользуемся отладчиком-дизассемблером , чтобы изучить этот файл. К слову, файл был взят из WinRAR версии 5.40, контрольная сумма:

Код:
sha1sum Default.SFX
368619270c0f5a921813a9acd631a668c5f78388  Default.SFX

Сразу обратимся к перечню строк, которые используются в коде.

dbg-strings.png


Меня сразу заинтересовали строки GETPASSWORD1, так как при открытии SFX-архива, который защищен паролем, появляется окно для ввода пароля, а стиль именования намекает, что это идентификатор ресурса, отвечающего за это окно. Рассмотрим подробнее, что происходит в фрагментах кода, которые ссылаются на эти строки.

dbg-1st.png


Первый фрагмент - это вызов функции WinAPI DialogBoxParam, после выполнения которой появляется диалоговое окно, предлагающее ввести пароль. Обратите внимание, один из аргументов - это адрес 418B2B, который представляет собой функцию-обработчик оконных сообщений для появившегося диалогового окна. Если перейти по этому адресу и полистать код, то почти сразу увидим место, где происходит получение пароля из диалогового окна.

dbg-2nd.png


Интересующий нас фрагмент кода начинается с адреса 418B81, а на этот адрес можно попасть по условному переходу с адреса 418B6B. Запомним последнее значение, оно нам еще понадобится. Также приведу примерную логику фрагмента кода функции-обработчика, чтобы было понятнее:

Код:
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    ...
    if(uMsg == WM_INITDIALOG)
    {
        SetDlgItemText(...)
    }
    else
    {
        if(uMsg != WM_COMMAND)
            return 0;
        if(wParam == 1) // 418B6B
        {
            GetDlgItemText(...) // 418B81
            func1(...)
            func2(...)
            EndDialog(...)
        }
    }
    ...
}

У нас есть одна из составляющих, теперь подумаем, куда можно прицепить пароль к архиву, чтобы поменьше заморачиваться и попроще им воспользоваться, не вдаваясь в анализ логики внутренних методов архиватора. Правильно, в ресурсы, точнее в качестве значения по умолчанию для поля, куда вводится пароль. Я буду использовать PE Explorer для этого.

pe-exp.png


После открытия файла, сразу перейдем в раздел диалогов и найдем интересующий нас диалог.
Теперь зададим значение по умолчанию для поля ввода пароля.

pe-exp-def.png


Такое большое число символов обусловленно тем, что мне захочется автоматизировать процесс подстановки пароля, а менять каждый раз содержимое вручную, когда хочется изменить пароль - пустая трата времени. Кстати, после сохранения Default.SFX с модифицированной секцией ресурсов, было бы неплохо поменять условный переход на безусловный по адресу, который я упоминал выше.

Код:
 00418B6B 74 14 -> EB 14

После этого форма ввода пароля даже не будет успевать отобразиться - сразу будет взят пароль из поля для ввода, с последующим мгновенным закрытием диалогового окна.
Давайте попробуем создать SFX-архив с модифицированным Default.SFX. Помещаем Default.SFX в директорию WinRAR и, как обычно, создаем архив с защитой паролем. В качестве пароля введем:

Код:
SamplePassword

Теперь попробуем открыть получившийся архив. Если модификация была произведена корректно, то появится подобное окно:

sfx-fail.png


Все дело в том, что пароль, который мы задали, не совпадает с тем, который прописан в стабе. Что ж, для теста изменим содержимое стаба в каком-нибудь hex-редакторе. Для этого найдем строчку kaimi.io в файле и заменим её, а также цифры после, желаемым паролем, остаток заполним нулевыми байтами. Я сделаю это в CFF Explorer:

cff-exp.png


Сохраним модифицированный файл. Теперь при двойном клике по файлу - он будет извлечен без дополнительного запроса пароля, а при попытке открыть файл в WinRAR или каком-либо другом архиваторе - нас встретит диалоговое окно с просьбой ввести пароль от архива. Задание выполнено, но давайте сделаем небольшой скрипт, который будет заменять пароль в стабе, чтобы лишний раз не открывать hex-редактор.

Код:
import sys
import fileinput

pattern = 'kaimi.io0123456789012345678901234567890123456789'

print('Enter desired password:')
password = input('>')

if len(password) > len(pattern):
    print('Too long password')
else:
    password = password.encode('utf-16le')
    pattern = pattern.encode('utf-16le')
    
    password = password.ljust(len(pattern), b'\0')
    
    with fileinput.FileInput('Default.SFX', inplace=True, backup='.bak', mode='rb') as file:
            for line in file:
                sys.stdout.buffer.write(line.replace(pattern, password))

    print('Done')

input('\nPress Enter to exit...')

Для запуска скрипта потребуется интерпретатор , скрипт следует поместить в директорию с WinRAR и модифицированным Default.SFX.

Архив со скриптом, оригинальным и модифицированным Default.SFX:
в аттаче
 

Вложения

  • sfx-mod.zip
    274.6 КБ · Просмотры: 33
Верх Низ