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

Обсуждение виртуализации в MALWARE

DoppleKSE

(L2) cache
Пользователь
Регистрация
16.01.2023
Сообщения
474
Реакции
253
Создать виртуальную машину в соло невозможно - этим команды годами занимаются.
Хз кем надо быть чтоб создать такое.
Вирта не так сложна как кажется. Любая вирта сводится к генерации байткода и построения хендлеров обрабатывающих этот байткод. Опустим детали реализации, они везде разные, но основной пайплайн работы вм такой, считали порцию байткода, декодировали инструкцию, по опкоду вызвали хендлер с параметрами из инструкции. Изменили контекст в соответсвии с действиями хендлера.
Типов вм много, но основных два. Первый, это полная замена оригинального кода, на виртуальный (оригинал напрочь вырезается из бинаря), и второй это замена в оригинальном коде всевозможных операций на call к хендлеру, в параметрах передается тип операции и аргументы (например add, sub, mul и тд), аргументы иногда шифруются, и одним из доп аргументов передается ключ, для разбора агрументов, это добавляет не так много хлопот реверсерам, но все же лучше чем передавать чистые аргументы. К тому же иногда порядок аргументов тоже кодируется, что бы минимизировать возможность автоматического снятия такой защиты.
Первый тип вм обычно используется в бинарном виде, как VMP и иже с ним, ставятся метки в коде, функции дизасмятся, разбор идет на уровне ассемблерных команд. Штука сложная, согласен.
Второй тип не нуждается в бинарщине, его можно реализовать на уровне сорцев или IR, что-то подобное делалDildoFagins в своей статье, условно идет разбор AST и базовых арифметических операций, каждая операция заменяется на вызов функции-хендлера, в которую передаются аргументы и тип операции. При граммотной реализации этот вариант ни чуть не уступает в степени сложности реверса первому. А вот в реализация в разы проще. Под сложностью реверса я имею ввиду морфинг самого кода хендлера, его сильное запутывание. А так же возможно построение не единого хендлера, а разных, и по коду вызывать случайные. + для каждого хендлера своя уникальная системы кодирования и разбора агрументов. В одном хендлере ты можешь передавать тип операции первым аргументом, во втором хендлере третьим аргументом, добавлять фейковые аргументы и тд, суть понятна. Это напрочь убивает возможность раскрутки автоматикой. По итогу в одной функции могут происходить вызовы к десяткам разных хендлеров, каждый из которых по смыслу и логике работы идентичен остальным, но вот реализация разная, и генерируется эта реализация каждый раз новая, уникальная.
Это сложно, когда на это смотришь издалека, когда начинаешь копаться в этом говне с точки зрения разработки, очень многое проясняется, и уже не кажется недосягаемым мастерством. Тут не нужен опыт 20 лет в программировании. Даже джун напишет простую вм (второго типа), если основательно сядет за это дело, изучит матчасть. И если потом не забросит, то вполне сможет довести код до хорошего уровня защиты.
Всех пугает слово вм, потому что это реально трудно реверсить, но поверь мне, писать вм гораздо проще, чем потом ее исследовать. Это ошибочное мнение устоялось потому, что очень много людей (реверсеров) встречают на своем пути разные вм, и они доставляют им много проблем, и в то же время мы имеем очень мало людей, которые их разрабатывают, а они не сильно много болтают о том как у них там все устроено. Поэтому все думают, что вм это сумер-мега-гипер недосягаемая технология, невероятно сложная в реализации. Это не так.
 
Последнее редактирование:
Вирта не так сложна как кажется. Любая вирта сводится к генерации байткода и построения хендлеров обрабатывающих этот байткод. Опустим детали реализации, они везде разные, но основной пайплайн работы вм такой, считали порцию байткода, декодировали инструкцию, по опкоду вызвали хендлер с параметрами из инструкции. Изменили контекст в соответсвии с действиями хендлера.
Типов вм много, но основных два. Первый, это полная замена оригинального кода, на виртуальный (оригинал напрочь вырезается из бинаря), и второй это замена в оригинальном коде всевозможных операций на call к хендлеру, в параметрах передается тип операции и аргументы (например add, sub, mul и тд), аргументы иногда шифруются, и одним из доп аргументов передается ключ, для разбора агрументов, это добавляет не так много хлопот реверсерам, но все же лучше чем передавать чистые аргументы. К тому же иногда порядок аргументов тоже кодируется, что бы минимизировать возможность автоматического снятия такой защиты.
Первый тип вм обычно используется в бинарном виде, как VMP и иже с ним, ставятся метки в коде, функции дизасмятся, разбор идет на уровне ассемблерных команд. Штука сложная, согласен.
Второй тип не нуждается в бинарщине, его можно реализовать на уровне сорцев или IR, что-то подобное делалDildoFagins в своей статье, условно идет разбор AST и базовых арифметических операций, каждая операция заменяется на вызов функции-хендлера, в которую передаются аргументы и тип операции. При граммотной реализации этот вариант ни чуть не уступает в степени сложности реверса первому. А вот в реализация в разы проще. Под сложностью реверса я имею ввиду морфинг самого кода хендлера, его сильное запутывание. А так же возможно построение не единого хендлера, а разных, и по коду вызывать случайные. + для каждого хендлера своя уникальная системы кодирования и разбора агрументов. В одном хендлере ты можешь передавать тип операции первым аргументом, во втором хендлере третьим аргументом, добавлять фейковые аргументы и тд, суть понятна. Это напрочь убивает возможность раскрутки автоматикой. По итогу в одной функции могут происходить вызовы к десяткам разных хендлеров, каждый из которых по смыслу и логике работы идентичен остальным, но вот реализация разная, и генерируется эта реализация каждый раз новая, уникальная.
Это сложно, когда на это смотришь издалека, когда начинаешь копаться в этом говне с точки зрения разработки, очень многое проясняется, и уже не кажется недосягаемым мастерством. Тут не нужен опыт 20 лет в программировании. Даже джун напишет простую вм (второго типа), если основательно сядет за это дело, изучит матчасть. И если потом не забросит, то вполне сможет довести код до хорошего уровня защиты.
Всех пугает слово вм, потому что это реально трудно реверсить, но поверь мне, писать вм гораздо проще, чем потом ее исследовать. Это ошибочное мнение устоялось потому, что очень много людей (реверсеров) встречают на своем пути разные вм, и они доставляют им много проблем, и в то же время мы имеем очень мало людей, которые их разрабатывают, а они не сильно много болтают о том как у них там все устроено. Поэтому все думают, что вм это сумер-мега-гипер недосягаемая технология, невероятно сложная в реализации. Это не так.
Но есть нюанс =) Вот когда вам прилетают креш дампы с боевых сборок то разбор полетов становится задачей не для слабаков.
 
Но есть нюанс =) Вот когда вам прилетают креш дампы с боевых сборок то разбор полетов становится задачей не для слабаков.
Если мы про сдачу в аренду виртуализатора, когда компилируется чужой код, ни исходников, ни открытого не виртуализованного кода которого мы не имеем, то задачка не простая.
Но если он используется для собственных нужд, мы можем откомпилировать софт с дебаг инфой (в том числе с дебаг инфой для самой в-машины, если это второй тип по моему сообщению выше), и смотреть где и что падает. Это гораздо проще.
 
Если мы про сдачу в аренду виртуализатора, когда компилируется чужой код, ни исходников, ни открытого не виртуализованного кода которого мы не имеем, то задачка не простая.
Но если он используется для собственных нужд, мы можем откомпилировать софт с дебаг инфой (в том числе с дебаг инфой для самой в-машины, если это второй тип по моему сообщению выше), и смотреть где и что падает. Это гораздо проще.
Даже со своих боевых сборок так себе удовольстивие. Именно с боевых а не отладочных.
 
Даже со своих боевых сборок так себе удовольстивие. Именно с боевых а не отладочных.
Нет разницы между отладочной сборкой и боевой, если у тебя вмка работает херово, она будет работать херово и в отладке и в боевом варианте. И пока она работает херово вообще нет смысла делать боевые билды. Сидишь и совершенствуешь отладочные, пока 100 из 100 билдов будут работать исправно.
Какой смысл билдить говно и пускать в прод если оно работает через раз ? Ты сначала делаешь нормально, что бы все работало как часы, а потом уже запускаешь в прод.
Если у тебя алгоритм отточен под отладкой до совершенства, он и в продакшене нормально себя будет вести. А какие-то неочевидные баги, которые может всплывут не сразу, а через месяц другой, так это проблема любого софта, такое иногда случается, от этого никто не застрахован.
 
Нет разницы между отладочной сборкой и боевой, если у тебя вмка работает херово, она будет работать херово и в отладке и в боевом варианте. И пока она работает херово вообще нет смысла делать боевые билды. Сидишь и совершенствуешь отладочные, пока 100 из 100 билдов будут работать исправно.
Какой смысл билдить говно и пускать в прод если оно работает через раз ? Ты сначала делаешь нормально, что бы все работало как часы, а потом уже запускаешь в прод.
А кто сказал что проблема в вмке =) А что если с вмкой все ок а в коде котрый исполняет вмка встречаются ошибки, ошибки они такие берут и встречаются, то тут то там.
 
А кто сказал что проблема в вмке =) А что если с вмкой все ок а в коде котрый исполняет вмка встречаются ошибки, ошибки они такие берут и встречаются, то тут то там.
Так у тебя код в таком случае и без вм будет работать глючно.
Я для себя вижу разработку в таких этапах.
Ты пишешь софт, без всякой защиты, морфинга и вм. Просто софт. Нормально его отлаживаешь, убираешь баги по возможности. Когда софт уже готов, и в целом может уходить в прод, вот только тогда можно накрывать его защитой. Какой смысл накрывать защитой глючный хромающий код, там вообще непонятно будет где проблема, в самом софте, в вм, или в других механизмах защиты.
Если у тебя есть какая-то ошибка в коде, а не в вм, и с накрытой вм происходит падение, ты берешь софт не накрытый вм, помещаешь в те же самые условия где произошло падение с вм, и ловишь это же самое падение на чистом коде, и исправляешь его. Это же логично как то, что черное это черное, а белое это белое. Не вижу тут вообще никаких сложностей.

Тегну модеров, что бы перенесли наш диалог в другую ветку, а то мы насрали тут в торговой теме

Haunt

Pernat1y

Quake3

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

Тегну модеров, что бы перенесли наш диалог в другую ветку, а то мы насрали тут в торговой теме

Haunt

Pernat1y

Quake3

Ты прикалываешся? или с планеты розовых поней? Если тесты здесь и сейчас не показали ошибок то это значит что - тесты здесь и сейчас ошибок не показали. А там и потом вдруг возникают ситуации и окружения которые вдруг вскрывают ошибки, обычно это не понятно новичкам которые тестятся аж на 5ти своих виртуалках и в живую природу если и лили то какой то смешной мизер и как правило крэш дампы такие даже не собирают.
 
Ты прикалываешся? или с планеты розовых поней? Если тесты здесь и сейчас не показали ошибок то это значит что - тесты здесь и сейчас ошибок не показали. А там и потом вдруг возникают ситуации и окружения которые вдруг вскрывают ошибки, обычно это не понятно новичкам которые тестятся аж на 5ти своих виртуалках и в живую природу если и лили то какой то смешной мизер и как правило крэш дампы такие даже не собирают.
Так это присуще ЛЮБОМУ СОФТУ, ты мне сейчас рассказываешь то, что даже джуну известно. Вообще не понимаю, что ты сейчас пытаешься донести. Если бы я о чем-то спорил с тобой, так нет, я тебе говорю, что все что ты говоришь верно, это стандартный пайплайн, это проблемы любого софта, с этим сталкивается любой разработчик. Не важно малварь это, или белый софт, под вм это все или под морфингом, это общие проблемы для всего этого. Возьми любой известный софт, тот же фотошоп, эти проблемы и там есть.
Все что ты сейчас написал, это констатация того факта, что есть некоторые баги, которые вскрываются не сразу. Ну так я это знаю, что мне теперь плясать и радоваться ? Это обычный рабочий пайплайн, обычные будни программиста. Как я вижу наш текущий диалог - ты сейчас пытаешься доказать, что 1==1. Так это и так все знают. Может я тебя не так понял, поправь тогда.

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

Если же это малварь, то даже до морфинга и виртуализации твой софт обязан изначально стоиться так, что бы обходить EDR. Морфинг и вм это просто как доп защита, от банальной статики и ручного реверса, когда семплы окажутся в лабах. Малварь надо изначально писать так, что бы она хорошо работала рядом с EDR. Если малварь приходится переписывать "для использования морфера", то это херовая малварь, да и в целом это работать не будет, если софт по поведению палится, в статике может быть морфер и спасет, но после запуска софтина не проживет и пары секунд.
 
Так это присуще ЛЮБОМУ СОФТУ, ты мне сейчас рассказываешь то, что даже джуну известно. Вообще не понимаю, что ты сейчас пытаешься донести. Если бы я о чем-то спорил с тобой, так нет, я тебе говорю, что все что ты говоришь верно, это стандартный пайплайн, это проблемы любого софта, с этим сталкивается любой разработчик. Не важно малварь это, или белый софт, под вм это все или под морфингом, это общие проблемы для всего этого. Возьми любой известный софт, тот же фотошоп, эти проблемы и там есть.
Все что ты сейчас написал, это констатация того факта, что есть некоторые баги, которые вскрываются не сразу. Ну так я это знаю, что мне теперь плясать и радоваться ? Это обычный рабочий пайплайн, обычные будни программиста. Как я вижу наш текущий диалог - ты сейчас пытаешься доказать, что 1==1. Так это и так все знают. Может я тебя не так понял, поправь тогда.


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

Если же это малварь, то даже до морфинга и виртуализации твой софт обязан изначально стоиться так, что бы обходить EDR. Морфинг и вм это просто как доп защита, от банальной статики и ручного реверса, когда семплы окажутся в лабах. Малварь надо изначально писать так, что бы она хорошо работала рядом с EDR. Если малварь приходится переписывать "для использования морфера", то это херовая малварь, да и в целом это работать не будет, если софт по поведению палится, в статике может быть морфер и спасет, но после запуска софтина не проживет и пары секунд.
Ну так ты отмотай к посту #36 /threads/73254/post-606573, может как то прояснится а че этот странный чувак тут пытается донести..., а он ене пытается донести, он отпихивается что бы ему не нагружали.
 
Ну так ты отмотай к посту #36 /threads/73254/post-606573, может как то прояснится а че этот странный чувак тут пытается донести..., а он ене пытается донести, он отпихивается что бы ему не нагружали.
Тебе как разрабу, который пишет вм, известно где, что и как работает. Имея на руках краш дамп и семпл, тебе гораздо проще в этом разобраться, чем случайному реверсеру.

Давай так, что бы упростить жизнь тебе и мне. Ты писал хоть какую-то виртуальную машину, которая потом ушла в прод, и составила тебе сложности в отлове багов софта ?
Забегая вперед скажу за себя, я писал, на базе IR кода GCC, виртуализация во время компиляции. Не встречал пока тех сложностей, о которых ты говоришь. И да, проливы у меня жирные на софт, на пиках достигают 70к инсталлов в час. Все работает исправно. Да, баги иногда вылазят, но для их отлова достаточно построить хорошую систему мониторинга. Где ты при падении будешь получать отчет в котором будет масса полезной инфы вплоть до строки в исходнике и названии файла исходника, где произошло падение. А что бы никакой хитрожопый реверсер не получил полезной информации, все эти данные (например имена .cpp файлов и номера строк) шифруются прямо во время компиляции rsa-4096, и отправляются в таком же зашифрованном виде в случае краха. И только ты получив этот дамп можешь понять что произошло. Причем в подробных деталях. И тебе совсем не важно накрыто оно виртой или морфером, ты получаешь инфу, где именно в исходном коде была спровоцирована ошибка. Это уже не иглу в стоге сена искать, а в конкретном файле, в конкретных строках.
 
Последнее редактирование:
Тебе как разрабу, который пишет вм, известно где, что и как работает. Имея на руках краш дамп и семпл, тебе гораздо проще в этом разобраться, чем случайному реверсеру.

Давай так, что бы упростить жизнь тебе и мне. Ты писал хоть какую-то виртуальную машину, которая потом ушла в прод, и составила тебе сложности в отлове багов софта ?
Забегая вперед скажу за себя, я писал, на базе IR кода GCC, виртуализация во время компиляции. Не встречал пока тех сложностей, о которых ты говоришь. И да, проливы у меня жирные на софт, на пиках достигают 70к инсталлов в час. Все работает исправно. Да, баги иногда вылазят, но для их отлова достаточно построить хорошую систему мониторинга. Где ты при падении будешь получать отчет в котором будет масса полезной инфы вплоть до строки в исходнике и названии файла исходника, где произошло падение. А что бы никакой хитрожопый реверсер не получил полезной информации, все эти данные (например имена .cpp файлов и номера строк) шифруются прямо во время компиляции rsa-4096, и отправляются в таком же зашифрованном виде в случае краха. И только ты получив этот дамп можешь понять что произошло. Причем в подробных деталях. И тебе совсем не важно накрыто оно виртой или морфером, ты получаешь инфу, где именно в исходном коде была спровоцирована ошибка.
Я и писал, и разгребался с багами...но пост #36 был вдохновлен постом #35 где даже джун может....
Вы может и самая крутая жопка на ресурсе но малость тяжеловата, вследствии чего при разгоне вас слегка заносит на поворотах.
 
Я и писал, и разгребался с багами...но пост #36 был вдохновлен постом #35 где даже джун может....
Вы может и самая крутая жопка на ресурсе но малость тяжеловата, вследствии чего при разгоне вас слегка заносит на поворотах.
Джун пишет софт уровня джуна, поэтому ему неведомы те вещи, о которых мы говорили выше. Он придет к этому позже, когда станет мидлом или сеньором. Джун на то и джун, что пока не дорос даже до мидла. Поэтому с него и спрос как с джуна.
В целом написать какую-никакую вм, джун сможет. Возможно пока он будет отлаживать это все дело, доводя до совершенства, пройдет время и он на тот момент уже станет мидлом (только не надо думать, что к мидлу его приведет вм, я сказал обобщенно, про некий промежуток времени). Тогда с него можно и спросить за краш дампы, и как он будет ловить сложные баги.
 
Джун пишет софт уровня джуна, поэтому ему неведомы те вещи, о которых мы говорили выше. Он придет к этому позже, когда станет мидлом или сеньором. Джун на то и джун, что пока не дорос даже до мидла. Поэтому с него и спрос как с джуна.
В целом написать какую-никакую вм, джун сможет. Возможно пока он будет отлаживать это все дело, доводя до совершенства, пройдет время и он на тот момент уже станет мидлом (только не надо думать, что к мидлу его приведет вм, я сказал обобщенно, про некий промежуток времени). Тогда с него можно и спросить за краш дампы, и как он будет ловить сложные баги.
А вот чего вам не понятно это то что когда вам пишет не джун что это сложно и высший пилотаж и все в такое, так он имеет ввиду фул стек, все издержки, и сложно это в его пониманимании в рамках соизмерения всех возможных затрат и профита. Не все могут себе позволить искать профит "так далеко", а вы конечно молодчинка и могли бы написать серию статей, раскрыть пайплайн разработки, отладочных сообщений и отладки, методик тестирования, но вы просто пытаетесь блеснуть скиловостью через ненавязчивое унижение коллег. А это не хорошо. А в том что ты скиловая сомнений нет, помогай апнутся и остальным раз созрела делиться мудростью, а это не легко, что бы мудрость дошла ее надо качественно упаковать. Другими словами - жопка прекращай выделываться!
 
вы просто пытаетесь блеснуть скиловостью через ненавязчивое унижение коллег
Ни кого не унижал, и в мыслях даже не было. Началось все с того, что я ответил человечку, что вм кажется сложной, когда ты не разрабатываешь ее. Нужно всего лишь взяться за дело, и все пойдет своим чередом, быть может не быстро, но пойдет.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вообще не понимаю, что ты сейчас пытаешься донести
Духоту, он пытается донести духоту, и это обычная ситуация. Мне тяжело было все прочитать, но в ваш разговор серьезных и опытных мужчин хочу внести два тезиса: (1) компилить в байткод вм из аст какого-то языка будет проще, чем из х86 или того хуже из х64, если это не такой ебанутый язык, как С++ (в его случае я бы уже брал условный ллвм ир или гимпл из гцц/мингв, или вообще бы не брался за него); (2) куда проще взять язык, который был заранее задизайнен работать под вм (гуглишь эмбеддабл скриптинг ленгуадж и охереваешь от их количества), и изкорячить его до полиморфного байткода и обфусцированного кода вм.
 
Духоту, он пытается донести духоту, и это обычная ситуация. Мне тяжело было все прочитать, но в ваш разговор серьезных и опытных мужчин хочу внести два тезиса: (1) компилить в байткод вм из аст какого-то языка будет проще, чем из х86 или того хуже из х64, если это не такой ебанутый язык, как С++ (в его случае я бы уже брал условный ллвм ир или гимпл из гцц/мингв, или вообще бы не брался за него); (2) куда проще взять язык, который был заранее задизайнен работать под вм (гуглишь эмбеддабл скриптинг ленгуадж и охереваешь от их количества), и изкорячить его до полиморфного байткода и обфусцированного кода вм.
Как всегда поверхностно мыслишь и фигвамы рисуешь, нет в тебе полета творческой мысли.
 


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