Заражение файлов Эдайн Гхэллах Спецвыпуск Xakep, номер #035, стр. 035-048-2 object name – имя секции virtual size – виртуальный размер секции, т.е. размер после загрузки в память Section rva – адрес начала секции в памяти Physical size – размер секции на диске Physical offset – смещение секции в файле Object flags – флаги секции, с помощью них можно установить права записи, чтения и исполнения содержимого секции Это была последняя таблица, знание которой необходимо для заражения файлов. И последняя вещь: прежде чем начинать работать с файлом, вирусу нужно проверить, что это действительно PE файл. Исходя из всего вышесказанного, получаем простенький алгоритм проверки: Прочитать файл в память (по адресу xxxxxxxx). Проверить первые два байта на соответствие MZ. Взять смещение PE заголовка по адресу xxxxxxxx+3ch. Выровнять его на адрес загрузки (прибавить xxxxxxxx). Проверить первые два байта на соответствие “PE”. Способ первый. Запись в конец последней секции Это способ является самым простым, и при этом довольно эффективным. Именно поэтому его используют большинство вирусов. Действительно, запись вируса в конец файла (т.е. в последнюю секцию) кажется наиболее логичной. Но есть и недостаток – все антивирусы очень внимательны к последней секции файла. Особенно, если туда указывает ImageBase. Впрочем, для начала – это лучший способ. Алгоритм заражения такой: Получить смещение последней секции, умножив количество секций на 28h. Увеличить virtual size секции на виртуальную длину вируса. Увеличить physical size секции на физическую длину вируса. Записать тело вируса по адресу Physical offset + Physical size. Изменить EntryPoint в PE заголовке на начало вирусного кода. Увеличить ImageSize на виртуальную длину вируса. Вот и все, как видишь – очень просто. Единственное, что еще нужно добавить, в данном случае виртуальная длина вируса – это длина вируса, выровненная на virtual align, а физическая длина - соответственно, длина, выровненная на physical align. Способ второй. Добавление новой секции Тоже очень популярный и простой метод. Несложно добавить еще одну запись в object table и записать тело вируса в конец файла. Но, как и у предыдущего способа, есть большой минус – любой мало-мальски уважающий себя антивирус прибьет твой вирус как нечего делать. Не идеально, но намного лучше, добавляя новую секцию, записывать ее не в конец файла, как это делается обычно, а в начало. Остальные секции при этом сдвигаются. С точки зрения антивируса определить наличие вируса будет уже намного сложнее. Способ третий. HLL метод Это далеко не самый лучший способ. Я бы даже назвал его ламерским. Но он существует, и даже есть люди, использующие его в своих вирусах. Своим появлением этот метод обязан языкам высокого уровня (и именно в них он применяется чаще всего). Суть в том, что вирус заменяет собой заражаемый файл, который просто присоединяется к телу вируса. Во время запуска вирус извлекает из себя программу и запускает ее. Реализовать такой способ очень легко, да к тому же можно упаковывать исходный файл, и тогда размер зараженного файла не увеличится. Но на этом плюсы данного метода заканчиваются. Короче говоря, я надеюсь, ты никогда не будешь заражать файлы таким способом. |