Курсовая работа: Защита программ от компьютерных вирусов
HeadType = record
case Byte of
1:(Sign : Word; {Сигнатура 'MZ' = $5MD}
PartPag: Word; {Часть неполного сектора}
PageCnt: Word; {Количество секторов}
ReloCnt: Word; {Количество элементов в таблице перемещения}
HdrSize: Word; {Длина заголовка в параграфах}
MinMem :Word; {Минимальный размер кучи}
МахМет : Word); {Максимальный размер кучи}
end.
Разумеется, фаг нельзя устанавливать на файлы, защищенные средствами модуля F_Anti так как в этом случае процедура CheckFile этого модуля обнаружит изменение заголовка и удалит фаг. Кроме того, фаг пристыковывается в конец программы и, следовательно, не может защищать крупные программы. Последнее обстоятельство контролируется установщиком SetFag.
ReloSS :Word; {Начальное значение сегмента стека SS}
ExeSP :Word; {Начальное значение указателя стека SP}
ChkSum :Word; {Контрольная сумма всех слов файла}
ExelP :Word; {Смещение точки запуска программы}
ReloCS :Word; {Начальное значение сегмента кода CS});
2:(W: array [1..12] of Word) end;
TAVir = record
Head24: HeadType; {24 байта эталонного заголовка}
Starts: Word; {Относительный сегмент}
StartO: Word; {и смещение точки запуска программы} Leng24: Longint;{Длина незараженной программы минус 24 байта}
Key : Word; {Ключшифровки}
end;
Как видим, этот ключ-несколько отличается от использованного в модуле F_Anti: сохраняются только 24 байта заголовка (вряд ли вирус изменит смещение таблицы TablOff и номер оверлея Overlay), исключено ненужное теперь поле HFf добавлены поля StartS и StartO для запоминания относительного адреса точки запуска защищаемой программы. Поле Key по-прежнему содержит шифр для защиты ключа. Суммарная длина ключа SizeOf {TAVir) составляет 34 байта.
Процесс установки защиты состоит из следующих этапов.
1) В динамическую память считывается код фага из файла FAG.PRG. Вы можете создать свой вариант фага и заставить программу SetFag использовать его, если в команду запуска установщика добавите ключ /F: NameFag.Ext, где NameFag,Ext-имя и расширение файла, содержащего разработанный Вами фаг. В этом случае учтите, что SetFag помещает 34—байтный ключ в самое начало кода фага (см. листинг FAG. ASM) и поэтому при считывании из файла пропускает 34 байта от начала его загружаемой части. Выделение кода фага в отдельный P^G—файл понадобилось мне на этапе разработки и отладки кода фага. Я решил сохранить возможность загрузки кода из внешнего файла для того, чтобы Вы смогли при желании поэкспериментировать с этим кодом.
2) В поле Head24 переменной НН типа TAVir считывается заголовок ЕХЕ-файла и осуществляется настройка ключа НН: в полях StartS и StartO запоминается относительный адрес точки запуска защищаемой программы; вычисляется файловое смещение LS в параграфах, соответствующее полной длине файла и выровненное на границу параграфа - с этим смещением от начала файла в него будет помещен ключ и тело фага (выравнивание на границу параграфа необходимо для того, чтобы обеспечить корректность внутрисегментной адресации кода фага); в ReloCS помещается новое значение относительного сегмента точки запуска фага, а в ExelP-смещение этой точки; рассчитывается новое значение длины загружаемой части файла с учетом ключа и тела фага и соответствующим образом изменяются поля PageCnt и PartPag; проверяются и при необходимости корректируются поля MinMem и ExeSP так, чтобы стек не разрушил код фага.
3) В начало ЕХЕ-файла записывается новый заголовок HH.Head24, затем осуществляется смещение файлового указателя на 15*16 байт от начала файла и в него записывается зашифрованный ключ и тело фага. Ассемблерная программа FAG. ASM работает следующим образом.
Сразу после получения управления фаг сохраняет в стеке регистр АХ, запоминает в переменной PSP значение регистра сегмента данных DS (в этот момент он указывает на префикс программного сегмента) и помещает в DS сегмент кода CS (данные и код фага расположены в одном сегменте). Кроме того, в переменной SPO запоминается вершина стека, а в CSO-сегмент кода фага. Затем вычисляется абсолютный сегмент точки запуска защищаемой программы (как уже говорилось, он равен PSP+16) и найденное значение помещается в StartS-таким образом готовится запуск защищаемой программ.