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

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Речь пойдет о тривиальной модификации стаба самораспаковывающегося архива
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, которая состоит в следующем: сделать, чтобы SFX-архив при обычном запуске просто извлекал свое содержимое, а при попытке открытия с помощью WinRAR - запрашивал ввод пароля. Зачем это? Да так, увидел тему на форуме и решил попробовать.
Стаб SFX-архива - это обычный исполняемый файл, оверлей которого содержит полезную нагрузку, сформированную пользователем: файлы, которые необходимо распаковать, и настройки, задаваемые при создании архива. Эта основа находится в директории, куда был установлен WinRAR, и называется Default.SFX.

Воспользуемся отладчиком-дизассемблером
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, чтобы изучить этот файл. К слову, файл был взят из WinRAR версии 5.40, контрольная сумма:
Код:
sha1sum Default.SFX
368619270c0f5a921813a9acd631a668c5f78388  Default.SFX
Сразу обратимся к перечню строк, которые используются в коде.
6c6e56a10fe9af631f6795c8cd841183.png
Меня сразу заинтересовали строки GETPASSWORD1, так как при открытии SFX-архива, который защищен паролем, появляется окно для ввода пароля, а стиль именования намекает, что это идентификатор ресурса, отвечающего за это окно. Рассмотрим подробнее, что происходит в фрагментах кода, которые ссылаются на эти строки.
588e398c4cc70f3625051ec988ee1649.png
Первый фрагмент - это вызов функции WinAPI
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, после выполнения которой появляется диалоговое окно, предлагающее ввести пароль. Обратите внимание, один из аргументов - это адрес 418B2B, который представляет собой функцию-обработчик оконных сообщений для появившегося диалогового окна. Если перейти по этому адресу и полистать код, то почти сразу увидим место, где происходит получение пароля из диалогового окна.
f3ed31da7b3842195ec5e5737840bb26.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 для этого.
e48abc3b7ac54d4f85b622a08c18654c.png
После открытия файла, сразу перейдем в раздел диалогов и найдем интересующий нас диалог.
Теперь зададим значение по умолчанию для поля ввода пароля.
961239d7d7b557abf225308abd4109b0.png
Такое большое число символов обусловленно тем, что мне захочется автоматизировать процесс подстановки пароля, а менять каждый раз содержимое вручную, когда хочется изменить пароль - пустая трата времени. Кстати, после сохранения Default.SFX с модифицированной секцией ресурсов, было бы неплохо поменять условный переход на безусловный по адресу, который я упоминал выше.
Код:
00418B6B 74 14 -> EB 14
После этого форма ввода пароля даже не будет успевать отобразиться - сразу будет взят пароль из поля для ввода, с последующим мгновенным закрытием диалогового окна.
Давайте попробуем создать SFX-архив с модифицированным Default.SFX. Помещаем Default.SFX в директорию WinRAR и, как обычно, создаем архив с защитой паролем. В качестве пароля введем:
Код:
SamplePassword
Теперь попробуем открыть получившийся архив. Если модификация была произведена корректно, то появится подобное окно:
6d62dc0e0788ff7ec748577ab80b9211.png
Все дело в том, что пароль, который мы задали, не совпадает с тем, который прописан в стабе. Что ж, для теста изменим содержимое стаба в каком-нибудь hex-редакторе. Для этого найдем строчку kaimi.io в файле и заменим её, а также цифры после, желаемым паролем, остаток заполним нулевыми байтами. Я сделаю это в CFF Explorer:
7b5638344d1b843f583241d259b7ef31.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...')
Для запуска скрипта потребуется интерпретатор
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, скрипт следует поместить в директорию с WinRAR и модифицированным Default.SFX.
Архив со скриптом, оригинальным и модифицированным Default.SFX:
 

Вложения

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя