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

Какие бывают техники морфинга кода?

Ags1of

RAM
Пользователь
Регистрация
26.11.2021
Сообщения
122
Реакции
1
Хотел бы задать вопрос по теме морфинга исходного кода: Какие существуют техники морфинга исходного кода, что он всегда будет уникальным/похожим на легитимный? Как вообще код морфится таким образом, что он не меняет своей функциональности, но меняет логику? В моем понимании, при изменении семантики кода, типо у нас есть метод, в нём выполняются какие-либо действия, так вот при первой обработке кода морфером, допустим, тело этого метода оборачивается в условие if(true), то есть, семантика изменилась, потом, допустим, при второй обработке, к if(true) добавиться else или else-if блок, в свою очередь в блоке if(true) условие поменяется на false, а в else или else-if значение условия будет true, и мы перенесём тело метода из if и else/else-if. Но вот что дальше, как дальше морфить код, ведь тут элементарно закончатся вариации морфинга путём обёртки кода. Я думаю, что уже готовые условия if и else if, внесённые в первой-второй обработке,уже не будет смысла при третьей, четвёртой обработке оборачивать по такому же принципу, создавая другие узлы логических операторов. Так вот, кто может подсказать или натолкнуть на мысль, как можно морфить код так, чтобы при каждой обработке(обрабатываться может как сурс, так уже и заморфленный сурс) компилировался новый уникальный файл, с отличающейся семантикой, чтобы эвристические анализаторы не ругались на файл, что он вредонос? Какие есть доступные для изучения алгоритмы морфинга исходного кода?

И вообще есть ли смысл мофрить один и тот же код несколько раз(типо уже заморфленный код морфить ещё раз), если принцип работы морфинга один и тот же? Как мне кажется, это просто будет приводить к тому, что все прописанные мной инструкции будут на какой-то попытке морфинга неактуальны, так как все возможные вариации изменений внесены
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Смотря что. Если это компилируемый язык, типа Сишечки, Плюсов, Дэ, Ржавого и других, то никакие if(false) тебе не помогут, оптимизатор вырежет код, который никогда не исполняется. Оптимизации внутри функций работают без необходимости включать LTO. Если это скриптовый язык, типа ДжаваСкрипта, Пыхи или Петухона, то да, в его текст можно всякой чуши напихать.

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

Но в целом я предлагаю ознакомиться с opaque predicates, control flow flattening и генерацией мусорного кода, похожего на легитимный, и обернутого в эти самые предикаты.
 


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