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

Viva la Морфер

При отключенной оптимизации и генерации большого числа таких мат. операций (банально статистика опкодов будет нарушена из за аномального числа sub\add\mul и т.д.) аверские эвристики обязательно запоют на сей факт.

Но.. Есть другой путь - завязывать часть переменных в мат функциях на неизвестные компилятору заранее.

Как пример:
rand
ответы api функций
результат исполнения переменных в длинных циклах
 
При отключенной оптимизации и генерации большого числа таких мат. операций (банально статистика опкодов будет нарушена из за аномального числа sub\add\mul и т.д.) аверские эвристики обязательно запоют на сей факт.

Но.. Есть другой путь - завязывать часть переменных в мат функциях на неизвестные компилятору заранее.

Как пример:
rand
ответы api функций
результат исполнения переменных в длинных циклах
Ну или суммирование без суммирования:) Да ещё разбавить трешем эту функцию и каждую операцию в ней.
Код:
public static int add(int a, int b)    {
    if (b == 0) return a;
    int sum = a ^ b;          
    int carry = (a & b) << 1;    
    return add(sum, carry);        
}
 
К сожалению адекватный треш это слишком не простая тема и он в 90% случаев пораждает или порадит в будущем эвристические детекты,
а позже и генерики.

Гоораздо интереснее морфить и генерировать треш таким образом, чтобы он собираясь, отправлялся в анализатор,
который с помощью обученной на легитимных семплах конкретно компилятора нейросетке (RL) проверял степень адекватности сгенерированного кода.
На выходе получился бы морфер, который без фолзов не разобрать не эвристиками ни эмуляцией.. Это да, это годно)
 
К сожалению адекватный треш это слишком не простая тема и он в 90% случаев пораждает или порадит в будущем эвристические детекты,
а позже и генерики.

Гоораздо интереснее морфить и генерировать треш таким образом, чтобы он собираясь, отправлялся в анализатор,
который с помощью обученной на легитимных семплах конкретно компилятора нейросетке (RL) проверял степень адекватности сгенерированного кода.
На выходе получился бы морфер, который без фолзов не разобрать не эвристиками ни эмуляцией.. Это да, это годно)
Позволь вопрос. А ты откуда к нам пожаловал? vxер или вайтхет на ресерчах?) откуда опыт то?
 
Короч, по нейросеткам. Я проработал несколько лет в сфере ML и AI.

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

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

2) Сложно и муторно. Ну допустим ты извернулся и обучил нейросеть. Что дальше идет? Тесты. Реально у кого-то есть желание раз за разом компилировать и проверять, действительно ли софт на выдаче а) работает б) не детектится ?

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

Я сейчас нахожусь в поиске перспективного, интересного и денежного проекта для сотрудничества.
Если есть бодрые предложения - пишите в личку, обсудим.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
за деньги
Одному тут реализовали уже. 160к в гаранте застряли.
А по делу то имхо лучший вариант искать кого то старой школы в реали, желательно из практикующих преподователей.
 
У морфа и обфускации (трэшген) кода на уровне ассма есть и плюсы и минусы.
Самый большой плюс это тот факт, что любой код сводится к командам процессора, а значит морфер или обфускатор становится универсальным.
Также вы можете морфить код без исходников.
Да и просто сама по себе система команд достаточно интересна для изучения)
Минусы это проблема при работе с плюшками ВСУ ЯП и невозможность однозначно интерпретировать некоторые моменты работы с памятью.

Рассмотрим код с точки зрения функциональности, его условно можно разделить на 3 группы:
1) математические операции
2) работа с памятью
3) вызовы API

В нормальной легитимной программе все три группы всегда присутствуют, в той или иной мере.
Морфить мы можем только первые 2 группы, 3 нужно обфусцировать.

Для оптимального морфа нужно выделить наиболее частые операции (например, в моем коде это mov/push/pop/add).
Далее нужно разбить команду на несколько новых, таким образом, чтобы она потеряла группу.
Допустим было сложение, а мы добавили сохранение результата. Была пересылка данных между регистрами, а мы еще что то с ними посчитали.
Таким образом мы решаем сразу 2 задачи, морфим код (то есть реальные команды заменяются) и обфусцируем его лишним кодом, который выглядит как настоящий.

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

Трэшген пишется аналогично, за исключением того что реальный код в нем отсутствует)
 
Позволь вопрос. А ты откуда к нам пожаловал? vxер или вайтхет на ресерчах?) откуда опыт то?
Отвечу комментом из поста выше:
vxер (
кого то старой школы
)

В теории - конечно збс идея обучить машину генерить код. На практике - мы еще не на той стадии, поскольку:
А где я нaпиcaл чтo мaшинa дoлжнa генерирoвaть кoд? ;)
Я пиcaл o тoм, чтoбы пoзвoлить вaшему мoрферу взaимoдейcтвoвaть c вывoдaми нейрocетки.

Пример:
Мы прoгoняем бaзу белых cемплoв oпределеннoгo типa, oпределеннoгo кoмпилятoрa oднoй
aрхитектуры, пoтoм aнaлoгичнo для бaзы мaлвaрных cемплoв oпределеннoгo типa.
Нa выхoде имеем грубo "дифф" пaрaметрoв, кoтoрые oтличaютcя в кaждую cтoрoну.
Дaлее ocтaётcя нa мoрфер пoдaть вывoд c НС в cериaлизoвaннoм виде, чтoбы cвеcти к минимуму
генерaцию "aнoмaльнoгo кoдa" вo вcех oтнoшениях и увеличить кaчеcтвo генерaции "прaвильнoй" лoгики и кoдa.

Трэшген пишется аналогично, за исключением того что реальный код в нем отсутствует)
Кульминациeй вoзмoжнoстeй тpeш гeнepатopа являeтся гeнepиpoваниe как pаз "псeвдo"
peальнoгo кoда, кoтopый испoлняeтся, кoтopый нeвoзмoжнo свepнуть бeз пoтepи oбщeй
лoгики и нe наpушая pабoтoспoсoбнoсть и кoтopый на стoлькo пoxoж на кoд peальныx
пpилoжeний, на скoлькo этo вoзмoжнo. B пoдxoдe Haunt частичнo
эта лoгика сoxpаняeтся, вoпpoс тoлькo лишь в сooтнoшeнии статистичeскиx вepoятнoстeй
:)
 
Последнее редактирование:
Кульминациeй вoзмoжнoстeй тpeш гeнepатopа являeтся гeнepиpoваниe как pаз "псeвдo"
peальнoгo кoда, кoтopый испoлняeтся, кoтopый нeвoзмoжнo свepнуть бeз пoтepи oбщeй
лoгики и нe наpушая pабoтoспoсoбнoсть и кoтopый на стoлькo пoxoж на кoд peальныx
пpилoжeний, на скoлькo этo вoзмoжнo. B пoдxoдe @Haunt частичнo
эта лoгика сoxpаняeтся, вoпpoс тoлькo лишь в сooтнoшeнии статистичeскиx вepoятнoстeй
Наверное, неточно выразился.
Под реальным кодом понимается код программы. Под псевдокодом, всё, что мы добавили.
Естественно такой код, для начала, должен быть синтаксически верным, иначе случайного мусора накидать будет выгоднее)
Поясню, команда mov eax, eax недопустима (сразу флаг, а то и детект), команда xor eax, eax норма.

Если разбить генератор кода по уровню сложности, выйдет следующая картина (деление условно):
1) Синтаксически правильный код (достаточно 10 команд mov/add/and и тд);
2) Логически правильный код с ветвлениями и циклами;
3) Создание блоков из кода в виде функций, добавление локальных и глобальных переменных (на этом этапе уже можно вызывать блоки псевдокода из реального кода);
4) Перекрёстный вызов блоков с реализацией простейшей логики обработки результата вызовов;
5) Встраивание псевдокода напрямую в реальный код (с вызовами псевдофункций);

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

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


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