Советы

Вирусы: обнаружение заражения

Проведем аналогии

Наверное, уже все слышали о таком объекте, как компьютерный вирус. Что же представляет эта субстанция и от куда пошло это название? Термин "вирус" пришел к нам из биологии и медицины. Биологический вирус – это неполноценный организм, состоящий из нуклеиновой кислоты (ДНК или РНК, т.е. генетического кода) и защитной белковой оболочки, позволяющей существовать вирусу в закапсулированном состоянии. Биологический вирус оживает лишь тогда, когда попадает в клетку живого организма и встраивает свой генетический код в исходный. Компьютерный вирус действует теме же методами. И так.
Компьютерный вирус – это кусок кода (не программа, а всего лишь код), который способен встраиваться в код какой-либо программы, там самым оживая и заражая другие программы. Как и в случае биологического вируса, когда больной человек опасен здоровому, зараженная программа опасна для других программ, т.к. с ее помощью вирус может заражать. При этом в большинстве случаев зараженная программа вполне работоспособна, а не редко ее и не возможно отличить от "здоровой".

Чем раньше министерство здравоохранения обнаружит вирусную эпидемию, тем мягче будут последствия и тем быстрее можно будет локализовать очаг заражения и избавиться от заразы. Точно тоже происходит и в мире программ. Чем раньше будет выявлено заражение, тем меньшее число программ окажутся "больными" и тем проще будет вылечить компьютер. О своей болезни первым узнает сам больной и только он может первым выявить начало эпидемии. Так почему бы самим программам не сообщать нам о своем заражении? Ведь присутствие вируса в системе начинает ощущаться тогда, когда уже половина всех программ заражены, а до этого все списывается на мелкие глюки.

Как же программа поймет, что она "больна"? Вернемся к биологии: биологический вирус встраивает свой генетический код в код жертвы, тем самым меняя его структуру. Компьютерный вирус поступает также. А изменения могут возникнуть следующие: код станет длиннее или короче исходного; код не изменит своего размера, но изменится сам.

Теория обнаружения заражения

Программа должна сама после запуска произвести проверку своего кода на наличие повреждения (заражения) и в случае обнаружения изменений выдать предупреждающее сообщение. Если так будут поступать все программы, то попавший в систему вирус будет сразу же обнаружен, после чего пользователь компьютера, воспользовавшись антивирусными программами, избавится от него. Пришли к следующему: программа лишь обнаруживает свое заражение, даже не пытаясь самолечиться; но этого достаточно для своевременного выявления заразы.

Как же программа сможет понять, что ее код изменился? Конечно можно хранить вторую копию кода программы в файле с другим именем и сравнивать после запуска, но это не экономично и не эффективно. На самом деле достаточно хранить всего лишь размер программы и контрольную сумму (число, равное сумме всех байт кода программы). Эти данные могут находиться в отдельном файле и распространяться вместе с самой программой. Важно, что бы генерация этого файла проходила только для "здоровой" программы, предварительно проверенных антивирусом.

Может возникнуть вопрос, а что если появятся новые вирусы, способные изменять не только код самой программы, но и данные контрольного файла? Да, это возможно. Но можно действовать не по одному шаблону. Например, в каждом конкретном случае использовать разные функции подсчета контрольной суммы, что не позволит вирусу корректно подстроить значения под себя. В итоге этот метод даст возможность обнаружить как минимум 99% вирусов.