Раздел: Документация
0 ... 22 23 24 25 26 27 28 ... 102 (н противном случае их там окажется два), либо вызвать оригинальную функцию не командной call, но командой jmp. Для «честных» программ, написанных на языках высокого уровня, и то, и другое крайне нетипично, благодаря чему вирус оказывается немедленно разоблачен. Вирусы, перехватывающие управление в произвольной точке программы (зачастую чрезвычайно удаленной от точки входа), выявить намного труднее, поскольку приходится анализировать довольно большие, причем заранее не определенные объемы кода. Впрочем, с удалением от точки входа стремительно возрастает риск, что данная ветка программы никогда не получит управление, поэтому все известные мне вирусы не выходят за границы первого встретившегося им ret. ОСНОВНЫЕ ПРИЗНАКИ ВИРУСОВ Искажение структуры исполняемых файлов — характерный, но недостаточный признак вирусного заражения. Быть может, это защита хитрая такая или завуалированный способ самовыражения разработчика. К тому же некоторые вирусы ухитряются внедриться в файл практически без искажений его структуры. Однозначный ответ дает лишь полное дизассе.мблирование исследуемого файла, однако это слишком трудоемкий способ, требующий усидчивости, глубоких знаний операционной системы и неограниченного количества свободного времени. Поэтому на практике обычно прибегают к компромиссному варианту, сводящемуся к беглому просмотру дизассемблерного листинга на предмет поиска основных признаков вирусного заражения. Большинство вирусов использует довольно специфический набор машинных команд н структур данных, практически никогда не встречающихся в «нормальных» приложениях. Конечно, разработчик вируса при желании может все это скрыть и распознать зараженный код тогда не удастся. Но это в теории. На практике же вирусы обычно оказываются настолько тупы, что обнаруживаются за гчитанные доли секунды. Ведь чтобы заразить жертву, вирус прежде должен ее найти, отобрав среди всех кандидатов только файлы «своего» типа. Для определенности возьмем elf-файл. Тогда вирус будет вынужден считать его заголовок и сравнить четыре первых байта со строкой FELF, которой соответствует ASCII-последовательность 7F 45 4С 46. Конечно, если тело вируса зашифровано, вирус использует хеш-сравнение или же другие хитрые приемы программирования, строки ELF в теле зараженного файла не окажется, но более чем в половине всех существующих LNIX-вирусов она все-таки есть, н этот прием, несмотря па свою изумительную простоту, очень неплохо работает. Загрузите исследуемый файл в любой hex-редактор и попробуйте отыскать строку " ELF". В зараженном файле таких строк будет две: одна - непосредственно в заголовке, другая — в кодовой секции или секции данных. Только не используйте дизассемблер! Очень многие вирусы преобразуют строку J FELF в 32-разрядную целочисленную константу 464C457Fh, которая маскирует присутствие вируса, но при переключении в режим дампа сразу же «проявляется» на экране. Далее приведен внешний вид файла, зараженного вирусом VirTool Mmap.443, который использует именно такую методику (рис. 2.9).и" „ [.] - text:08048470 text:08048480 text:08048490 :080484fl0 :080484B0 :080484C0 text:080484D0 text:080484E0 .text:O80484F0 .text:08048500 .text:08048510 .text:08048520 text text: text: text: .text:* .text:* .text:* .text:* .text:* .text:08« .text:08048bH0 .text:080485B0 . text:080485C0 text:080485D0 text:080485E0 text:080485F0 00 00 00 FF C450 00 89E3 0Й 00: :: 78 0401 00 0300 00 6000 00 0F85 2C 833B E2 EF59 SB 6000 08 0088 ."text: 08048403" .text.08048409 .text:080484flF .text:080484B6 .text:080484BC text:080484C3 - IDA View-fl -——- 87 СЙ CD 30 89 CC 50 31 CO 31 02 Ft C4 51 53 41 51 41 41 51 50 52 R8 50 00 00 CD 80 fiaj£J&r.8&C0 59 5fl 0F 88 3E 01 45 4C-46)8f 85 5F 00 00 0» 81 01 01 00 0F 85-52 1M 08 DO 81 78 10 02 0F 85 45 00 00-Ufl 83 Щ 14 01 OF 85 3B 83 78 24 00 OF-85 31 00480 00 80 78 0C 27 08 80 00 8B--58 1С 8.1 С31 66 8B 48 01 OF 85 02 00-00 00 89 DF 66-3 58 2fl 89 06 03 57 14-2B 57 10 29 C7 К 93 B8 00 CD 80 OF 83 €4 00 00 00 81 C2 № 01 50 00 80 ..•-Р08ВДвпрУ-. :-»-»ее...гнЙ. ,....Гх$.оЕ1...я. ...*Е,...ЛН.0пн- [...-ЯвГ-...Б-nQ « 09 8В-50 00 89 01 CD 80 К.-ЛЬЙ- cnpdword ptr [eaxl jnzloc 804850E cmpdword ptr leax+4] jnzloc 804850E cmpdword ptr [eax*10hl jnzloc 804850E 10101b. C9 66 № 10 66 03 FF 75 07 07 ГС F3 B8 06 00 BB 00 60 L080484fl0: sub 804845- 48 30 39 78 2E E2 8B 50 18 04 8F 45 00 00 88 00 00 CD // lo-Bh ъу. из ua ми m из ы- EE 5F-B9 BR 0.1 00 U0 29 CF 5E 89 55-07 89 70 18 89 EE 83 EE 07 93-B8 5B 00 00 00 59 CD 80 50 GO-CD 88 СЗ B8 01 00 60 00 80 90-90 90 90 90 90 98 90 90 op-a IK" 300O2h «; ; on- rrtflH09w«-obf.. Q "►ftK.™J1S..H< . " и-ПРТии-ИрТЙкГю! •№едПЕ-У1[..Л-ЙТ 1*...ni.-flh0... . .-flPPPPPPPPPy Рис. 2.9. Фрагмент файла, зараженного вирусом VirTool.Linux.Mmap.443. В НЕХ-дампе легко обнаруживается строка ELF, используемая вирусом для поиска жертв «своего» типа Вирус Linux.Winter.343 (также известный под именем Lotek) но этой методике обнаружить не удается, поскольку он использует специальное математически преобразование, зашифровывая строку 0ELF на лету (листинг 2.14). Листинг 2.14. Фрагмент вируса Lotek, тщательно скрывающего свой интерес к elf-файлам .text:08048473 .text:08048478 .text:0804847A mov eax. 0B9B3BA81h add eax. [ebxl jnz short loc 804846L -"ELF" (минус "ELF") первые четыре байта мертвы -» это не ELF кеБИ Непосредственное значение B9B3BA81h, соответствующее текстовой строке (в приведенном выше листинге оно выделено жирным шрифтом), представ ет собой не что иное, как строку QELF, преобразованную в 32-разрядную <оН станту и умноженную на минус единицу. Складывая полученное значение с тырьмя первыми байтами жертвы, вирус получает ноль, если строки ра и ненулевое значение в противном случае. Как вариант, вирус может дополнять эталонную строку CELF ЛР еди,,ииЬ1в1!тре гда в его теле будет присутствовать последовательность 80 ВА ВЗ В9. Реже чаются циклические сдвиги на одну, две, три... и семь позиций в различНЫаИт) роны, неполные проверки (то есть проверки на совпадение двух или трех и некоторые другие операции — все не перечислишь!„ Более уязвимым с точки зрения скрытности является механизм р<-а- ф-системных вызовов. Вирус не может позволить себе тащить за собой вс vlibc. нрнлинкованную к нему статической компоновкой, поскольку су-1110Тв()ваине подобного монстра трудно оставить незаметным. Существует "1СЧ1 , способов решения этой проблемы, и наиболее популярный из них „еско- 11С[Юльзованию native-API операционной системы. Поскольку пос-tB(V .. явЛяется прерогативой особенностей реализации данной конкретной СД мы создатели UNIX де-факто отказались от многочисленных попыток его СИа,партнзаиии. В частности, в System V (и ее многочисленных клонах) обра-С lie к системным функциям происходит через дальний call по адресу 0007-00000000, а в Linux это осуществляется через служебное прерывание INT 80h е чень „ОМеров системных команд можно найти в файле /usr/include/asm/ unistd h). Таким образом, использование native-API существенно ограничивает ареал обитания вируса, делая его непереносимым. Честные программы в большинстве своем практически никогда не работают через native-API (хотя утилиты из комплекта поставки Free BSD 4.5 ведут себя именно так), поэтому наличие большого количества машинных команд INT 80h/ CALL 0007:0000000 (CD 80/9А 00 00 00 00 07 00) с высокой степенью вероятности свидетельствует о наличии вируса. Для предотвращения ложных срабатываний (то есть обнаружения вируса там, где и следов его нет), вы должны не только обнаружить обращения к native-API, но и проанализировать последовательность их вызовов. Для вирусов характерна следующая цепочка системных команд: sysopen, sysl seek, oldmmap/sysmunmap, syswrite, sysclose, sysexit. Реже используются вызовы exec и fork. Их, в частности, использует вирус STAOG.4744. Вирусы VirTool.l.inux.Mmap.443, VirTool.Linux.EIfwrsec.a, PolyEngine.Linux.LIME.poly, Linux.Winter.343 и ряд других обходятся без этого. Ниже приведен фрагмент файла, зараженного вирусом VirTool.Linux.Mmap.443 (рис. 2.10). Наличие незамаскированных вызовов INT 80h с легкостью разоблачает агрессивную природу программного кода, указывая на склонность последнего к саморазмножению. А вот так для сравнения выглядят системные вызовы «честной» программы — Утилиты cat из комплекта поставки Free BSD 4.5 (рис. 2.11). Инструкции пре-цияаН"Я "С раз1юса,ш 1,0 всему коду, а сгруппированы в собственных функ-ем Х °°е)тках- Конечно, вирус тоже может «обмазать» системные вызовы сло- ПсРеходного кода, но вряд ли у него получится подделать характер оберток "Кретного заражаемого файла. К)Т)ТоРЬ1е (впрочем, довольно немногочисленные) вирусы так просто не сда-*еНие 11олк,Уют различные методики, затрудняющие их анализ и обпару-Чиче аи"олсе талантливые (или, скорее, прилежные) разработчики дина-забрКИ ГенеРируют инструкцию INT 80h/CALL 0007:00000000 на лету и, <твце ад ее ,1а верхушку стека, скрытно передают ей управление. Как след- 8оь/гВДИЗассемлеР1юм листинге исследуемой программы вызов INT 80h/ М°*Но 0007:00000000 будет отсутствовать, и обнаружить такие вирусы 1,Щся Лишь по многочисленным косвенным вызовам подпрограмм, находя-•ЧИц ПрИс-СТеКе" то Действительно нелегко, так как косвенные вызовы в изоби-ЫХ УТствуют и в «честных» программах, а определение значений вызыва-Ресов представляет собой серьезную проблему (во всяком случае, при 0 ... 22 23 24 25 26 27 28 ... 102
|