Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
eXeL@B —› Программирование —› криптование вируса |
Посл.ответ | Сообщение |
|
Создано: 07 февраля 2006 12:51 · Личное сообщение · #1 я поднимал эту тему на васме но ответов не увидел потом васм упал а тема для меня счас важна. поэтому я подниму ее здесь. хотелось бы услышать мнений на сколько это перспективно, так же буду рад вашим советам и идеям. ----- моя идея шифровки тела вируса. ситуация такова запускается файл скажем some.exe. мы ищем в его секции кода по маске типичные куски кода к примеру возмем стандартные прологи. находим штук 15 (количество на свой вкус) и ставим там бряки (например переходы на свою внедренную в процесс длл). из сработавших выбираем любой. там мы всунем джамп а тело нашего вируса. а теперь вот в чем вся соль на входе в вирь мы будемвести статистику по регистрам и содержимому стека (глубиной дворда на 4). будем вести эту статистику скажем скажем на протяжении 10-20 запусков. потом посмотрим какие регистры были неизменны на каждом запуске программы и какие данные в стеке оставались неизменны. на основе этих данных мы построим расшифровщик тела вируса. вот приблизительно какой код получится ... original code .... .... .... mov ebx, some offset push ebx push 3453453 ; some param call some_proc ... ... mov ebx, some other offset push ebx push fffd53 ; some other param call some_proc ; первой срабатывает допустим эта ... ... some_proc: вот допустим мы и внедрились в этот пролог jmp virus_decoder .... virus_decoder: и вот тут у нас такой раскодировщик mov ecx, ebx add ecx, ; разница между ebx и длиной вируса mov eax, [esp] mov edx, [esp+4] mov edi, ; разница между началом вирусного тела и some other param decode: xor [edi], eax add eax, edx add edi, 4 loop decode add eax, ;разница между eax на этом этапе и точкой входа jmp eax ...... по поводу тела вируса оно сохранено так ---- virus body ---- случайное количество случайных байт ---- real virus body --- ------------------------ случайное количество случайных байт -------------------------- это для того чтоб всякие товарищи не брутфорсили пару двордов =) вот чтоб такое лечить придется товарисчам трейсить. ибо хрен его знает откуда срабатывает колл на вирусный дешефровщик. поскольку перед телом вируса и после него случайные количества мусора и энри поинт на вирус тоже явно не указан то брутфорсить 2 дворда на входе на вирь не выйдет. индикатор заражения предлагаю засовывать в секунды как в тарые добрые времена =). эта идея результат крекерсой практики. ставиш бряк на какойнебудь процедурке запускаеш прогу потом еще несколько раз запускаеш и видишчто даже esp один и тотже =). ----- power and the money money and the power |
|
Создано: 07 февраля 2006 14:08 · Личное сообщение · #2 |
|
Создано: 07 февраля 2006 14:35 · Личное сообщение · #3 |
|
Создано: 07 февраля 2006 15:26 · Личное сообщение · #4 |
|
Создано: 07 февраля 2006 15:45 · Личное сообщение · #5 |
|
Создано: 07 февраля 2006 17:04 · Личное сообщение · #6 По моему не стоит следить за состоянием регистров и менять дескриптор после скольки-то там запусков. Легче так: mov esi,vir_off ;\ mov ecx,vir_size ;где-то в теле проги такой кусочек будет очень непосто найти. mov edx,key ; jmp descrypt ;/ ... descrypt: дескриптор ...... doctor Ice тут кстати могут быть траблы если в кодовой секции например зашифрованные данные а мы втыкнем в них свой бряк =( тут можно на кодовую секцию поставать атрибут только выполнение и следить за исключениями. А как ты собираешься за исключениями следить если ещё управления не получал??? Вариант: смотрим на начало some proc и если там есть push ebp sub esp,xx mov epb,esp , то вероятно тело проги не криптовано. |
|
Создано: 07 февраля 2006 17:06 · Личное сообщение · #7 |
|
Создано: 08 февраля 2006 09:11 · Поправил: doctor Ice · Личное сообщение · #8 asd А как ты собираешься за исключениями следить если ещё управления не получал??? Вариант: смотрим на начало some proc и если там есть а вообще твоя идея мне понравилась - надежно =) дык я же писал заражаем на запуске. или даже если мы заражаем не на запуске то можно хотябы на первый раз заразить дллкой и когда дллка наша стартует внедрить в сам экзешник наши бряки потом после нормального заражения отрезать нашу длл. кстати при заражении дллкой как и при заражении на старте имеем массу возможностей например перехватить DialogBoxParamA или создание тредов или все что угодно лиш бы указывало на код (адрес треда обработчик окна коллбеки и прочая срань) и вот у нас клевое место для внедрения =) ----- power and the money money and the power |
|
Создано: 08 февраля 2006 09:47 · Личное сообщение · #9 |
|
Создано: 08 февраля 2006 09:51 · Личное сообщение · #10 |
|
Создано: 08 февраля 2006 10:04 · Личное сообщение · #11 Ms-Rem К чему ваш пост? все и так в курсе что вы очень крутой. Вы бы лучше что нибудь посоветовали а вам я уверен есть что подсказать. Да и дело то совсем не в неуловимости =) я добиваюсь нелечимости или хотябы максимального затруднения лечимости я добиваюсь того чтобы врямя на детекцию и лечение было просто абсурдным. ----- power and the money money and the power |
|
Создано: 08 февраля 2006 10:11 · Личное сообщение · #12 |
|
Создано: 08 февраля 2006 10:26 · Личное сообщение · #13 ValdiS Да что угодно хоть кряк-ми хоть протекторы хоть вири. для меня сейчас это в большей стпени просто интересная задачка (последний мой вирь был под вин 3.1 и дальше моего компа он не ушел). кажется всех очень волнует этическая сторона вопроса =) на крякерском то сайте =) что тут можно прежложить ну наприме создать на форуме страничку назвать ее - кто из ху и ху из кто на этом сайте. где будет список форумчам и около каждого скажем 3 поля - хороший чел, козлик, он мне помог и каждый сможет поставить свой плюсик в соответствующее поле =) ----- power and the money money and the power |
|
Создано: 08 февраля 2006 10:32 · Поправил: Ms-Rem · Личное сообщение · #14 doctor Ice пишет: К чему ваш пост? все и так в курсе что вы очень крутой. Вы бы лучше что нибудь посоветовали а вам я уверен есть что подсказать. Да и дело то совсем не в неуловимости =) я добиваюсь нелечимости или хотябы максимального затруднения лечимости я добиваюсь того чтобы врямя на детекцию и лечение было просто абсурдным А пост к тому, что я хочу сказать что вирус подобной системы можно будет поймать довольно простыми средствами. Универсальный способ тут предложить трудно, нужно иметь на руках конкретный вирус чтобы сделать процедуру его поиска. Вот я и говорю что делай вирус, и тогда посмотрим насколько неуловимым он получиться. Насчет нелечимости и большого времени на детекцию я тоже сильно сомневаюсь. ----- Скажем дружно - нафиг нужно. |
|
Создано: 08 февраля 2006 10:44 · Поправил: Ms-Rem · Личное сообщение · #15 Для быстрого поиска можно использовать короткие сигнатуры с последующей дополниельной проверкой при их нахождении. Тоесть не нужно дизасмить или эмулировать программу в поисках точки входа вирусного кода, можно взять за образец одну команду декриптора и искать ее опкод по всему файлу. После нахождения опкода проверяем принадлежит ли он вирусу (по окружиющим командам, их статистике распределения либо другим признакам присущим этому вирусу). Если вирус полиморфный, то можно зацепиться за особенности полиморфа. Таким образом решается проблема быстрого детекта вируса. При лечении вируса первой проблемой станет расшифровка его тела. Но для этого опять же не нужно эмулировать работу программы, все возможные значения esp можно просто перебрать (тем более что диапазон адресов стека невелик). При переборе зная особенности конкретного вируса можно сузить диапазон поиска и пропускать случайные байты сразу вычисляя точку входа вирусного тела. Если иде привязка декриптора к большому числу регистров или данных в стеке, то скорее всего придется запускать программу и ставить бряк на это место. При написании вируса может еще возникнуть проблема связаная с тем, что в разных ОС (и даже разных сервиспаках одной ОС) стек располагается по разным адресам. Так что твой вирус получиться дико глючным. ----- Скажем дружно - нафиг нужно. |
|
Создано: 08 февраля 2006 11:33 · Личное сообщение · #16 вот это уже интересно. так адрес стека нас на самом деле не волнует я esp использовать не собирался на самом деле. >Тоесть не нужно дизасмить или эмулировать программу в поисках точки входа вирусного кода, можно >взять за образец одну команду декриптора и искать ее опкод по всему файлу. Да тут нужен жирный метаморф и тогда ложные срабатывания сделают этот метод абсурдным. >При переборе зная особенности конкретного вируса можно сузить диапазон поиска и пропускать >случайные байты сразу вычисляя точку входа вирусного тела. Как? даже сам декриптор незнает сколько там случайных байт декритор будет декриптить и случайные байты так будто это часть тела вируса. >Если иде привязка декриптора к большому числу регистров или данных в стеке, то скорее всего придется >запускать программу и ставить бряк на это место. вот этого я и добиваюсь. а что если эта процедурка будет гдето внутри обработчика оконных сообщений =) то просто запустить не прокатит придется еще и батоны давить все подряд =) вот кажется начинается реально интересное обсуждение =) ----- power and the money money and the power |
|
Создано: 08 февраля 2006 11:50 · Личное сообщение · #17 |
|
Создано: 08 февраля 2006 11:59 · Поправил: Ms-Rem · Личное сообщение · #18 doctor Ice пишет: Да тут нужен жирный метаморф и тогда ложные срабатывания сделают этот метод абсурдным. Ну, против любого метаморфа можно будет сделать алгоритм обнаружения не дающий ложных срабатываний. Правда общие рекомендации тут врядли могут быть, надо смотреть конкретный случай. doctor Ice пишет: Как? даже сам декриптор незнает сколько там случайных байт декритор будет декриптить и случайные байты так будто это часть тела вируса. Можно например использовать тот факт, что мусорные байты случайны, а байты зашифрованого тела нет. Правда это сильно зависит от примененного алгоритма шифрования. В общем случае, можно искать в программе блоки с случайным статистическим распределением байт, а затем применять к ним различные проверки и пытаться дешифровать. Но можно подойти с другой стороны. Для лечения необязательно расшифровывать тело вируса. Если вирус внедряется в стандартные функции путем поиска их по сигнатурам, то вполне можно будет попорченые функции заменить кодом из заранее подготовленого набора, а тело вируса можно будет оставить, мешать оно не будет. ----- Скажем дружно - нафиг нужно. |
|
Создано: 08 февраля 2006 12:11 · Личное сообщение · #19 > Правда это сильно зависит от примененного алгоритма шифрования. Вот здесь архивация тоже будет кстати =) а мусорные байты и правда лучше делать неслучайными!!!! типичные куски кода будут в самый раз. >Для лечения необязательно расшифровывать тело вируса. ну естественно мы попортим филейные части прожки (смотреть тему про внедрение тела - покриптуем те куски). спасибо за подсказку о мусоре. ----- power and the money money and the power |
|
Создано: 08 февраля 2006 15:05 · Личное сообщение · #20 Ms-Rem Ну, против любого метаморфа можно будет сделать алгоритм обнаружения не дающий ложных срабатываний Отлично, пишем червя, который распространяется по сети. Когда его обнаруживают, мы создаём службу, которая контролирует поражаемый червём порт и осуществляет его модификацию. И выпускаем пропатченного червя. С вирусом будет сложнее, идиотов мало его запускать. Да, как бы вот сделать чтобы код полностью мутировал и при этом ни какой бы антивирус это не палил. Сложно себе это представить. |
|
Создано: 08 февраля 2006 15:19 · Личное сообщение · #21 |
|
Создано: 08 февраля 2006 16:45 · Личное сообщение · #22 NullSession Да, как бы вот сделать чтобы код полностью мутировал... Пермутация??? ну-ну... NullSession ...и при этом ни какой бы антивирус это не палил. не палил щас или не палил вобще??? если щас, то не такая уж и нерешаемая проблема, а вот чтоб и через неделю\месяц, то действительно сложно. А если вобще, то это AI какой-то А теперь по делу: такое вот размышление: не так уж много найдётся в нынешних прогах процедур у которых нет пролога ИМХО. Если ты будешь затирать пролог джампом, то это уже будет являться подозрительным. Достаточно будет проверить все call , и там где нет пролога проверить более акуратно. Так что пролог лучьше не затирать. |
|
Создано: 08 февраля 2006 18:15 · Личное сообщение · #23 |
|
Создано: 08 февраля 2006 18:18 · Личное сообщение · #24 Кстати, а никто не задумывался о функциях, состоящих из одного JMP на полученное от GetProcAddress значение? Можно было бы не затирать прологи, а изменить генерируемый компилятором код: найти себе местечко в файле, изменить эту самую переменную на вход вируса и в месте кода, вызывающем GetProcAddress изменить очень распространенный MOV [адрес], EAX на переменную в теле вируса, которую потом и используем в конце вирусного кода как адрес возврата. Заодно это даст возможность пережить трудные времена, в случае если функция вызывается редко. |
|
Создано: 08 февраля 2006 19:34 · Личное сообщение · #25 |
|
Создано: 11 февраля 2006 07:55 · Личное сообщение · #26 awesome Кстати, а никто не задумывался о функциях, состоящих из одного JMP на полученное от GetProcAddress значение? Это будет подозрительно для эвристического анализатора. Ещё несколько таких трюков, и Вы объявлены вирусом. Потому что ни в одной программе такого практически не бывает. Разве что в процедуре обработки сообщений, там jmp даёт существенную экономию. |
|
Создано: 11 февраля 2006 08:23 · Личное сообщение · #27 |
|
Создано: 14 февраля 2006 12:46 · Личное сообщение · #28 Virgo пишет: По поводу твоего кода Считай твою идею если она стоящая подхватят вирмейкеры, ну где-то через неделю, а еще через неделю каспер и вебер палить будут. ИМХО, Win32.Neshta. Создан в Белоруси. Ноябрь 2005 года. Заражены были почти все знакомые. А Касп до сих пор лечить его не может только удаляет. А на вируслист его вообще нету. Справляется только ДрВеб последней версии и с новыми базами. Еще не известно подхватят ли его вирмейкеры или нет. Как будто ты один такой умный и решил закриптовать тело . З.Ы. Вирус пишутся на публику или "другу" дать хочется? ----- Я фантомас, а ты гавно |
|
Создано: 15 февраля 2006 09:02 · Личное сообщение · #29 |
eXeL@B —› Программирование —› криптование вируса |