TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

6.4.1. Описание программ SetFag.pas и Fng.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: 1 Remainig memory: XXX К

Если в строке Error message вместо None указано число обнаруженных ошибок, просмотрите файл листинга компиляции fag.Ist, отыщите в нем сообщения компилятора об ошибках и устраните их. Затем преобразуйте полученный файл fag.obj в программу Fag.prg командой

tlink fag, fag.prg

Компоновщик должен сообщить

Warning: No stack

Замечу, что программа Fag.prg не может работать самостоятельно без предварительной настройки установщиком SetFag.exe, поэтому в целях предосторожности ей присваивается нестандартное расширение PRG.

Для установки защиты на любой ЕХЕ—фа&л.1 следует дать команду

setfag NAME

где NAME — имя защищаемого файла. Иными словами, имя файла передается программе установки фага SetFag.exe с помощью параметров запуска. В имени NAME можно опускать стандартное расширение ЕХЕ, а также разрешается указать маршрут поиска файла и/или символы—заменители ДОС «'» и«?» для определения группового имени — в этом случае защита будет установлена на каждый файл, соответствующий групповому имени. Например, команда

setfag d:\mydir *

означает требование установить защиту на все ЕХЕ— файлы из каталога MYDIR на диске D.

Перед установкой зашиты программа осуществляет серию проверок файла. Она проверяет заголовок файла и блокирует установку защиты, если первые два байта заголовка не соответствуют сигнатуре vMZ» (признаку ЕХЕ— файла). Кроме того, она проверяет «хвост» файла с тем, чтобы убедиться в отсутствии кода фага, и блокирует повторную установку защиты на уже защищенный файл. Далее, защита не устанвливается также в том случае, если длина загружаемой части файла станет слишком большой (превысит доступную память). Если в конце файла обнаружена незагружаемая часть, программа информирует об этом пользователя и запрашивает у него подтверждение на установку защиты. После завершения всех проверок программа создает резервную копию исходного файла с расширением ВАК. Создание ВАК— файла можно запретить, если команду вызова дополнить ключом /NOBAK, например

setfag rayprog /nobak Для защиты используется ключ, соответствующий такой структуре данных:

type

HeadType = record case Byte of

1: (

Sign Word {Сигнатура 'MZ' = $5A4D} PartPag Word {Часть неполного сектора} PageCnt Word {Количество 'секторов} ReloCnt Word {Количество элементов в

таблице перемещения} HdrSize Word {Длина заголовка в параграфах} MinMem Word {Минимальный размер кучи} MaxMem Word {Максимальный размер кучи}

' Разумеется, фаг нельзя устанавливать на файлы, защищенные средствами модуля F_Anti (см. п.6.3.2), так как в этом случае процедура 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}, исключено ненужное теперь поле HF, добавлены поля 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, затем осуществляется смещение файлового указателя на LS' 16 байт от начала файла и в него записывается зашифрованный ключ и тело фага.

Ассемблерная программа FAG. ASM. работает следующим образом.

Сразу после получения управления фаг сохраняет в стеке регистр АХ, запоминает в переменной PSP значение регистра сегмента данных D5 (в этот момент он указывает на префикс программного сегмента) и помещает в DS. сегмент кода CS (данные и код фага расположены в одном сегменте). Кроме того, в переменной SPO запоминается вершина стека, а в CSO — сегмент кода фага. Затем вычисляется абсолютный сегмент точки запуска защищаемой программы (как уже говорилось, он равен PSP+16) и найденное значение помещается в StartS — таким образом готовится запуск защищаемой программы.

Вся основная работа фага запрограммирована в серии последовательно вызываемых процедур (при разработке фага использовался метод нисходящего программирования). Вначале с помощью процедуры GetExeName фаг определяет полное имя защищаемого ЕХЕ— файла. Для этого используется то обстоятельство, что в версиях ДОС 3.0 и выше стандартный загрузчик помещает полное имя загружаемого файла в расширенное окружение ДОС. Окружение ДОС — это область памяти длиной до 32 Кбайт, в которой ДОС сохраняет переменные окружения типа COMSPEC, PATH, PROMPT и т.п. Каждая переменная окружения представляет собой текстовую строку, составленную из кодов ASCII, в конце которой ставится байт 0 как признак конца строки — фирма IBM называет такой код ASCIIZ [Z — Zero, ноль). Переменные окружения располагаются в памяти последовательно друг за другом. В конце «стандартной» части окружения (эта часть поддерживается и в ранних версиях ДОС) ставится дополнительный нулевой байт. За стандартной частью следует расширенная часть, куда загрузчик новых версий ДОС помещает полное имя файла (с указанием диска и маршрута поиска) и, возможно, параметры обращения к программе. Таким образом, чтобы найти имя файла, нужно отыскать в окружении ДОС два ноля подряд — это признак начала расширенной части окружения. Слово, следующее за этим признаком, содержит количество переменных в расширенной части, за ним помещаются сами переменные. Например, в терминах ассемблера структура окружения может быть такой:

db 'COMSPEC=C:\COMMAND.COM',0 ;Переменная COMSPEC db 'PATH=C:\;C:\DOS;D:\TP',0 ;Переменная PATH db 'PROMPT=$p$g',0 ;Переменная PROMPT db 0 ;Признак конца

В этом месте кончается стандартная часть окружения и начинается его расширенная часть (только для ДОС 3.0 и выше!).

dw 2 ;Количество переменных в расширенной части

db 'D:\MYDIR\SETFAG.EXE',0 ;Имя файла

db '/NOBAK',0 ;Параметр вызова

Перед передачей управления программе загрузчик копирует окружение в отдельную область памяти и помещает сегмент этой области в PSP (в слово со смещением 44 байта от начала PSP}.

В заключение следует сказать, что программы SetFag и Fag.asm не являются эталоном. Просто мне показалось, что такой способ организации защиты ЕХЕ— файлов будет достаточно удобным в использовании и эффективным в работе. Действительно, тестовые заражения программ специально разработанным вирусом, а также вирусом Yankee показали, что фаг успешно выполняет свои функции.

Защита программ от компьютерных вирусов 173

Поскольку программу Fag.asm без особого труда можно изменить, существует потенциальная опасность, что этот материал может быть использован для разработки вирусов. Я очень надеюсь, что к Вам, уважаемый читатель, это не относится.

 

 Глава 6

Оглавление

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz