Фрагменты из эхи
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> последнее предложение не важно.
|