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. работает следующим образом.