Пишем нерезидентный RunPE лоадер на C++

Пишем нерезидентный RunPE лоадер на C++

ims0rry

Вступление

Начнем с того, что такое лоадер.

Существует 2 версии лоадеров: резидентная и нерезидентная.

Резидентная

Эта версия в 100% случаев имеет какую-либо ПУ/Админку, после запуска -закрепляется в системе и удаленно получает команды на выполнение. В пример приведу свое творение, Kuriyama Loader.

Нерезидентная

Данная версия чаще всего не имеет панели управления, но есть продукты, которые ее предоставляют. После запуска - выполняет все задания, которые предустановлены в лоадере, либо получены из админ-панели, затирает все свои файлы и самоудаляется. Ярким примером является продукт @foxovsky - Arkei.

В этой статье я хочу рассмотреть пример одной из функций нерезидентного лоадера: загрузка и запуск файла в памяти (средствами RunPe).

Архитектура

Для начала, нужно продумать алгоритм работы лоадера. В идеале, с сервера должен подгружаться не файл в чистом виде (иначе его сразу задетектит антивирус), а зашифрованный бинарник, который, впоследствии, будет расшифрован лоадером. Т.е. нужен отдельный энкодер.

Далее, необходим какой-нибудь RunPe, функция скачивания файла и его дешифровка.

Алгоритм получится, примерно, такой:

Скачивание файла -> Дешифровка -> Запуск в памяти

Encoder

Особо сильно заморачиваться с энкодером не нужно, можно написать обычное вычитание байт из оригинального значения:

Открываем файл, считываем его в unsigned char *, далее, вычитаем 0x56 из каждого значения массива, получившееся записываем в файл out.exe, пробуем таким же методом дешифровать и записываем дешифрованный файл в decrypted.exe.

Loader

Начнем по порядку алгоритма:

Скачивание файла реализуем средствами URLMON, важный момент, преобразование char * в LPCWSTR, без этого файл будет качаться рядом с лоадером с непонятным названием (проблемы кодировки).

Далее пишем метод дешифровки и запуска файла. Открываем файл, считываем его и отнимаем ключ от изначального значения массива в цикле, после чего запускаем полученный массив байт в памяти (метод RunPe можно найти в интернете, для особо ленивых выложу в сорцах).

Метод Main будет выглядеть следующим образом:

Качаем файл в %temp%\pld.exe. Передаем в параметры DecryptAndRun полный путь до файла и значение, которое мы использовали в энкодере (0x56). Также, сюда можно прикрутить паунс всех файлов в корзину, но оставлю это на вас.

Ссылки

Scantime - http://viruscheckmate.com/id/BW8mQjZE15mx

Исходники - https://github.com/ims0rry/Non-resident-RunPE-Loader

--------------------------------------

Автор @ims0rry

https://t.me/ims0rryblog