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

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

Life-Hack [Жизнь-Взлом]/Хакинг

#Обучение

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

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

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

sha1sum Default.SFX
368619270c0f5a921813a9acd631a668c5f78388  Default.SFX

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

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

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

Интересующий нас фрагмент кода начинается с адреса 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 для этого.

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

Теперь зададим значение по умолчанию для поля ввода пароля.

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

00418B6B 74 14 -> EB 14

После этого форма ввода пароля даже не будет успевать отобразиться - сразу будет взят пароль из поля для ввода, с последующим мгновенным закрытием диалогового окна.

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

SamplePassword

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

Сохраним модифицированный файл. Теперь при двойном клике по файлу - он будет извлечен без дополнительного запроса пароля, а при попытке открыть файл в 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...')

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

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

Источник


Report Page