Защита от вирусовРефераты >> Коммуникации и связь >> Защита от вирусов
3.2. Защита вновь создаваемых программ
Ключевую информацию (будем для краткости называть ее ключ) о незараженной программе можно хранить в отдельном файле, но в этом случае существует опасность потерять дополнительный файл при копировании программы или ошибочно уничтожить его. Гораздо надежнее хранить ключ в теле самого защищаемого файла. К сожалению, его нельзя подобно вирусу при-стыковать в конец файла, т.к. в случае заражения вирус изменит поля PartPag и PageCnt и мы никогда не сможем определить то место в файле, где он располагается. Вспомним, что все константы (в том числе и типизированные) создаются на этапе компиляции программы, таким образом в файле обязательно имеется область данных, содержащая значения этих констант. Эта область в Турбо Паскалевых программах располагается в самом конце загружаемой части файла (см.рис.6.2).
Следовательно, мы должны объявить в программе типизированную констант, предназначенную для хранения ключа, а затем в область файла, отведенную для ее размещения, поместить нужную информацию.
Каким образом отыскать в ЕХЕ-файле место, занимаемое ключом? Конечно, можно перед ним в программе разместить какую-либо типизированную константу с характерным значением (например, заранее обусловленную текстовую строку) и затем отыскивать ее в файле. Однако такое решение вряд ли можно признать удовлетворительным: во-первых, всегда существует вероятность того, что какой-то фрагмент кодов программы содержит ту же цепочку байт, что и заголовок ключа; во-вторых, придется просматривать подчас большой по объему ЕХЕ—файл в поисках нужной константы. Значительно изящнее выглядит решение, основанное на точном вычислении смещения от начала файла до ключа.
Для этого нужно определить начало области данных в файле. В заголовке файла не предусмотрено никакой информации о начальном значении регистра DS, в котором хранится сегмент данных. Перед передачей управления программе загрузчик устанавливает значение этого регистра так, чтобы он указывал на начало так называемого префикса программного сегмента {PSP), а запущенная программа уже сама должна установить его надлежащим образом.
Префикс программного сегмента имеет длину 256 байт (16 параграфов) и размещается загрузчиком в оперативной памяти непосредственно перед загруженной программой. В PSP содержится различная служебная информация, которая может быть достаточно важной для ДОС и работающей программы (в PSP, например, хранятся параметры обращения к программе), но в нем нет указаний на содержимое регистра DS. Таким образом, найти начало области данных в файле достаточно трудно. Однако это нетрудно сделать в работающей программе-для этого предусмотрена стандартная функция DSeg, возвращающая сегмент данных. Если бы программа могла получить также информацию о сегменте PSP, с которого начинается загруженная программа, можно было бы вычислить смещение в файле от его начала до начала области данных. Такая возможность есть-функция MS-DOS с номером $62 возвращает в регистре ВХ значение сегмента PSP. Следовательно, программа должна получить значения обоих сегментов, вычислить их разницу и таким образом определить место в файле, с которого начинается область данных.
Остается последняя проблема-как найти нужную константу. Турбо Паскаль размещает константы в области данных по мере их объявления в программе. Зная размер каждой константы и порядок их объявления, можно вычислить место размещения нужной нам типизированной константы. Однако этот метод не годится для универсальной программы защиты, так как порядок объявления констант может меняться от программы к программе. К счастью, мы можем использовать операцию получения адреса @. Результатом применения этой операции к адресу константы, выбранной в качестве ключа, является указатель (четырехбайтный адрес); смещение адреса, который он содержит, и является нужным нам смещением начала ключа относительно начала области данных.
3.3. Модуль F_Anti
В этом параграфе описывается модуль F_Anti, в котором осуществляются все необходимые действия по установке ключа во вновь создаваемый ЕХЕ-файл и последующей проверке этого ключа при каждой загрузке программы. Полный текст модуля см. прил.П7.
В качестве ключа для контроля факта заражения ЕХЕ-файла в модуле F_Anti используется типизированная константа Head, соответствующая такой структуре данных:
Type
НТуре =record
НЕ : HeadExeType; {Эталонный заголовок файла}
HL : Longint; {Эталонная длина файла}
HF : Boolean; {Флаг установки ключа}
Key: Word ; {Шифр для защиты ключа}
end;
При создании этой типизированной константы компилятор в поле HF помещает значение False. Запущенная программа анализирует это поле. При первом прогоне HF = False, в результате чего программа вызывает процедуру Save, в ходе выполнения которой в файле сохраняются эталонный заголовок и начальная длина файла. При этом одновременно в поле HF (в файле программы!) помещается значение True, поэтому при любом последующем запуске программы вместо Save будет вызвана процедура CheckFile, которая осуществит нужный контроль файла. Если в ходе контроля обнаруживается хотя бы малейшее отличие заголовка файла от его эталона, хранящегося в Head, программа сообщает о факте заражения и предлагает восстановить испорченный заголовок и начальную длину файла.
При восстановлении зараженного файла осуществляются следующие действия:
• зараженный файл копируется в файл с расширением VIR-это позволит Вам в случае неудачной попытки восстановления повторить ее еще раз; кроме того, при желании Вы сможете передать разработчикам антивирусных программ копию вируса для выработки методов его обнаружения и уничтожения;
• анализируется адрес запуска зараженной программы: если относительное значение сегмента точки запуска у зараженной программы меньше, чем в эталоне, то это означает, что вирус располагается в начале или в середине.
Если программа запускается на уже зараженном ПК. не исключено, что заголовок файла будет испорчен вирусом, и тогда система защиты будет ревностно следить за сохранностью вируса! В этом случае программа предупреждает пользователя о невозможности восстановления (если Вас заинтересовал описываемый способ борьбы с вирусами, попробуйте модифицировать программу защиты так, чтобы она работала и в этом случае);
• если вирус пристыкован в конец файла, то в восстанавливаемый файл переносится эталонный заголовок и незараженная часть, начиная с байта TablOff + ReloCnt'4 от начала файла и до байта FileSize-HL Отмечу следующее обстоятельство. Описанная система защиты дублирует заголовок файла в тело программы. Ничто не мешает вирусу проверить тело программы на наличие дубликата и соответствующим образом изменить его. Я далек от мысли, что Вы,, уважаемый читатель, после знакомства с этим разделом захотите создать собственный вирус, учитывающий это обстоятельство. Тем не менее я считаю, что нелишней будет какая-то защита самого ключа. Такая защита реализуется очень просто: для этого достаточно все 16—битные поля эталона заголовка сложить по модулю 2 со случайной константой Key, С этой целью в процедуру Save помещен следующий фрагмент (см. текст модуля в прил.П7):