Просмотр полной версии : Низкоуровневое шифрование самописных вирей
Низкоуровневое шифрование самописных вирей.
Благодаря этому разделу (из за того, что будущие крякеры учатся своему мастерству) мы значительно(а может и не слишком значительно) осложняем(хотя если они читают форум то может и облегчаем) работу разработчиков программных продуктов, но я думаю, стоит немного подумать и о разработчиках антивирусного ПО ;) .
Теория:
Антивирусы, проверяя большие объемы файлов, ищут в файлах заранее подготовленные программистами последовательности байт. Значит для обхода этой процедуры, нужно сделать тело вируса уникальным, а всё остальное наиболее похожим на остальные программы, именно этим я и предлагаю заняться в этой теме.
Чтоб не начинать с пустого места, я приготовил несколько “программок”, скомпилированных с одного и того же исходника (без внесения в него каких либо изменений), с интервалом времени примерно в 10 сек. И выполняющего следственно одну и туже функцию, вывод “MessageBox”.
Файлы были автоматически сгенерированы, и зашифрованы ассемблером(с использованием макросом), причём тело программы было зашифровано методом xor(“исключающее или”), а потом тело расшифровывателя, было превращено в код, который при запуске восстановит его на своё же место и передаст ему управление, что без проблем просматривается в любом отладчике.
При всём этом, пароль к xor шифровальщику и последовательность команд востанавливателя кода, зависят от текущего времени компиляции.
В восстановителе кода участвуют несколько команд:
xor byte[pos], sume byte
,
add byte[pos], sume byte
или
sub byte[pos], sume byte
,
mov byte[pos], sume byte
,
xor byte[pos], not sume byte
not byte[pos]
,
add byte[pos], not sume byte
not byte[pos]
или
sub byte[pos], not sume byte
not byte[pos]
,
mov byte[pos], not sume byte
not byte[pos]
Результат обсуждения и коррекции, планируется разместить в закрытом разделе, а также отправить в пм всем активно принимавшим участие в нахождении недостатков этого программного кода, и методов их устранения.
Чего я жру:
Предложения способов автоматического выделения данной программы среди остальных программ, не требующих много ресурсов, и отладки программы, а также способов обхода этих способов. И ещё, недолжно использоваться прямых адресов, для возможности применения его в DLL модулях без таблицы исправления адресов.
ИМХО будущее за DLL вирусами.
Все файлы сжаты раром, сумма размеров 6 файлов 9,2 Кб, в архиве 4 Кб <скачать> (http://thsf.phpnet.us/Encode.rar)
P.S. Думаю тема будет долгая.
В результате мы разработаем основу для самых опастных не находимых автоматическисаморегенери руемых вирусов, которые в будущем захватят мир, ктулху и феникгс отдыхают. Хотя помоему я немножко приувеличил :-)
ну дык это ведь неново - банальный СамоМодифицирующийсяКод, при4ем практи4ески все авери давно палят декриптор, расшифровующий код вируса таким методом
ну дык это ведь неново - банальный СамоМодифицирующийсяКод, при4ем практи4ески все авери давно палят декриптор, расшифровующий код вируса таким методом
Ну так я для этого и создал тему, чтоб обсудить и сделать его не таким банальным, одна голова хороше, а форум голов очень хорошо :D .
Лично я не пойму как они его палят(ведь там только пара байт остаёться одинакова), может посветишь?
ну раз так - давай обсуждать =)
нас4ет как палят:
1. поскольку в слу4ае СМК код сохраняется в бинарнике пошифрованым (неважно каким алгоритмом), то сигнатурный анализатор (базы) аверя сразу не дадут никакого результата
2. стало быть, палит вирус эвристи4еский анализатор с заданым уровнем достоверности.
например: если есть пошифрованое тело, то эвристик заметит неладное если на старте проги идут не стандартные GetModuleHandle и т.д. апи, а сам декриптор, который в цикле долго и нудно 4то-то будет расшифровывать - это первое. второе: 4аще всего тот же декриптор выносят в другую секцию файла, либо осуществляю EPO-инфекцию (вызов вредоносного кода подменой, например, вызова какой-либо апи функции, подменив ее в импорте).
вообще вариантов ку4а и по4итать о подобных вещах монжо в любой книге по вирусописанию, форумам по vx\rat, васме (рукомендую), архивах зомбы (суперрекомендую;)
стало быть, палит вирус эвристи4еский анализатор с заданым уровнем достоверности.
например: если есть пошифрованое тело, то эвристик заметит неладное если на старте проги идут не стандартные GetModuleHandle и т.д. апи
Ну, если зайти в папку system32 и посмотреть, в начале модулей DLL ;), очень редко встречается вызов API
А вообще его можно обнаружить, таким регулярным выражением
/\xE8.\0{3}.{16,32}\x5D(\x80[\x75\x4D\x45\x65\x4D\x6D]..|\xC6\x45..|\xF6\x55.){8,}/
, поэтому я и ищу что-нибудь, чем можно лучше защитить этот код.
сам декриптор, который в цикле долго и нудно 4то-то будет расшифровывать
Шифрование используют не только в вирусах, но и при защите прог, требующих регистрацию, от крякеров :D .
4аще всего тот же декриптор выносят в другую секцию файла, либо осуществляю EPO-инфекцию (вызов вредоносного кода подменой, например, вызова какой-либо апи функции, подменив ее в импорте).
Вот это кокраз и легче всего обнаружить, нарушение таблицы импорта.
архивах зомбы (суперрекомендую ;)
А где эти архивы найти можно?
>>Ну, если зайти в папку system32 и посмотреть, в >>начале модулей DLL ;), очень редко встречается >>вызов API
дык на дллмейн смотрят, либо трейсером на у4астки выполняемые в самой либе
>>А вообще его можно обнаружить, таким >>регулярным выражением
какие РВ? 4ет первый раз слышу. и за4ем они, если всеравно будет код их обрабатывающий?
какие РВ? 4ет первый раз слышу.
Перл, хотя похожее можно легко перенести и на с++
sub findvir(){
local($fn)=@_;
open(IN,$fn)||next;binmode(IN);read(IN,$buf,-s$fn);close(IN);
return ($buf=~/\xE8.\0{3}.{16,32}\x5D(\x80[\x75\x4D\x45\x65\x4D\x6D]..|\xC6\x45..|\xF6\x55.){8,}/);
}
while(<*.exe>){ print "Found in $_\n\n" if(&findvir($_)); }
while(<C:\\windows\\system32\\*.*>){ print "Found in $_\n" if(&findvir($_)); }
за4ем они, если всеравно будет код их обрабатывающий?
Ну например: Если в шифровщик будет включено половина ассемблерских комманд, то этот код, будет не отличить от осталькых программ.
Но это конечно слишком, поетому стоит подумать, что именно надо, и какким способом это реализовать, придумать своё!
Кстати, ссылочку не подкинешь?
архивах зомбы (суперрекомендую ;)
>>поэтому я и ищу что-нибудь, чем можно лучше защитить этот код.
имено защитить? и какой именно код?
>>Шифрование используют не только в вирусах, но и при защите прог, требующих регистрацию, от крякеров .
эт понятно, на то она и криптограйия 4тобы защищать все на основе теории сложности
>>А где эти архивы найти можно?
где-то на форуме кряклаба линк на этой недели на некоторые статьи пробегал, а вообще по4итай A29, фряк
Перл, хотя похожее можно легко перенести и на с++
sub findvir(){
local($fn)=@_;
open(IN,$fn)||next;binmode(IN);read(IN,$buf,-s$fn);close(IN);
return ($buf=~/\xE8.\0{3}.{16,32}\x5D(\x80[\x75\x4D\x45\x65\x4D\x6D]..|\xC6\x45..|\xF6\x55.){8,}/);
}
while(<*.exe>){ print "Found in $_\n\n" if(&findvir($_)); }
while(<C:\\windows\\system32\\*.*>){ print "Found in $_\n" if(&findvir($_)); }
Ну например: Если в шифровщик будет включено половина ассемблерских комманд, то этот код, будет не отличить от осталькых программ.
Но это конечно слишком, поетому стоит подумать, что именно нтатадо, и какким способом это реализовать, придумать своё!
Кстати, ссылочку не подкинешь?
а за4ем это все, если трейсер в складе аверя будет палить ЛЮБОЙ код динами4ески в время выполнения?
DisturbeR
19.08.2006, 01:07
за4ем это все, если трейсер в складе аверя будет палить ЛЮБОЙ код динами4ески в время выполнения?
Это как раз и есть основной недостаток всех крипторов, как не защищай, не прячь, код будет выполнятся и анализироваться, думать надо не о том как спрятать, а как скрыть вредоносное действие.
Как то нужно было срочно криптануть файл, ничего подходящего под рукой не было, в итоге поступил так: запаковал файл каким-то стандартным упаковщиком с защитой паролем + написал простой скриптик который водил пароль в форму и жал ОК. Заняло это 3 минуты, а защита практически неуязвимая. Естественно, только в том случае, если антивирус не запущен на постоянную проверку.
2Disturber, ты прав, но вот описаный тобой метод работает только для статика, а мониторы сей4ас практи4ески у всех.
и кстать, а смысл был писать скрипт, если в том же винрара можно сделать самораспаковывающийся с паролем sfx безо всяких палевных эмуляций нажатий
за4ем это все, если трейсер в складе аверя будет палить ЛЮБОЙ код динами4ески в время выполнения?
Авирь не может динамически палить все загруженные модули, темболее если расшифрованый код будет выполнятся в течении долий секунды(создаст свой тред в памяти доверенного процесса, и сообщит о отсутствии надобности этой библиотеки), просто нужно обеспечить невыделяемость самого файла, из общего числа файлов. Я понимаю что в идеале это невозможно, но если добится чтоб время проверки каждого файла, занимало больше 500мс, то его не будут включать в базу антивируса, по явным причинам.
Скрытие действий и криптовка готовых вирей это уже совсем другая тема. Кстате кто криптует вири в sfx? Вопервых антивири проверяют внутри архивов, а во вторых, после того как sfx распакует его в temp антивирь сразу захочит его проверить.
Кстате кто криптует вири в sfx? Вопервых антивири проверяют внутри архивов
Протеус имел ввиду статическую проверку, внутрь архива с паролем АВ не залезет.
Авирь не может динамически палить все загруженные модули, темболее если расшифрованый код будет выполнятся в течении долий секунды(создаст свой тред в памяти доверенного процесса,
Авири перехватывают ZwCreateThread.
Если хочешь скрыть программу от мониторов, то юзай метаморфизм + ВМ и ниодин эмуль никогда не сможет проэмулировать твой код.
Авири перехватывают ZwCreateThread.
Только какие нибудь продвинутые авири перехватывают создание тредов, но смысла я в этом не вижу, некоторые программы создают треды десятками, может только если они будут проверять какой тред пытается создать новый тред, но ведь это легко обойти, напримерперехватя какую небудь системную функциию и создать тред от имени треда, её вызвавшего, и вообще, неизвестно кто первее перехватит функцию ZwCreateThread. ;)
Только какие нибудь продвинутые авири перехватывают создание тредов, но смысла я в этом не вижу, некоторые программы создают треды десятками, может только если они будут проверять какой тред пытается создать новый тред
Интересно ты разделил АВ на продвинутые и нет... Когда у АВ работает монитор, то он впервую очередь должен перехватывать ZwCreateThread, ибо как бы ни был создан процесс загрузчик обязательно вызывает ZwCreateThread(минимум для создания основной нити(потока) процесса).
но ведь это легко обойти, напримерперехватя какую небудь системную функциию и создать тред от имени треда, её вызвавшего
Не совсем понял. Что это даёт?
и вообще, неизвестно кто первее перехватит функцию ZwCreateThread.
АВ само собой всё перехватывают на уровне ядра, поэтому если решил пойти этому пути, то в 3 кольце считай ты бессилен.
Антивири не особо обращают внимание на самомодификацию. Это привелегия эвристики. Она пасёт помимо самомодификации к каким апи обращается код. А ав по большей части ждут, когда вирь засветит свои сигнатуры. Потоки пох, если ав не найдёт сигнатур. Максимум будет сообщение эвристики, что вроде как вирус нашёлся. Не забываем про такую вещь, как метаморфизм. Кто сумеет сбацать надёжный качественный метаморф-движок репу можно прокачать значительно :)
>>и хочешь скрыть программу от мониторов, то юзай >>метаморфизм + ВМ и ниодин эмуль
>>никогда не сможет проэмулировать твой код.
у наших "продвинутых" росийских аверях на это один только метод - вбивать соответствующую ВМ в блэк и все функции, выполняемый на ней туда же =(
>>Кто сумеет сбацать надёжный качественный метаморф-движок репу можно >>прокачать значительн
о4 сомневаюсь, эт привилегия едениц - у мну, например, дальше метаморфа декриптора дело не дошло =(
у наших "продвинутых" росийских аверях на это один только метод - вбивать соответствующую ВМ в блэк и все функции, выполняемый на ней туда же =(
Так что они туда пихать будут если она заморфлена будет?
о4 сомневаюсь, эт привилегия едениц - у мну, например, дальше метаморфа декриптора дело не дошло =(
А чем отличается код декриптора от любого другого кода программы? Ты наверное про полиморф говоришь. А застрял скорее всего на пересчёте переходов и call'ов?)
>>Так что они туда пихать будут если она заморфлена будет?
сигатуру ВМ, как было с VmProtect и каспером (на 4то я намикал)
>>А чем отличается код декриптора от любого другого кода программы?
нет, метаморф. а на примере декриптора я говорил о коде, слабо "общающимя" с другими 4астями софта, вообщем 4асти4ный слу4ай, так сказать...
сигатуру ВМ, как было с VmProtect и каспером (на 4то я намикал)
Так у VMProtect'ора ВМ не заморфлена вроде.
а на примере декриптора я говорил о коде, слабо "общающимя" с другими 4астями софта, вообщем 4асти4ный слу4ай, так сказать...
Метаморфу пофиг какой код, метфморф отличается от полиморфа как раз тем, что обрабатывает всё тело программы(в твоём случае считай декриптора).
Полиморфные и метаморфные, это значит они самомодифицируются, изменяя себя до неузнаваимости, но я считаю это не кчиму, в моём примере он меняется примерно также но только на стадии компиляции, причём даже размер кода меняется.
>>Так у VMProtect'ора ВМ не заморфлена вроде.
а я разве такое говорил?
Метаморфу пофиг какой код, метфморф отличается от полиморфа как раз тем, что обрабатывает всё тело программы(в твоём случае считай декриптора).
по-моему, полиморф - просто замена функций "синонимами", метаморф - все 4то им не есть, тоесть обратный проход покоду и создание его мутации (дизасм, минимизация кода, пермутация, расширение, сборка), и неважно делается ли это для куска кода, или для всей кодовой секции...
а я разве такое говорил?
>>Так что они туда пихать будут если она заморфлена будет?
сигатуру ВМ, как было с VmProtect и каспером (на 4то я намикал)
по-моему, полиморф - просто замена функций "синонимами", метаморф - все 4то им не есть, тоесть обратный проход покоду и создание его мутации (дизасм, минимизация кода, пермутация, расширение, сборка), и неважно делается ли это для куска кода, или для всей кодовой секции...
Хорошо, начнем с основ. Для тех, кто еще не знает что такое метаморфизм, скажу, что суть этой техники заключается в ПОЛНОМ изменении тела вируса без изменения его функциональности. Проще говоря, это то же самое, что и полиморфизм декриптора, но примененный ко всему телу вируса. (C) Billy Belcebu
Поверим бывшему мемберу 29a? :)
>>сигатуру ВМ, как было с VmProtect и каспером (на 4то я намикал)
"заморфлен" (с то4ки зрения анализатора; незнаю по4ему ты так любишь это слово) будет ПИ-КОД()!!!, выпоняемый на декектируемой ВМ
>>Поверим бывшему мемберу 29a?
=) ну раз уж так, то в свою о4ередь процитирую ms-rem (Спец Хакер, №57, стр 58)
Полиморф обы4но просто ДОБАВЛЯЕТ в код мусорные инструкции, 4тобы затруднить дизассмеблировние и анализ кода, а метаморф старается целиком ИЗМЕНИТЬ ВИД кода, сохряняя при этом оригинальный алгоритм его работы, для 4его он заменяет интрукции синонимами, состоящими в свою о4ередь из нескольких других инструкций.
тоесть, вывод в обеих цитатах делается с упором на ПОЛНОЕ изменение кода, а не на ТЕЛО ВСЕГО ВИРУСА, т.к. цель всех манипуляций полиморфов\метаморфов - обмануть анализатор ТОЛЬКО в тех кусках кода, которые в этом нуждаются, а морфировать весь код не представляется нужным, т.к. это, за4астую, дополнительно такты процессора...
в моём примере он меняется примерно также но только на стадии компиляции, причём даже размер кода меняется.
вот примерная структура метаморфного движка:
Disassembler -> Shrinker -> Permutator -> Expander ->
Assembler
имхо неважно где код находится(сохраняется), а важно просто 4тобы входной файл(дамп и т.д.) пропускался 4ерез такую последовательность
"заморфлен" (с то4ки зрения анализатора; незнаю по4ему ты так любишь это слово) будет ПИ-КОД()!!!, выпоняемый на декектируемой ВМ
Ну это понятно, но я имел ввиду, что сами вызовы ВМ(например у VMProtect'a они выглядят вроде так: push reg/mem puah reg/mem call xxx) тоже можно метморфизировать и за что тогда цепляться АВ?
Ну это понятно, но я имел ввиду, что сами вызовы ВМ(например у VMProtect'a они выглядят вроде так: push reg/mem puah reg/mem call xxx) тоже можно метморфизировать и за что тогда цепляться АВ?
не пробовал (по крайней мере если виртуализировать темидой, то она будет о4ень не довольна =), 4то понятно), но даже если это и работает, то я намекал на другое - про политику аверей, кидать в блэк саму VM даже не имея других вариантов - имхо неуважительно не только относительно девелоперов, но и коне4ных пользователей
Да только, что друг попросил глянуть файл т.к. он начал палиться каспером как Trojan.Win32.Pakes, оказывается он был просто запакован приватным пакером, который наверное или вышел на паблик или попал в руки какому-нибудь любителю пинчей)
Дизассемблирование и ассемблирование - имхо слишком геморный просесс, лучьше зашифровать код, разбить расшифровщик на байты(может есщё на слова и двойные слова), а потом сгенерировать случайную последовательность из набора инструкций или набора груп инструкций, способных модифицировать первую часть себя в расшифровщик кода вируса и передать на него управление, а ко всему прочему можно их(инструкции) ещё и поменять местами. А чем больше закладываешь в него инструкций, тем длинее получается код способный его найти, а значит и быстродействие АВ падает.
А вот телько-что придумал, если между каждыми 3-5 инструкциями вставить вызовы функций, только-что расшифрованных предидущими, думаю тогда и регулярные выражения не помогут, потому-что будут палиться большая часть запускаемых файлов. Или добавить безполезные инструкции например:
mov [pos], val
mov eax, val
mov [pos], eax
mov [pos], not val
not val
lea eax, [val+25]
mov [pos], eax
sub [pos], 25
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot