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