Речь пойдет о тривиальной модификации стаба самораспаковывающегося архива WinRAR, которая состоит в следующем: сделать, чтобы SFX-архив при обычном запуске просто извлекал свое содержимое, а при попытке открытия с помощью WinRAR - запрашивал ввод пароля. Зачем это? Да так, увидел тему на форуме и решил попробовать.
Стаб SFX-архива - это обычный исполняемый файл, оверлей которого содержит полезную нагрузку, сформированную пользователем: файлы, которые необходимо распаковать, и настройки, задаваемые при создании архива. Эта основа находится в директории, куда был установлен WinRAR, и называется Default.SFX.
Воспользуемся отладчиком-дизассемблером x64dbg, чтобы изучить этот файл. К слову, файл был взят из WinRAR версии 5.40, контрольная сумма:
1 2 |
sha1sum Default.SFX 368619270c0f5a921813a9acd631a668c5f78388 Default.SFX |
Сразу обратимся к перечню строк, которые используются в коде.
Меня сразу заинтересовали строки GETPASSWORD1, так как при открытии SFX-архива, который защищен паролем, появляется окно для ввода пароля, а стиль именования намекает, что это идентификатор ресурса, отвечающего за это окно. Рассмотрим подробнее, что происходит в фрагментах кода, которые ссылаются на эти строки.
Первый фрагмент - это вызов функции WinAPI DialogBoxParam, после выполнения которой появляется диалоговое окно, предлагающее ввести пароль. Обратите внимание, один из аргументов - это адрес 418B2B, который представляет собой функцию-обработчик оконных сообщений для появившегося диалогового окна. Если перейти по этому адресу и полистать код, то почти сразу увидим место, где происходит получение пароля из диалогового окна.
Интересующий нас фрагмент кода начинается с адреса 418B81, а на этот адрес можно попасть по условному переходу с адреса 418B6B. Запомним последнее значение, оно нам еще понадобится. Также приведу примерную логику фрагмента кода функции-обработчика, чтобы было понятнее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 для этого.
После открытия файла, сразу перейдем в раздел диалогов и найдем интересующий нас диалог.
Теперь зададим значение по умолчанию для поля ввода пароля.
Такое большое число символов обусловленно тем, что мне захочется автоматизировать процесс подстановки пароля, а менять каждый раз содержимое вручную, когда хочется изменить пароль - пустая трата времени. Кстати, после сохранения Default.SFX с модифицированной секцией ресурсов, было бы неплохо поменять условный переход на безусловный по адресу, который я упоминал выше.
1 |
00418B6B 74 14 -> EB 14 |
После этого форма ввода пароля даже не будет успевать отобразиться - сразу будет взят пароль из поля для ввода, с последующим мгновенным закрытием диалогового окна.
Давайте попробуем создать SFX-архив с модифицированным Default.SFX. Помещаем Default.SFX в директорию WinRAR и, как обычно, создаем архив с защитой паролем. В качестве пароля введем:
1 |
SamplePassword |
Теперь попробуем открыть получившийся архив. Если модификация была произведена корректно, то появится подобное окно:
Все дело в том, что пароль, который мы задали, не совпадает с тем, который прописан в стабе. Что ж, для теста изменим содержимое стаба в каком-нибудь hex-редакторе. Для этого найдем строчку kaimi.io в файле и заменим её, а также цифры после, желаемым паролем, остаток заполним нулевыми байтами. Я сделаю это в CFF Explorer:
Сохраним модифицированный файл. Теперь при двойном клике по файлу - он будет извлечен без дополнительного запроса пароля, а при попытке открыть файл в WinRAR или каком-либо другом архиваторе - нас встретит диалоговое окно с просьбой ввести пароль от архива. Задание выполнено, но давайте сделаем небольшой скрипт, который будет заменять пароль в стабе, чтобы лишний раз не открывать hex-редактор.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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...') |
Для запуска скрипта потребуется интерпретатор Python 3, скрипт следует поместить в директорию с WinRAR и модифицированным Default.SFX.
Архив со скриптом, оригинальным и модифицированным Default.SFX: скачать (пароль на архив: kaimi-io)
Изящно.
Вообще я думал, что SFX-архив проверяет свою целостность.
Kaimi, порекомендуй интересные книги.
Какой тематики?
Любой.
https://www.amazon.com/Windows-Internals-Part-architecture-management/dp/0735684189/
Здравствуйте, спасибо за информацию, вы ее подаете лучше чем все преподаватели программирования. Может посоветуете, как снять защиту для тестов в tMaker. Нужно отредактировать старые тесты в установленном зарегистрированном пакете SunRav (tMaker, tTester, t admin). Редакция тестов непосредственно в tMaker. Могу инсталляцию программы с генератором ключей и сами тесты сбросить через Google disk. Выручите целый университет, включая преподавателей.
В чем защита состоит?
Привет Ками, как можно расспаковать рар без брута?
Никак
Говорят что есть лозейки , и за деньги как то вскрывают архивы, без брута, что скажешь по этому поводу?
Это вряд ли. Сомневаюсь что кто-то вскроет архив с 16 символьным паролем вида: Bvp8LNjGeh8J$ffS
Привет Kaimi! У меня проблема с твоим модулем Анти Вирус его удаляет. И SFX созданные им тоже удаляет. Как его исправить он мне очень нужен...
Без понятия, я же криптом не занимаюсь. Попробуй стаб как-то модифицировать или сделай аналогичное для 7z.
Лож. Полная ложь. Посмотри декриптери на 16 знака сколько есть. Точ 0.
Ясно. Ладна буду что то думать.
Kaimi, очень интересный блог, много открыл для себя, продолжай.
Знаю, ты не занимаешься криптом, но можешь ли ты посоветовать книги по этой теме?
Привет, я отвечу. Я писал упаковщик, что недалеко от криптора, и для этого использовал только статью Криса Касперски "Путь воина" про формат PE-файлов. А дальше просто экспериментировал, читал MSDN и всякие мелкие статейки, которые находились в интернете.
Kaimi. А как быть с sfx 7z архивом. Подскажите пожалуйста. У rar-а в sfx модуле есть getpassword и джампер в 7z sfx модуле этого нет.
Надо смотреть, что в 7z, думаю и его можно модифицировать необходимым образом
Может взгляните? Очень интересно.
У 7zip открытый исходный код в отличии от WinRAR.
Можно самостоятельно модифицировать исходный код, чтобы пароль брался не из диалога, а содержался внутри.
Можно и диалог модифицировать, где-то тут: https://github.com/pornel/7z/blob/master/CPP/7zip/UI/GUI/ExtractDialog.cpp
Спасибо.
Гениально, это вообще годнота. Спасибо за столь подробную инфу.
А можно еще статеек по модификации раровского стаба?
Очень хочется исправить несколько косяков с GUI и реализовать весь интерфейс через html , подрузку картинок в html из секции ресурсов и прочие плюшки.
Еще как миниму хотелось бы сделать элементы интерфейса с прозрачным фоном, а то грузишь картинку на фон, а текс на белой плашке.
Еще бы реальзовать черную и белую тему, вернуть бы парочку просраных элементов из старых версий, вроде цветного оформления лога распаковки и тд.
Тогда уж проще взять Inno Setup, InstallShield, NSIS или что-то подобное, где бОльшая возможность кастомизации изначально задумана.
он на дежурстве