ZF

                        Фрагменты из эхи

    1. Как правильно разобрать и вылечить файл, инфицированный
сразу несколькими вирусами?

F>     Допустим, что файл инфицирован тремя  различными вирусами.
F> Вирус1 (V1). Ищет сигнатуру "0CD21h" в первом килобайте жертвы
F> и записывает туда переход на свое тело.  Тело  дописывается  в
F> конец. После тела дописывается до килобайта случайных байт.

Q>    Теорема без    доказательства:    если    это   "корректно
Q> работающий" вирус,  то он восстановит  CD  21  хх  в  позицию,
Q> которая   ссылается   на  начало  сигнатуры  sig1.  это  смысл
Q> операции,  которую и нужно искать.  этим занимается эвристика.
Q> по  большому счету,  надежнее всего писать лечилку для каждого
Q> вируса отдельно.  попытки  обобщать  методы  лечения  приводят
Q> именно к таким упорам, как здесь: "а КАК его лечить?" а почему
Q> этот вирус должен лечиться с помощью  _простого_  сигнатурного
Q> поиска?  давай напишем язык, который всунем в вирусную базу, и
Q> пусть этот язык определяет начало сигнатуры.  поскольку вирус1
Q> генерирует  случайный  массив байт,  то это неизлечимый вирус,
Q> поскольку случайно может выйти сигнатура вируса2  (с некоторой
Q> отличной  от  ноля  вероятностью  J.  и  тогда  исцеление от
Q> вируса2 произойдет некорректно.

F>     Вирус2 (V2).  Записывает  переход  на  свое  тело в первых
F> байтах жертвы.  Свое тело пишет в область одинаковых  байт  (в
F> середину кода жертвы).

Q>     Тут поиск начала сигнатуры довольно простой. то есть, даже
Q> трассировать особенно не придется.

F>     Вирус3 (V3).  Раскидывает свой код по всему  телу  жертвы.
F> Переход  на первый свой блок вставляет в точку выхода из подп-
F> рограммы (RETF).

Q>    Поскольку RETF короче,  чем JMP куда-то, то вирус, который
Q> можно исцелить,  должен восстанавливать эти байты.  если он их
Q> не  восстанавливает,  то  он  их  может и не запоминать (как и
Q> вирус1), и поэтому файл будет классифицирован как неизлечимый.
Q> если  же  излечим в принципе,  то ищем переход на sig1.  а это
Q> снова трассировщик (эмулятор) с эвристиком. ну, хотя, может, и
Q> просто  сканирование  сигнатуры операции перехода.  но снова -
Q> это не простой сигнатурный поиск.  хотя,  нужно  определиться,
Q> насколько прост простой сигнатурный поиск J

F> Примеры:
F> GOAT1.COM = GOAT.COM + V1 + V2 + V3
F> GOAT2.COM = GOAT.COM + V2 + V1 + V3
F> GOAT3.COM = GOAT.COM + V2 + V3 + V1
F> GOAT4.COM = GOAT.COM + V3 + V2 + V1
F> GOAT5.COM = GOAT.COM + V3 + V1 + V2
F> GOAT6.COM = GOAT.COM + V1 + V3 + V2

Q>    Проблема состоит только с вирусами, которые изменяют длину
Q> файла. скажем, вирус2 проблемы не несет. потому что корректное
Q> лечение   заключается  в  восстановлении  начальных  байт,  и,
Q> возможно,  массива одинаковых байт  в  теле.  поэтому  лечение
Q> должно  начинаться  с  таких вирусов.  утверждение,  кажущееся
Q> умным:  корректировать  длину  файла  некорректно   до   конца
Q> излечения. еще одна теорема без доказательства: если вирусы не
Q> затрагивают  код  друг  друга,  то  файл  излечим  всегда.   в
Q> противном  случае  -  если  последовательность запуска вирусов
Q> выделить удается,  то лечим их в этой последовательности; если
Q> не удается - то файл неизлечим.  важное следствие:  трассируем
Q> файл,  пока не наткнемся на вирус.  это будет  либо  излечимый
Q> случай1, когда вирусы не затрагивают друг друга, или это будет
Q> излечимый  случай2,  когда  мы  отыскали  вирус  в  правильной
Q> последовательности.  конечно,  нужно  придумать  еще  детектор
Q> случая3, когда мы отыскали затрагивающие друг друга вирусы, но
Q> начали  не  с  того.  чтобы  сигнализировать  о неизлечимости.
Q> поскольку раз _мы_ дотрассировались до  неправильного  вируса,
Q> то   и  процессор  может  до  него  добраться  именно  в  этой
Q> последовательности,  и кто знает, может, это случается всегда.
Q> вирус3  должен  куда-то  сохранить  байты  из-под  пятен.  это
Q> обязательно произойдет в конец файла. если эти байты находятся
Q> _после_ начала вирус1, значит, сначала был вирус1. если _до_ -
Q> то вирус3.  хотя,  из важного  следствия  можно  сказать,  что
Q> последнее предложение не важно.


(C) NF, 1998-2004