• XSS.stack #1 – первый литературный журнал от юзеров форума

Как происходит чистка стаба криптора?

Как как ? Ручками. Во-первых существует много способов задетектить твой стаб. Начинается все с сигнатур, есть последовательность байт, и если эта последовательность будет найдена у тебя в файле - детект. Бороться с этим так же достаточно просто - файл нарезается на кусочки разного размера по нарастающей, с шагом например 100 байт (100, 200, 300, 400, 500 ... 10200, 10300, 10400) от 100 и до конечного размера файла. Для удобства их можно так же именовать. Затем берется антивирус и натравливается на папку с этими файлами. Все файлы в которые попала сигнатура на которую есть детект будут удалены, а это значит что в последнем файле, который не был удален еще нет полной сигнатуры, но если взять еще следующие 100 байт, то сигнатура появится целиком. Значит берутся два файла (смещения) на которых впервые появляется сигнатура, а это последний файл который остался в папке минус 100 байт и он же плюс 100 байт. Для примера допустим неудаленный файл с максимальным смещением будет с именем 5500, это значит что в диапазоне смещений 5400-5600 лежит сигнатура (первая из всех возможных), по которой идет детект. Далее тамими же махинациями с уже более мелким шагом круг поиска сигнатуры сужается до 1 байта. Определив смещения начала и конца сигнатуры по которой идет детект, ты отправляешься в IDA PRO и ищешь место в ассемблерном листинге, где находится эта сигнатура, затем незамысловатым нажатием F5 получаешь псевдокод до жути похожий на тот, что ты писал в исходниках, так ты понимаешь примерные строки, которые надо изменить\разбавить мусорным кодом в твоем исходнике что бы сбить сигнатуру. Если же стаб не твой и исходников нет, то тут уже применяешь свои навыки знания ассемблера и пытаешься изменить команды в месте сигнатуры так, что бы они состояли из других команд (читай БАЙТ) и при этом помещались в том же самом месте. Чаще всего сигнатуру просто бъют ложным переходом в виде вставки чего-то вроде

Код:
cmp rax, 0
jnz metka
jz metka
continue:
Где metka это адрес неиспользуемого места в секции кода, туда переносится часть инструкций занимаемых переходом описанным выше, затем после них вставляется переход на метку continue
Сигнатура получается разбита и можно переходить к поиску следующей по алгоритму описанному выше

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

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

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

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

Вложения

  • krypton.jpg
    krypton.jpg
    90.1 КБ · Просмотры: 70
Как как ? Ручками. Во-первых существует много способов задетектить твой стаб. Начинается все с сигнатур, есть последовательность байт, и если эта последовательность будет найдена у тебя в файле - детект. Бороться с этим так же достаточно просто - файл нарезается на кусочки разного размера по нарастающей, с шагом например 100 байт (100, 200, 300, 400, 500 ... 10200, 10300, 10400) от 100 и до конечного размера файла. Для удобства их можно так же именовать. Затем берется антивирус и натравливается на папку с этими файлами. Все файлы в которые попала сигнатура на которую есть детект будут удалены, а это значит что в последнем файле, который не был удален еще нет полной сигнатуры, но если взять еще следующие 100 байт, то сигнатура появится целиком. Значит берутся два файла (смещения) на которых впервые появляется сигнатура, а это последний файл который остался в папке минус 100 байт и он же плюс 100 байт. Для примера допустим неудаленный файл с максимальным смещением будет с именем 5500, это значит что в диапазоне смещений 5400-5600 лежит сигнатура (первая из всех возможных), по которой идет детект. Далее тамими же махинациями с уже более мелким шагом круг поиска сигнатуры сужается до 1 байта. Определив смещения начала и конца сигнатуры по которой идет детект, ты отправляешься в IDA PRO и ищешь место в ассемблерном листинге, где находится эта сигнатура, затем незамысловатым нажатием F5 получаешь псевдокод до жути похожий на тот, что ты писал в исходниках, так ты понимаешь примерные строки, которые надо изменить\разбавить мусорным кодом в твоем исходнике что бы сбить сигнатуру. Если же стаб не твой и исходников нет, то тут уже применяешь свои навыки знания ассемблера и пытаешься изменить команды в месте сигнатуры так, что бы они состояли из других команд (читай БАЙТ) и при этом помещались в том же самом месте. Чаще всего сигнатуру просто бъют ложным переходом в виде вставки чего-то вроде

Код:
cmp rax, 0
jnz metka
jz metka
continue:
Где metka это адрес неиспользуемого места в секции кода, туда переносится часть инструкций занимаемых переходом описанным выше, затем после них вставляется переход на метку continue
Сигнатура получается разбита и можно переходить к поиску следующей по алгоритму описанному выше

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

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

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

Ну и еще есть скан памяти периодический, это когда твой криптор уже запустил целевой процесс, он во всю работает, но он открыт для сканирования на те же самые банальные сигнатуры.
Вот на этом обламывается 99% крипторов, будь то старые RunPE\LoadPE или более новые экземпляры с изощренными способами загрузки, все равно образ в итоге остается открыт для сканирования после загрузки
И тут выбор решений очень невелик, это либо софт-анклавы, либо морфинг\виртуализация самого кода, который подвергается крипту, но в таком случае в самом крипте уже не будет необходимости, так как криптор в основном скрывает от детекта по сигнатурам, если файл детектится по поведению, то хоть чем ты его закриптуй это не спасет.
спасибо за обьяснение, лайк не могу поставить, лимит :(
 
А можно узнать , что за новые технологии крипта?
Сами технологии крипта практически не меняются, основная цель - сокрытие файла, шифрование и тд, ты процитировал не все сообщение, там было "с изощренными способами загрузки", я думаю тебя интересовал именно этот момент
Так вот есть еще достаточно много способов загрузки в память, помимо старых RunPE\LoadPE, как минимум парочка, а если их комбинировать и видоизменять, то получится еще больше, но в паблике, да и в привате я не видел ни у одного криптора данных технологий, хотя теоретическая часть данного вопроса поднималась на форумах, но реализовать так никто и не реализовал полноценно, что бы этим можно было хотя бы пользоваться или продавать, хотя я не исключаю, что у кого-то в приватах может валяться PoC этой технологии, как и у меня, я как раз сейчас допиливаю ее до ума, что бы было все красиво.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх