Защита программ от компьютерных вирусов
я
абсолютного адреса перемещаемой ссылки;
• извлекается слово по адресу ReloSeg:ltemOfs-сегментная часть перемещаемой
ссылки;
• к этому слову прибавляется StartSeg (осуществляется так называемая
привязка сегмента);
• результат помещается обратно по адресу ReloSeg:ltemOfs.
9) Выделяется память за концом программы в соответствии со значениями
MinMem и МахМет.
10) Инициируются регистры и запускается программа:
• регистры ES и DS получают значение сегмента, в котором располагается
PSP',
• регистр АХ отражает корректность идентификаторов дисков в командной
строке (при нормальном запуске содержит 0);
• SS = StartSeg+ReloSS;
• SP = ExeSP;
• CS == StartSeg^ReloCS;
• IP= Exelp;
• содержимое остальных регистров не имеет значения. Регистры сегмента кода
CS и указателя инструкций IP обычно инициируются следующими тремя
командами:
PUSH StartSeg+ReloCs
PUSH Exelp
RETF
(команда RETF дальнего возврата из подпрограммы извлекает из стека два
слова-смещение и сегмент адреса перехода-и помещает их соответственно в IP
и CS).
Таким образом, сразу после получения управления фаг должен сохранить
значения регистров АХ и DS и поместить в DS значение собственного сегмента
данных. На практике сегмент данных в коротких ассемблерных программах
обычно совпадает с сегментом кода, т.е. программа и данные размещаются в
одном сегменте. Сегмент стека SS можно не изменять, т.к. программа-
установщик фага должна позаботиться о том, чтобы стек не разрушил код
самого фага, и соответствующим образом настроить ReloSS и/или ExelP. Обычно
в ЕХЕ-программе начальное значение ReloSS таково, что стек размещается
сразу за концом программы, т.е. в том месте, куда программа-установщик
помещает "код фага. Длина стека ExeSP как правило более чем достаточна для
того, чтобы работа фага со стеком не привела к разрушению кода фага,
поэтому в большинстве случаев установщик оставляет начальные значения
ReloSS и ExeSP без изменения.
4.1. Описание программ SetFag.pas и Fag.asm
В этом параграфе описываются программы SetFag.pas и Fag.asm, с
помощью которых реализуется описанный выше механизм защиты. Программа
SetFag (прил.П8.1) осуществляет установку фага, а программа Fag.asm
(прил.П8.2) содержит сам фаг. Если Вы захотите воспользоваться
предлагаемыми программами, откомпилируйте Турбо Ассемблером файл Fag.asm
командой
tasm fag /L
В ходе компиляции на экран будет выведено 13 предупреждений вида
Warning* Open procedure: XXXXXX а в конце сводка:
Error message: None Warning message: 13 Passes: I Remainig
memory: XXXК
Если в строке Error message вместо None указано число обнаруженных
ошибок, просмотрите файл листинга компиляции fag.lst, отыщите в нем
•сообщения компилятора об ошибках и устраните их. Затем преобразуйте
полученный файл fag.obj в программу Fag.prg командой
tiink fag, fag.prg
Компоновщик должен сообщить Warning: No stack
Замечу, что программа Fag.prg не может работать самостоятельно без
предварительной настройки установщиком SetFag.exe, поэтому в целях
предосторожности ей присваивается нестандартное расширение PRG. Для
установки защиты на любой ЕХЕ-фаил следует дать команду
setfag NAME,
где NAME-имя защищаемого файла. Иными словами, имя файла передается
программе установки фага SetFag.exe с помощью параметров запуска. В имени
NAME можно опускать стандартное расширение ЕХЕ, а также разрешается указать
маршрут поиска файла и/или символы—заменители ДОС «*» и«?» для определения
группового имени-в этом случае защита будет установлена на каждый файл,
соответствующий групповому имени. Например, команда
setfag d:mydir *
означает требование установить защиту на все ЕХЕ-файлы из каталога MYDIR на
диске D.
Перед установкой зашиты программа осуществляет серию проверок файла.
Она проверяет заголовок файла и блокирует установку защиты, если первые два
байта заголовка не соответствуют сигнатуре «MZ» (признаку ЕХЕ-файла). Кроме
того, она проверяет «хвост» файла с тем, чтобы убедиться в отсутствии кода
фага, и блокирует повторную установку защиты на уже защищенный файл. Далее,
защита не устанвливается также в том случае, если длина загружаемой части
файла станет слишком большой (превысит доступную память). Если в конце
файла обнаружена незагружаемая часть, программа информирует об этом
пользователя и запрашивает у него подтверждение на установку за-щиты. После
завершения всех проверок программа создает резервную копию исходного файла
с расширением ВАК. Создание ВАК-файла можно запретить, если команду вызова
дополнить ключом /NOBAK, например setfag myprog /nobak. Для защиты
используется ключ, соответствующий такой структуре данных:
Type
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-таким образом готовится запуск защищаемой программ.
Вся основная работа фага запрограммирована в серии последовательно
вызываемых процедур (при разработке фага использовался метод нисходящего
программирования). Вначале с помощью процедуры GetExeNome фаг определяет
полное имя защищаемого ЕХЕ- файла. Для этого используется то
обстоятельство, что в версиях ДОС 3.0 и выше стандартный загр
| | скачать работу |
Защита программ от компьютерных вирусов |