    9. АНОНС ВМЕСТО ЗАКЛЮЧЕНИЯ

         Второй номер компьютерного приложения к журналу
    Техника-молодежи продолжит тему защиты информации. В нем будут даны
    ответы на некоторые вопросы по вирусологии, возникающие у неискушенных
    пользователей, состоится знакомство с программами-отладчиками и
    детально описаны способы защиты исполняемых модулей от исследования:
      - вирусы и их функции;
      - отладчики: состояние, перспективы; как доработать имеющийся
    отладчик;
      - библиотека подпрограмм для защиты исполняемого кода от
    исследования;
      - распределенные программные модули; генерация исполняемого
    кода;
      - программный замок с псевдослучайным ключом;
      - DLOCK ver 3.0;
      - рекомендации по защите программ для ПЭВМ типа Enterprisse и
    Spectrum (Синклер);
      - квалификационная тест-программа.
      Дискета, как всегда, содержит исполняемые модули и исходные тексты
    программ на Ассемблере, Си, Бейсике.

         Подписаться на оптовую поставку компьютерного приложения можно в
    редакции журнала Техника-молодежи (125015, Москва, Новодмитровская
    ул., д. 5а, тел. 285-16-87, 285-89-80), приобрести единичные
    экземпляры - там же или у наших диллеров (у которых Вы купили первый
    выпуск).

                                            Приложение 1

                   СЛОВАРЬ ТЕРМИНОВ

    Аномалии МП - специфические особенности выполнения некоторых команд
                микропроцессора.

    Байт - единица информации, в системе MS DOS байт может принимать
                значения кодов от 0 до 255, 2 байта составляют машинное
                слово (значение от 0 до 65536).

    Блок (подпрограмма, процедура) - часть программы (хранящаяся на диске
                внутри .EXE файла), имеющая собственный набор команд и
                данных, и предназначенная для выполнения некоторых
                действий с последующей передачей управления тому блоку
                основной программы программы, который ее вызвал.

    Дизассемблер - программа, позволяющая получить текст других программ
                на языке ассемблер.

    Дисперсия - мера рассеяния значений случайной величины около ее
                математического ожидания.

    Драйвер - (англ. водитель) резидентная программа, постоянно
                находящаяся в оперативной памяти и активизирующаяся от
                соответствующего прерывания, обработка которого за ней
                закреплена. В отличие от других резидентных программ,
                драйвер, как правило, создается для сопровождения одного
                устройства или поддержки одной программы, формируя
                необходимую для их нормальной работы среду в оперативной
                памяти.

    Заголовок
    EXE-файла - начальная часть файла, в которой, в частности, содержится
                информация о стартовом значении регистров МП, размере
                всего файла, таблица перемещения и т.д.

    Защитный
    механизм - часть исполняемого модуля, реализующая защитные функций:
                идентификацию пользователя, компьютера, магнитного
                носителя, защиту программы от исследования и т.п.

    Идентификация - сопоставление предъявленных характеристик с
                эталонными.

    Исполняемый
    модуль - программа или ее законченная часть (хранящаяся на диске
                отдельно), имеющая набор команд и данных, имя и
                предназначенная для загрузки в оперативную память ПЭВМ с
                последующуй передачей ему управления.

    Исходный
    текст (исходник) - текст программы на одном из языков программирования
                и введенный в ПЭВМ непосредственно программистом (до
                какой-либо обработки его компьютером).

    Кластер - минимальная единица дисковой памяти, выделяемая DOS-ом для
                хранения файла.

    Ключевая
    фраза - (она же - парольная) последовательность символов, вводимая
                пользователем с клавиатуры для его идентификации.

    Конвейер шины
    данных - аппаратно реализованная память ПЭВМ (обычно 4 - 6 байт),
                предназначенная для хранения очереди процессорных команд,
                ожидающих выполнения.

    Контроллер - аппаратное устройство, реализующее обмен информации между
                ПЭВМ и периферийным оборудованием.

    Контрольная
    точка - команда, после или до выполнения которой может быть
                зафиксировано состояние вычислительного процесса.

    Листинг - текст программы написанный на одном из языков
                программирования, в котором, как правило, указана
                информация по выделенным для программы ресурсам компьютера
                (распределение памяти и др.) и приведены коды команд. В
                отличие от исходных текстов, которые вводит программист,
                листинг конечный продукт специальных программ
                (трансляторов, компиляторов, дизассемблеров и т.д.).

    Математическое
    ожидание - характеристика случайной величины, ее определение связано с
                понятием о среднем значении множества (область центра
                математического множества).

    МП         - микропроцессор.

    НСК        - несанкционированное копирование.

    НСД        - несанкционированный доступ.

    Отладчик - программа, позволяющая исследовать процесс выполнения
                других программ.

    ПО         - программное обеспечение.

    Пошаговый
    режим - процесс выполнения программы по одной команде. После
                выполнения каждого шага управление возвращается программе,
                осуществляющей пошаговый режим (для возможности просмотра
                состояния ОЗУ и содержимого регистров МП).

    Прерывание - программно или аппаратно инициированная передача
                управления по адресу, который находится в таблице векторов
                прерываний:
    - аппаратное - инициируется контроллерами периферийного оборудования;
    - программное - инициируется программой;
    - трассировочное - аппаратное прерывание по вектору 1, выполняемое
                после каждой команды процессора, если флаг трассировки TF
                слова состояния процессора установлен;
    - 21h - программное прерывание по вектору 21h, реализующее все
                основные функции DOS (файловые операции, управление
                памятью, справочная информация и т.д.);
    - 13h - программное прерывание по вектору 13h, реализующее все
                основные операции по работе с диском;
    - функции - выполняемые тем или иным прерыванием в зависимости от
                значений входных аргументов.

    Пристыкованный
    блок - блок программы (модуль), который работает только один раз, как
                правило, сразу после запуска программы, и после передачи
                управления основной задаче (к которой он пристыкован) в
                дальнейшем вычислительном процессе не участвует.

    Псевдослучайная
    последовательность - последовательность чисел, подчиняющаяся
                заданному закону распределения.

    Резидентная
    программа - программа, постоянно находящаяся в оперативной памяти и
                активизирующаяся от соответствующего прерывания, обработка
                которого за ней закреплена.

    Самомодифицирующийся
    модуль - исполняемый блок программы, изменяющий собственные команды в
                процессе выполнения.

    Сегмент - страница оперативной памяти (блок ОЗУ), отведенная либо для
                кодов программы (кодовый сегмент), либо под стек
                (стековый), либо под данные (сегмент данных).

    Сегментные:
    регистры - аппаратные регистры микропроцессора, предназначенные для
                хранения адресов соответствующих сегментов: CS - кодового,
                DS - данных, SS - стека;
    пересылки  - пересылки данных из сегмента в сегмент, в которых
                участвуют сегментные регистры.

    Стек - часть оперативной памяти, выделяемая программе для хранения
                промежуточных результатов вычислений и данных.

    Таблица
    перемещения - часть заголовка EXE-файла, содержащая адреса команд и
                данных в его теле, относительно начала файла на диске.
                После выделения DOS-ом свободных сегментов для загрузки в
                ОЗУ, операционная система, пользуясь таблицей перемещений,
                пересчитает относительные адреса на абсолютные (те, на
                которых программа реально будет располагаться в
                оперативной памяти).

    Точка останова - адрес команды, перед выполнением которой управление
                передается отладчику.

    Трассировка - процесс пошагового выполнения программы под отладчиком.

    Утилита - программа, дополняющая операционную систему,
                выполняющая одну из функций обслуживания
                компьютера или его периферии.

    Элемент
    оглавления - структура, описывающая дисковый файл.

    Эмулятор - устройство (программа), позволяющее анализировать
                результаты выполнения каждой команды исследуемой программы
                без реальной передачи ей управления.

    BIOS - Base Input Output System (базовая система ввода/вывода).

    CMOS - энергонезависимая память ПЭВМ, имеет встроенные часы реального
                времени с календарем, содержит информацию о конфигурации
                машины.

    COM-файл - исполняемый модуль, содержащий только бинарный образ задачи
                без какой-либо управляющей информации; этот тип программ
                всегда загружается в ОЗУ по одним и тем же адресам
                (указанным при написании программы), величина COM-файла не
                может превышать размер одного сегмента (64 КБ).

    EXE-файл - программный файл (коды модуля, программы), хранящийся на
                диске, имеющий заголовок и таблицу перемещения. После
                загрузки модуля в оперативную память, DOS вводит в
                регистры МП начальные значения (из заголовка) и
                настраивает программу на выделенные сегменты памяти.

    FAT - системная таблица диска, указывающая физическое раположение
                файлов и свободную область на диске.

    SP (указатель
    вершины стека) - аппаратный регистр МП, содержащий смещение текущего
                адреса стека относительно начала стекового сегмента (адрес
                в регистре SS).

                           ДОРОГИЕ ДРУЗЬЯ !

       Предлагаем вашему вниманию набор информационных материалов:

       2BART1  - КАК СОЗДАТЬ TSR БЕЗ PSP;
       2BART2  - НЕСКОЛЬКО СЛОВ О ВИДЕОАДАПТЕРАХ;
       2BCOPY1 - КАК СКОПИРОВАТЬ ЗАЩИЩЕННУЮ ОТ КОПИРОВАНИЯ ДИСКЕТУ;

       Материалы подготовлены в формате для непосредственной печати
    на любом устройстве.

       Статьи  2BART1,   2BART2  предназначены  для  программистов.
    Статья 2BCOPY1 возможно будет  интересна как для программистов,
    так и для пользователей ПЭВМ.

                        НЕСКОЛЬКО СЛОВ ОБ АВТОРАХ.

       Материалы подготовлены группой авторов, которые назвали себя
    2B  PROGRAMMERS   GROUP.  Мы   все  в   прошлом   работали   на
    госпредприятии, а  теперь в  совместном предприятии  ДИАЛОГ в
    отделе экспертизы  и сертификации  программного обеспечения.  В
    состав   группы    входят   высококвалифицированные   системные
    программисты,    занимавшиеся    разработкой    и    доработкой
    операционных  систем   для  ЕС   ЭВМ.  В   настоящее  время  мы
    специализируемся в  области систем  компьютерной  безопасности,
    систем  защиты   от  копирования   и  разработки   программного
    обеспечения для различного оборудования ПЭВМ.

                            КАК HАЙТИ АВТОРОВ

       Телефон:   095-329-4611
       Телефакс:  095-329-4711
       E-mail:    Vlad_Seregin, 2:5020/6 @FidoNet (JVD1BBS, 095-329-2192)

       Адpес:     г. Москва, ул. Ягодная, 17
                  Отдел Экспеpтизы и Сеpтификации.

                                                                1

                                        ГРУППА ПРОГРАММИСТОВ 2B.

               СПОСОБ СОЗДАНИЯ TSR ПРОГРАММ БЕЗ PSP.

         В  данной   статье  рассматривается  способ  построения
    резидентных программ  - TSR  (Terminate and  Stay Resident),
    позволяющий  использовать   область  PSP   (Program  Segment
    Prefix) для размещения резидентного кода программы.

                       НЕСКОЛЬКО СЛОВ О TSR.

         При разработке  TSR -  программ стандартными средствами
    DOS  в   памяти  после  завершения  программы  остается  PSP
    размером 256  байт или  по  крайней  мере  его  часть,  если
    программа использует  область FCB  (File  Control  Block)  и
    параметров для собственных нужд. Мы расскажем Вам о способе,
    позволяющем полностью  использовать область  PSP в интересах
    резидентной программы  и приведем  пример  такой  программы.
    Данный способ  был разработан  авторами в  начале 1989 года,
    когда  потребовалось   загрузить  много   крохотных  TSR   -
    программ, размер которых не превышал PSP.

            КОЕ ЧТО О НЕДОКУМЕНТИРОВАННЫХ ФУНКЦИЯХ DOS.

         Для  понимания   механизма  разработки   TSR  без   PSP
    необходимо ознакомиться  с  некоторыми  недокументированными
    функциями DOS  и с  форматами PSP  и MCB  -  Memory  Control
    Block.

                   PSP - PROGRAM SEGMENT PREFIX.

         PSP всегда  строится DOS  при запуске любой программы и
    непосредственно предшествует  началу  программы.  Рассмотрим
    формат PSP.

    СМЕЩЕНИЕ   РАЗМЕР    ОПИСАНИЕ

    00h        2 БАЙТА   содержит команду INT 20h, которая
                          используется для завершения программы
    02h        СЛОВО     сегментный адрес свободной памяти,
                         следующей, за памятью, выделенной
                         программе. Это может быть либо адрес за
                         памятью DOS (например, A000h), либо
                         адрес следующего доступного MCB.
    04h        БАЙТ      резерв.
    05h        5 БАЙТ    длинный вызов диспетчера функций DOS.
                         Содержит команду длинного перехода к
                         диспетчеру функций DOS. Используется в
                         программах, ориентированных на CP/M.
                         Смещение в команде длинного перехода
                         содержит количество байтов, доступных в
                         сегменте кода программы.

                                                                2

    0Ah        ДВ.СЛОВО  копия вектора прерывания 22h, по
                         которому управление передается для
                         завершения программы.
    0Eh        ДВ.СЛОВО  копия вектора прерывания 23h, по
                         которому управление передается при
                         нажатии CONTROL-BREAK или CONTROL-C.
    12h        ДВ.СЛОВО  копия вектора прерывания 24h, по
                         которому управление передается при
                         обнаружении критической ошибки.
    16h        СЛОВО     сегментный адрес PSP родительского
                         процесса (адрес текущего PSP для
                         процесса, у которого нет родителя).
    18h        20 БАЙТ   FILE HANDLE TABLE. Содержит 20
                         однобайтовых индексов для системной
                         таблицы файлов. Первые пять входов
                         предназначены для STDIN, STDOUT,STDERR,
                         AUXIO и LSTOUT.
    2Ch        СЛОВО     сегментный адрес блока среды для
                         процесса.
    2Eh        ДВ.СЛОВО  область сохранения указателя стека
                         процесса, когда процесс использует стек
                         DOS (т.е. содержимое SS:SP перед
                         последним подключением функции DOS с
                         помощью INT 21h).
    32h        СЛОВО     максимальное количество входов в FILE
                         HANDLE TABLE (по умолчанию 20).
    34h        ДВ.СЛОВО  адрес FILE HANDLE TABLE (стандартно
                         указывает на таблицу в текущем PSP).
    38h        24 БАЙТА  резерв.
    50h        3 БАЙТА   команда INT 21h, за которой следует
                         команда far RET. Используется для
                         вызова диспетчера функций DOS.
    53h        2 БАЙТА   резерв.
    55h        7 БАЙТ    расширение первого FCB.
    5Ch        16 БАЙТ   начальные байты первого неоткрытого
                         FCB. Открытие данного FCB приведет к
                         разрушению второго FCB и байта с длиной
                         командной строки.
    6Ch        16 БАЙТ   начальные байты второго неоткрытого
                         FCB. Открытие данного FCB приведет к
                         разрушению командной строки.
    7ch        ДВ.СЛОВО  резерв.
    80h        128 БАЙТ  область DTA (Data Transfer Area) по
                         умолчанию. Перекрывает байт с длиной
                         командной строки и буфер командной
                         строки (127 байтов).

         Размер блока - 256 байт.

                                                                3

                    MCB - MEMORY CONTROL BLOCK.

         MCB   является    блоком   DOS    описывающим    каждый
    распределенный  участок   памяти.  Как  правило  MCB  всегда
    строится перед  PSP исполняемой программы. Рассмотрим формат
    MCB.

    СМЕЩЕНИЕ   РАЗМЕР    ОПИСАНИЕ

    00h        БАЙТ      тип блока:
                         'M' (4Dh) - промежуточный блок;
                         'Z' (5Ah) - последний блок.
    01h        СЛОВО     сегмент владельца блока, 0 - свободный
                         блок.
    03h        СЛОВО     количество параграфов в блоке.
    05h        11 БАЙТ   резерв.

         Размер блока - 16 байт.

                  НЕДОКУМЕНТИРОВАННЫЕ ФУНКЦИИ DOS.

         Рассмотрим  теперь   недокументированные  функции  DOS,
    которые используются для построения TSR без PSP.

                      УСТАНОВИТЬ ТЕКУЩИЙ PSP.

         Данная функция  указывает DOS,  что в качестве текущего
    следует использовать указанный PSP.

         ВХОДНЫЕ ПАРАМЕТРЫ:

         AH = 50h
         BX = сегментный адрес нового PSP.

                      СОЗДАТЬ ПОДЧИНЕННЫЙ PSP.

         Данная функция  требует от DOS создать подчиненный PSP.
    В отличии  от функции  26h данные  не копируются из текущего
    PSP, а строятся заново.

         ВХОДНЫЕ ПАРАМЕТРЫ:

         AH = 55h
         BX = сегментный адрес для построения нового PSP.
         SI = значение, которое требуется установить в поле со
              смещением 2 в новом PSP.

                                                                4

             ПРОЦЕСС ЗАВЕРШЕНИЯ РЕЗИДЕНТНОЙ ПРОГРАММЫ.

         Сущность  завершения   резидентной  программы  без  PSP
    состоит в  создании нового  PSP и  указании DOS использовать
    этот  PSP   в  качестве   активного.  При   этом  сам  текст
    резидентной части перемещается на начало старого PSP.

         Рассмотрим последовательность  действий при  завершении
    программы.

         1. Освободить  ENVIRONMENT, адрес  которого находится в
    PSP по  смещению 2Ch. Вообще говоря, это действие не связано
    с собственно  процессом завершения резидентной программы без
    PSP  и   рекомендуется   для   любого   способа   завершения
    резидентных программ.
         2. Изменить  размер  памяти,  используемый  программой,
    указав в  качестве нового  размера длину  резидентной  части
    программы в  параграфах, а  в качестве адреса модифицируемой
    памяти -  сегментный адрес  PSP. Для выполнения используется
    функция DOS  4Ah. Если резидентная часть начинается с начала
    программы,  то   ее  следует  сначала  сохранить,  т.к.  при
    освобождении памяти  в теле  программы будет  построен новый
    MCB. Также  целесообразно зарезервировать  после резидентной
    части участок  длиной 16  байт для  MCB,  чтобы  последующие
    действия не уничтожили дальнейший код программы.
         3. Вычисляется  сегментный адрес  для построения нового
    PSP    по     формуле    <длина    резидентной    части    в
    параграфах>+<сегментный адрес  старого PSP>+1  (размер MCB в
    параграфах).
         4.  Строится  новый  PSP  по  вычисленному  сегментному
    адресу с  использованием функции 55h. В качестве значения SI
    берется поле со смещением 2 в старом PSP.
         5. Корректируется  адрес родительского  PSP в новом PSP
    по смещению  16h. Значение  выбирается из  поля с  таким  же
    смещением из старого PSP.
         6. Новый  PSP указывается  DOS в  качестве  текущего  с
    использованием функции 50h.
         7. Корректируется  указатель на  собственника памяти  в
    новом MCB  по смещению  01h. MCB  расположен по  сегментному
    адресу  равному   сегменту  нового  PSP  минус  1.  Значение
    указателя устанавливается  равным сегментному  адресу нового
    PSP.
         8. Резидентная  часть программы  пересылается по адресу
    сегмента старого PSP со смещением 0.
         9.  Выполняются   необходимые  действия  для  настройки
    резидентной части. Их можно также выполнить заранее.
         10. Программа  завершается обычным  образом по  функции
    DOS 04Ch.

                                                                5

         Схематически этот метод изображен на 3-х рисунках.

         Рисунок 1  показывает изменение в расположении блоков в
    памяти при выполнении функции DOS 4Ah.

    ЪДДВДДДДДДДДДДДДДДДї                    ЪДДВДДДДДДДДДДДДДДДї
    і  і               і                    і  і               і
    і  і      MCB      і  Ъ>    На PSP   <ї і  і      MCB      і
    і  і               і  і    родителя   і і  і               і
    і  ГДДДДДДДДДДДДДДДґ  і               і і  ГДДДДДДДДДДДДДДДґ
    АД>і    текущий    ГДДЩ               і АД>і    текущий    і
       і      PSP      і                  АДДДДґ      PSP      і
       ГДДДДДДДДДДДДДДДґ                       ГДДДДДДДДДДДДДДДі
       і               і       Выполнение      і  ПРОГРАММА    і
       і               і        функции        ГДДДДДДДДДДДДДДДґ
       і               і          DOS          і     новый     і
       і               і          4Ah          і      MCB      і
       і               і                       і   свободный   і
       і   ПРОГРАММА   і                       ГДДДДДДДДДДДДДДДґ
       і               і                       і               і
       і               і                       і   ПРОГРАММА   і
       АДДДДДДДДДДДДДДДЩ                       АДДДДДДДДДДДДДДДЩ

                              Рис. 1.

         Рисунок 2  показывает изменение в расположении блоков в
    памяти после  выполнения функции  DOS 55h  и  при  коррекции
    указателей.

                    Выполнение функции DOS 55h.

    ЪДДВДДДДДДДДДДДДДДДї                    ЪДДВДДДДДДДДДДДДДДДї
    і  і               і Ъ>    На PSP       і  і               і
    і  і      MCB      і і    родителя      і  і      MCB      і
    і  і               і і                  і  і               і
    і  ГДДДДДДДДДДДДДДДґ і                  і  ГДДДДДДДДДДДДДДДґ
    АД>і    текущий    ГДЩ                  АД>і    текущий    і
       і      PSP      і<ДДї                   і      PSP      і
       і               і   і                   і               і
       ГДДДДДДДДДДДДДДДі   і                   ГДДДДДДДДДДДДДДДі
       і  ПРОГРАММА    і   і                   і  ПРОГРАММА    і
       ГДДДДДДДДДДДДДДДґ   і                ЪДДЕДДДДДДДДДДДДДДДґ
       і     новый     і   і   Коррекция    і  і     новый     і
       і      MCB      і   і   указателей   і  і      MCB      і
       і   свободный   і   і                і  і   распределен і
       ГДДДДДДДДДДДДДДДґ   і                і  ГДДДДДДДДДДДДДДДґ
       і     новый     ГДДДЩ                АД>і     новый     і
       і      PSP      і          На PSP  <ДДДДґ      PSP      і
       ГДДДДДДДДДДДДДДДґ          родителя     ГДДДДДДДДДДДДДДДґ
       і   ПРОГРАММА   і                       і   ПРОГРАММА   і
       АДДДДДДДДДДДДДДДЩ                       АДДДДДДДДДДДДДДДЩ

                              Рис. 2.

                                                                6

         Рисунок 3  показывает изменение в расположении блоков в
    памяти после выполнения функции DOS 50h.

                    Выполнение функции DOS 50h.

    ЪДДВДДДДДДДДДДДДДДДї
    і  і               і
    і  і      MCB      і
    і  і               і
    і  ГДДДДДДДДДДДДДДДґДДДДї
    АД>і    старый     і    і
       і      PSP      і    ГДДДД> Вся эта область доступна TSR.
       ГДДДДДДДДДДДДДДДґ    і
       і  ПРОГРАММА    і    і
    ЪДДЕДДДДДДДДДДДДДДДґДДДДЩ
    і  і     новый     і
    і  і      MCB      і
    і  і  распределен  і
    і  ГДДДДДДДДДДДДДДДґ
    АД>і    текущий    ГДДДДДДДД> На PSP родителя.
       і      PSP      і
       ГДДДДДДДДДДДДДДДґ
       і   ПРОГРАММА   і
       АДДДДДДДДДДДДДДДЩ

                              Рис. 3.

                           СОВМЕСТИМОСТЬ.

         Данный  метод   опробован   в   различных   совместимых
    операционных средах:

         - MS/PC DOS 3.30;
         - MS/PC DOS 4;
         - MS DOS 5 beta release;
         - DR DOS 3.41;
         - DR DOS 5;
         - с  использованием загрузчика  LOADHI от  системы QEMM
    5.0;
         - с  использованием загрузки в старшую память HILOAD DR
    DOS 5.

                                                                7

               ПРИМЕР РЕЗИДЕНТНОЙ ПРОГРАММЫ БЕЗ PSP.

         Для лучшего  понимания порядка  завершения  резидентной
    программы без PSP приведем пример.

            page    60,132
            title   NONPSP - Резидентная программа без PSP
    ;==========================================================
    ;
    ;    Пример построения резидентной программы без PSP
    ;
    ;    Авторские права ГРУППЫ ПРОГРАММИСТОВ 2B
    ;
    ;    Язык программирования: Ассемблер
    ;    Транслятор           : MASM
    ;
    ;===========================================================
    ;
    ; сообщить транслятору адресацию
    ;
            assume  cs:code,ds:code,es:nothing
    ;
    ;  определить сегмент кода
    ;
    code    segment para
    ;
            subttl  Резидентная часть программы
    ;
    ResStart label  byte            ;определим начало программы

                      Текст резидентной части.

    ResEnd  label   byte            ;конец резидентной части
    ResLen  equ     ResEnd-ResStart ;размер резидентной части в
                                    ; байтах
    ResSize equ     (ResEnd-ResStart+15)/16 ;размер резидентной
                                            ; части в параграфах
            org     ResStart+ResSize*16     ;для выравнивания на
                                            ; границу параграфа
    ;
            page
            subttl  Инициализация резидентной программы без PSP
    ;
    MCBLen  equ     10h                     ;размер MCB
    ;
    PSPMCB  db      MCBlen dup (0)  ;резервная область для MCB
    SavRes  db      ResLen dup (0)  ;область сохранения
                                    ; резидентной части
    ;
    PspOld  dw      0               ;для адреса старого PSP
    PspNew  dw      0               ;для адреса нового  PSP

                                                                8

    ;
    ;  сообщения
    ;
    MsgInst label   byte
            db      0ah,0dh
            db      'Программа установлена'
            db      0ah,0dh
            db      '$'
    MsgNoInst label   byte
            db      0ah,0dh
            db      'Ошибка. Программа не установлена'
            db      0ah,0dh
            db      '$'
    ;=========================================================
    ;
    ;  процедура инициализации резидентной программы без PSP
    ;
    ;=========================================================
    ini     proc    far
    ;
            cld                             ;для операций
                                            пересылки
            mov     cs:PspOld,ds            ;сохраним старый PSP
    ;
    ;       Освобождение environment
    ;
            mov     ax,ds:[2ch]             ;адрес сегмента
            mov     es,ax                   ;       environment
            cmp     ax,0                    ;есть environment ?
            je      Go1                     ; нет
            mov     ah,49h                  ;код функции
            int     21h                     ;   освободить
                                            ; память
            jnc     Go1                     ;успешно
            jmp     ErrorRet                ;неуспешно
    Go1:
            mov     word ptr ds:[2ch],0     ;укажем, что нет
                                            ; environment
            push    cs                      ;установим
            pop     es                      ;    ES
            push    cs                      ;установим
            pop     ds                      ;    DS
    ;
    ; запомним резидентную часть
    ; т.к. она будет разрушена при построении новых PSP и MCB
    ;
            mov     si,Offset ResStart      ;откуда
            mov     di,Offset SavRes        ;куда
            mov     cx,ResLen               ;сколько
        rep movsb                           ;перешлем

                                                                9

    ;
    ; модифицируем размер памяти текущей программы от сегмента
    ; PSP на длину резидентной части
    ; это приведет к построению нового MCB в теле программы
    ;
            mov     ah,4ah                  ;модифицируем память
            mov     bx,ResSize              ;размер резидентной
                                            ; части
            mov     es,PspOld               ;сегмент старого PSP
            int     21h                     ;выполним
            jnc     Go2                     ;успешно
            jmp     ErrorRet                ;неуспешно
    Go2:
    ;
    ; подсчитаем сегмент памяти для нового PSP
    ;
            mov     ax,ResSize              ;длина резидентной
                                            ; части в параграфах
            add     ax,PspOld               ; плюс сегмент
                                            ; старого PSP
            add     ax,MCBLen/16            ; плюс длина MCB
            mov     PspNew,ax               ;запомним сегмент
                                            ; для нового PSP
    ;
    ; создадим новый PSP
    ;
            mov     es,PspOld               ;адрес старого PSP
            mov     si,word ptr es:[02h]    ; конец памяти
            mov     ah,55h                  ;построим
                                            ; подчиненный PSP
            mov     dx,PspNew               ;сегмент нового PSP
            int     21h                     ;выполним
    ;
    ; скорректируем указатель на родительский PSP в новом PSP
    ;
            mov     es,PspOld               ;сегмент старого PSP
            mov     ax,word ptr es:[16h]    ;адрес родительского
                                            ; PSP
            mov     es,PspNew               ;сегмент нового PSP
            mov     word ptr es:[16h],ax    ;скорректируем
    ;
    ; сообщим DOS о новом активном PSP
    ;
            mov     bx,PspNew               ;сегмент нового PSP
            mov     ah,50h                  ;функция указания
                                            ; нового PSP
            int     21h                     ; выполним

                                                                10

    ;
    ; укажем принадлежность полученной памяти для нового PSP
    ;
            mov     ax,bx                   ;сегмент нового PSP
            sub     ax,1                    ;сегмент
                                            ; построенного MCB
            mov     es,ax                   ;==================
            mov     word ptr es:[01h],bx    ;скорректируем адрес
                                            ; владельца памяти
    ;
    ; переместим резидентную часть на старый PSP
    ;
            mov     es,PspOld               ;адрес старого PSP
            mov     cx,ResLen               ;размер резидентной
                                            ; части
            mov     di,0                    ;куда
            mov     si,Offset SavRes        ;откуда
        rep movsb                           ;переместим
            push    cs                      ;восстановим
            pop     es                      ;    ES
    ;
    ;       Успешный выход из программы
    ;
    PrgEnd:
            mov     ah,09h                  ; выведем сообщение
            mov     dx,offset MsgInst       ;       об успешной
                                            ; установке
            int     21h                     ;
            mov     ax,4c00h                ;завершим программу
            int     21h                     ;       обычным
                                            ; образом с кодом 0
    ;
    ; Выход из программы по ошибке
    ;
    ErrorRet:
            push    cs                      ;установим адресацию
            pop     ds                      ;       данных
            mov     ah,09h                  ; выведем сообщение
            mov     dx,offset MsgNoInst     ;       о неуспешной
                                            ; установке
            int     21h                     ;
            mov     ax,4c04h                ;завершим программу
            int     21h                     ;       обычным
                                            ; образом с кодом 4
    ini     endp
    ;
    code    ends
    ;
    ; СТЕК
    ;
    stack   segment stack
            dw      512 dup(0)
    stack   ends
            end     ini

                                                               1

                                        ГРУППА ПРОГРАММИСТОВ 2B.

                  НЕСКОЛЬКО СЛОВ О ВИДЕОАДАПТЕРАХ.

         В  данной  статье  рассматриваются  особенности  работы
    резидентных программ  (например драйверов  русского языка) с
    основным и  альтернативным видеоадаптером, описывается метод
    идентификации основного и альтернативного видеоадаптера.

         ЧТО ТАКОЕ ОСНОВНОЙ И АЛЬТЕРНАТИВНЫЙ ВИДЕОАДАПТЕР.

         Обычно на  ПЭВМ мы  работаем только с одним дисплеем и,
    соответственно, с  одним видеоадаптером.  Однако  аппаратура
    ПЭВМ  допускает   стандартное  подключение   дополнительного
    видеоадаптера и  дисплея. Такой  дополнительный видеоадаптер
    называется  альтернативным.   При  этом  не  следует  путать
    альтернативные      видеоадаптеры      с      нестандартными
    видеоадаптерами.    Первые    поддерживаются    стандартными
    средствами   BIOS,    а   вторые   используются   различными
    программами  (САПР   или  издательские  системы)  с  помощью
    нестандартных  программных   средств.   Иначе   говоря,   на
    стандартно подключенный  видеоадаптер всегда можно перевести
    вывод всех  сообщений DOS  и программ,  которые  для  вывода
    используют средства BIOS.
         Не всякие  виды видеоадаптеров  могут  быть  подключены
    одновременно к  ПЭВМ. В таблице 1 рассматриваются допустимые
    сочетания видеоадаптеров.

                                                               2

                     СОЧЕТАНИЯ ВИДЕОАДАПТЕРОВ.

                                                      Таблица 1.

    ЪДДДДДДДДДДДДДДВДДДВДДДВДДДВДДДДВДДДВДДДВДДДДВДДДДДДДДДДДДДї
    і Видеоадаптер іMDAіCGAіEGAіMCGAіVGAіHGCіHGC+іHGC In Color і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іMDA           і - і + і + і +  і + і - і  - і      -      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іCGA           і + і - і + і  - і + і + і  + і      +      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іEGA           і + і + і - і  - і - і + і  + і      +      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іMCGA          і + і - і - і  - і + і + і  + і      +      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іVGA           і + і + і - і  + і - і + і  + і      +      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іHGC           і - і + і + і  + і + і - і  - і      -      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іHGC+          і - і + і + і  + і + і - і  - і      -      і
    ГДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДґ
    іHGC In Color  і - і + і + і  + і + і - і  - і      -      і
    АДДДДДДДДДДДДДДБДДДБДДДБДДДБДДДДБДДДБДДДБДДДДБДДДДДДДДДДДДДЩ

         Следует отметить,  что к  ПЭВМ не может быть подключено
    два видеоадаптера,  работающие одновременно  в  цветном  или
    монохромном  режиме.   Если  один  видеоадаптер  работает  в
    цветном режиме,  то другой  должен  работать  в  монохромном
    режиме.
         Рассмотрим  теперь   особенности  определения  текущего
    видеоадаптера при работе резидентной программы.

                         ВИДЕОАДАПТЕР EGA.

         Для определения активности видеоадаптера EGA достаточно
    проверить бит активности EGA адаптера в области данных BIOS.
         Признак активности  видеоадаптера расположен  в поле по
    адресу 40h:87h.  Если установлен  флажок 08h, то это значит,
    что в  текущий момент  видеоадаптер EGA  не активен, поэтому
    следует  организовывать   работу  с  учетом  альтернативного
    видеоадаптера.  Приведем   фрагмент  кода   для  определения
    активности видеоадаптера EGA.

            mov     ax,40h                  ;адресация данных
            mov     es,ax                   ;    BIOS
            test    byte ptr es:[87h],08h   ;EGA активен ?
            jz      EgaAct                  ;EGA активен
            jmp     NonEga                  ;EGA не активен

         Следует отметить,  что среди  обилия видеоадаптеров EGA
    существуют     видеоадаптеры,     позволяющие     программно
    переключаться в  режим совместимости MDA и HGC. При этом они
    зачастую корректируют  адрес обработчика  INT 10h.  Поэтому,
    перед проверкой активности видеоадаптера EGA, мы рекомендуем

                                                               3

    убедиться, что  EGA до сих пор существует на вашей ПЭВМ. Это
    можно сделать путем считывания переключателей EGA по функции
    INT  10h,   AH=12h,  BL=10h.  Приведем  фрагмент  кода,  для
    выполнения этой функции.

            mov     ah,12h                  ;запрос
            mov     bl,10h                  ; переключателей
            int     10h                     ; вызвать INT 10h
            cmp     bl,10h                  ;функция выполнена ?
            je      NonEga                  ; EGA не активен
            jmp     EgaAct                  ; EGA активен

                      ВИДЕОАДАПТЕРЫ VGA/MCGA.

         Видеоадаптеры   VGA    и   MCGA   являются   поколением
    видеоадаптеров, анонсированных  в ПЭВМ  PS/2  фирмы  IBM.  В
    настоящее время существует большое количество видеоадаптеров
    VGA.   Среди    них   есть   видеоадаптеры,   поддерживающие
    расширенные графические и текстовые режимы.
         Чтобы  определить   активность  видеоадаптера  VGA/MCGA
    достаточно выполнить функцию INT 10h, AX=1A00h. Если функция
    обеспечена, то  в регистре  AL будет  значение 1Ah.  В  этом
    случае в регистре BL Вы получите код основного, а в регистре
    BH -  код альтернативного  дисплея в текущий момент времени.
    Возможны следующие коды:

    00h - отсутствует;
    01h - монохром;
    02h - CGA;
    03h - резерв;
    04h - EGA с цветным дисплеем;
    05h - EGA с монохромным дисплеем;
    06h - PGC с цветным дисплеем;
    07h - VGA с монохромным дисплеем;
    08h - VGA с цветным дисплеем;
    09h - 0Ah - резерв;
    0Bh - MCGA с монохромным дисплеем;
    0Ch - MCGA с цветным дисплеем;
    0Dh - FEh - резерв;
    -1  - неизвестен.

         Таким    образом    процесс    определения    активного
    видеоадаптера для  ПЭВМ, оборудованных  видеоадаптерами VGA,
    не представляет особых проблем.

                                                               4

         Приведем   фрагмент   кода,   определяющий   активность
    видеоадаптера VGA/MCGA.

            mov     ax,1a00h        ;спросим код дисплея
            int     10h             ;выполним
            cmp     al,1ah          ;подсистема активна ?
            jne     NonSubst        ;нет, возможно переключение
                                    ; в режим другого
                                    ; видеоадаптера или
                                    ; подсистема остутствует
            cmp     bl,07h          ;VGA ?
            je      VgaAct          ; да
            cmp     bl,08h          ;VGA ?
            je      VgaAct          ; да
            cmp     bl,0bh          ;MCGA ?
            je      MCGAct          ; да
            cmp     bl,0ch          ;MCGA ?
            je      MCGAct          ; да
            jmp     NonSubst        ; не найден VGA/MCGA

         Следует отметить,  что все  регистры видеоадаптера  VGA
    можно прочитать.  Таким образом  резидентная программа может
    определить режим  работы  видеоадаптера  -  графический  или
    текстовый. Это  может быть  полезно  для  программ,  которым
    требуется  сохранить   текущее  состояние  экрана,  или  для
    драйверов русского  языка, чтобы  определить режим  загрузки
    знакогенератора.  Знание   режима  видеоадаптера   позволяет
    драйверам русского  языка поддерживать старшие режимы работы
    нестандартных видеоадаптеров  VGA, не  привязываясь к номеру
    видеорежима. Определение текущего режима основано на анализе
    содержимого регистра  06h GRAFICS  CONTROLLER (Miscellaneous
    Register). Размер  буквы можно  узнать в области данных BIOS
    по адресу 40h:85h.
         Приведем фрагмент  кода для  определения режима  работы
    видеоадаптера VGA.

    ; прочитаем GC регистр 06h
            mov     dx,03ceh        ;адресный порт
            mov     al,06h          ;номер регистра
            out     dx,al           ;затребуем регистр
            jmp     short $+2
            inc     dx              ;порт данных
            in      al,dx           ;прочитаем регистр
    ; анализ типа знакогенератора
            test    al,01           ;графический режим ?
            jz      VgaTxt          ;текстовый режим
            jmp     VgaGraf         ;графический режим

                                                               5

        СПОСОБ ОПРЕДЕЛЕНИЯ ТИПА ОСНОВНОГО И АЛЬТЕРНАТИВНОГО
                           ВИДЕОАДАПТЕРА.

         В данном  разделе мы  расскажем  Вам,  как  определить,
    какие видеоадаптеры  установлены на ПЭВМ. Предлагаемый метод
    позволяет  идентифицировать  видеоадаптеры  MDA,  CGA,  EGA,
    MCGA, VGA,  HGC,  HGC+  и  HGC  In  Color  и  совместимые  с
    HERCULES, которые мы будем называть MGA.

               ПОРЯДОК ИДЕНТИФИКАЦИИ ВИДЕОАДАПТЕРОВ.

         Приведем  порядок,  в  котором  Вам  следует  выполнять
    идентификацию видеоадаптеров.

         1.  Проверить   наличие  видеоподсистемы   VGA/MCGA  по
    функции INT  10h, AX=1A00h.  Если подсистема активна, то код
    основного и  альтернативного видеоадаптера  будет передан  в
    регистрах BL и BH.
         2. Если  в шаге  1 обнаружен  монохромный  дисплей,  то
    следует удостовериться,  не является  ли он  адаптером  типа
    HERCULES. Метод  определения  видеоадаптеров  типа  HERCULES
    рассмотрим ниже.
         3.  Если  функция  шага  1  не  выполнена,  то  следует
    проверить наличие  видеоадаптера EGA  по  функции  INT  10h,
    AH=12h, BL=10h.
         4.  Если   видеоадаптер  EGA   обнаружен,  то   следует
    определить, работает  EGA в  цветном или монохромном режиме.
    Метод определения основан на анализе переключателей на плате
    EGA, полученных по функции INT 10h, AH=12h, BL=10h в младших
    четырех  битах   регистра  CL.   Комбинация   переключателей
    следующая:

    000X - обычный цветной дисплей;
    001X - цветной дисплей с расширенными возможностями;
    010X - монохромный терминал;
    011X - обычный цветной дисплей;
    100X - цветной дисплей с расширенными возможностями;
    101X - монохромный терминал.

         5. Если  видеоадаптер EGA работает в цветном режиме, то
    следует   проверить,    не   подключен    ли    видеоадаптер
    MDA/HERCULES.
         6. Если видеоадаптер EGA работает в монохромном режиме,
    то следует проверить, не подключен ли видеоадаптер CGA.
         8. Если  видеоадаптер  EGA  не  обнаружен,  то  следует
    проверить наличие видеоадаптеров MDA/HERCULES или CGA. Выбор
    текущего  видеоадаптера  при  одновременном  наличии  CGA  и
    MDA/HERCULES производится  на основе  анализа видеорежима  в
    области  данных  BIOS  по  адресу  40h:49h.  Видеорежим  07h
    указывает на активность видеоадаптера MDA/HERCULES.

                                                               6

                МЕТОД ОПРЕДЕЛЕНИЯ ВИДЕОАДАПТЕРА CGA.

         Видеоадаптер CGA  определяется путем  проверки  наличия
    6845 CHIP (CRT CONTROLLER) с индексным регистром 3D4h. Метод
    проверки наличия 6845 описан ниже.

           МЕТОД ОПРЕДЕЛЕНИЯ ВИДЕОАДАПТЕРА MDA/HERCULES.

         Проверка наличия  видеоадаптера  MDA  или  HERCULES,  а
    также подобных им адаптеров выполняется на основе следующего
    алгоритма.
         1. Проверяется  наличие 6845  CHIP (CRT  CONTROLLER)  с
    индексным регистром 3B4h.
         2. Считывается  содержимое порта 3BAh  (состояние CRTC)
    и проверяется,  изменяется ли  бит 7 этого порта (индицирует
    VERTICAL SYNC).  Если нет,  то видеоадаптер классифицируется
    как MDA.
         3. Адаптеры  фирмы HERCULES идентифицируются битами 4-6
    состояния CRTC:

    000 - HGC;
    001 - HGC+;
    101 - InColor Card).
    остальное - совместимый с HERCULES монохромный графичесий
    адаптер - MGA.

         Следует отметить,  что идентификация типа видеоадаптера
    фирмы HERCULES на базе бит 4-6 может быть недостоверна, т.к.
    многие   фирмы   разработчики   совместимых   видеоадаптеров
    неправильно устанавливают эти биты.
         Приведем фрагмент  кода, идентифицирующий видеоадаптеры
    MDA/HERCULES/MGA.

            mov     dx,3B4h         ; проверить наличие 6845
                                    ; CHIP.
            call    Test_6845       ; процедура проверки наличия
                                    ; 6845
                                    ; CF=1 - 6845 не найден
                                    ; CF=0 - 6845 найден
            jc      NonMdaHgc       ;6845 CHIP отсутствует.
                                    ;нет MDA/HERCULES/MGA.
            mov     dx,3BAh         ; считать регистр состояния
            in      al,dx           ; CRTC.
            and     al,80h          ; изолировать бит 7
                                    ; (VERTICAL SYNC).
            mov     ah,al           ; проверим, изменяется ли
                                    ; бит 7.
            mov     cx,8000h        ; количество повторов.
    TBIT7:  in      al,dx           ; регистр состояния CRTC
            and     al,80h          ; изолировать бит 7
                                    ; (VERTICAL SYNC).
            cmp     ah,al           ; сравним значения
            loope   TBIT7           ; повторим

                                                               7

            je      MDAFOUND        ; переход, если бит 7 не
                                    ; изменился. Только MDA
    ; определим тип адаптера HERCULES.
            in      al,dx           ; считать состояние CRTC.
            and     al,70h          ; изолировать биты 4-6.
            jz      HGCFOUND        ; переход, если это HGC.
            cmp     al,10h          ; это HGC+?
            je      HGCPFOUND       ; да, переход.
            cmp     al,50h          ; это InColor Card?
            je      HGCICFOUND      ; да, переход.
            jmp     MGAFOUND        ; адаптер, совместимый с
                                    ; HERCULES - MGA.

                МЕТОД ОПРЕДЕЛЕНИЯ НАЛИЧИЯ 6845 CHIP

         6845 CHIP  используется в  видеоадаптерах  MDA,  CGA  и
    HERCULES в  качестве CRT  CONTROLLER. Техника    определения
    наличия этой микросхемы заключается в том,  что в регистр 15
    CRT  CONTROLLER   (младший  байт   местоположения   курсора)
    записывается значение,  которое затем  считывается  обратно.
    Если возвращено  записанное значение,  то 6845  CHIP есть  в
    компьютере.
         Приведем  фрагмент  кода  для  определения  6845  CHIP.
    Считается, что  при входе  в программу  регистр DX  содержит
    адрес индексного регистра 6845 CHIP ( 3D4h/3B4h ).

            cli                     ; запретить прерывания.
            mov     al,15           ; подготовиться к работе с
                                    ; регистром 15 CRTC.
            out     dx,al           ; передать номер регистра
            jmp     short $+2
            inc     dx              ; регистр данных
            in      al,dx           ; считать текущее значение
                                    ; регистра 15.
            mov     ah,al           ; запомнить считанное
                                    ; значение
            mov     al,66h          ; записать в регистр 15
                                    ; тестовое значение.
            out     dx,al           ; передадим
            jmp     short $+2
            mov     cx,400h         ; дождаться, пока 6845 все
                                    ; это воспримет.
    W1:     loop    W1              ; ждем
            in      al,dx           ; считать тестовое значение.
            xchg    ah,al           ; восстановить
                                    ; первоначальное значение
                                    ; регистра 15.
            out     dx,al           ; передадим
            jmp     short $+2
            sti                     ; разрешить прерывания.
            cmp     ah,66h          ; считано тестовое значение?
            je      F6845           ; да, 6845 найден.
            jmp     NF6845          ; 6845 не найден

                                                               8

                          ОПЫТ ПРИМЕНЕНИЯ.

         Описанный  механизм  был,  в  частности,  применен  при
    разаработке универсального  драйвера русского  языка. Авторы
    стокнулись с  тем фактом,  что ни  один из  существоваших на
    этот момент драйверов не поддерживал работу с альтернативным
    видеоадаптером и  не обеспесчивал  расширенных  режимов  VGA
    видеоадаптера.  Любая   попытка  перейти  на  альтернативный
    видеоадаптер  приводила   к  срыву   синхронизации.   Авторы
    использовали комбинации  видеоадаптеров EGA/HGC  и  VGA/MGA.
    Разработанный авторами  драйвер поддерживает  все  описанные
    выше комбинации  видеоадаптеров. Он  может  запускаться  как
    драйвер  из   CONFIG.SYS  или   использоваться  как  обычная
    программа и запускаться, например, из AUTOEXEC.BAT.

                                                                          1

                                                   ГРУППА ПРОГРАММИСТОВ 2B.

              КАК СКОПИРОВАТЬ ЗАЩИЩЕННУЮ ОТ КОПИРОВАНИЯ ДИСКЕТУ.

         Статья посвящена анализу форматов защищенных от копирования дискет
    и возможным методам их копирования.

                    НЕСКОЛЬКО СЛОВ О ЗАЩИТЕ ОТ КОПИРОВАНИЯ.

         Системы  защиты   от   копирования   предотвращают   использование
    ворованных копий  программного обеспечения. Разработка таких систем в
    условиях нашей  страны, когда  огромные толпы  программистов  стремятся
    всячески  вскрыть   защищенные  программы,  является  делом  достаточно
    сложным и  требует определенной квалификации и опыта. В настоящее время
    на  рынке  программного  обеспечения  средств  защиты  появилось  много
    программ, обеспечивающих  защиту от  копирования. Зачастую реклама этих
    программ не  соответствует действительным  возможностям. Авторы  решили
    приобщиться к  когорте программистов,  вскрывающих  системы  защиты  от
    копирования. При  этом мы не хотим дискредитировать сами системы защиты
    от копирования,  а просто  хотим предостеречь  возможных покупателей от
    использования несовершенных  систем с  одной стороны,  а также привлечь
    новые отряды  высококвалифицированных программистов к разработке систем
    защиты, которые действительно всем нам очень нужны.
         В основном все программисты, занимающиеся вскрытием защит, идут по
    пути  преодоления   систем  защиты   от  отладчиков,   чтобы  выполнить
    модификацию  тех   частей  программы,   которые  отвечают  за  проверку
    легальности копии.  Эта работа  требует высокой  квалификации. Мы пошли
    несколько другим  путем. Система  защиты предполагает  наличие дискеты,
    называемой ключевой,  и не  копируемой стандартными средствами, а также
    специальными  программами   или   аппаратурой   для   копирования.   Мы
    исследовали  дискеты   систем  защиты   и  можем   предложить   способы
    копирования защищенных  дискет с  использованием подручных  программных
    средств. Вам  потребуется широко  распространенные  программы  COPYWRIT
    издания март 1987 и EXPLORER издания апрель 1987.

         Мы подвергли анализу несколько системы.

         JAWS версия 4.0 1989 год. Автор Малькович А.П.

         НОТА  версия   1.1  февраль   1990.  Автор   Стас  Ляшев.  Система
    распространяется СП НОВИНТЕХ.

         SHIELD (известна  также под  названиями ARMOUR,  БРОНЯ и ЩИТ). Под
    названием SHIELD распространяется кооперативом ЭЛИАС.

         Система защиты  ПП от  несанкционированного копирования (программа
    INST_FD) версия  2.1, май 1990. Производитель не известен. Известна под
    названием PROTECT.

                                                                          2

                                     JAWS.

         Система защиты  от копирования  JAWS утверждает,  что созданные ей
    дискеты  не   копируются  программой   COPYWRIT.  Это   утверждение  не
    соответствует действительности.  Автор программы  записывает  некоторую
    информацию на  0 поверхность  42 цилиндра.  Мы не  будем  рассказывать,
    какой именно  формат и как записывается на этот цилиндр, т.к. Вы можете
    запустить программу  COPYWRIT и, указав максимальный копируемый цилиндр
    42, получить  работоспособную копию  защищенной  дискеты.  Естественно,
    дискета легко копируется с помощью платы COPY II PC OPTION BOARD DELUXE
    (в дальнейшем  изложении будем  называть для  краткости  просто  OPTION
    BOARD), если вы укажете копирование до 42 цилиндра. При работе с платой
    достаточно сначала  скопировать дискету  обычной программой DISKCOPY, а
    затем с помощью платы скопировать 42 цилиндр.

                                     НОТА.

         Авторы этой  системы также  решили расположить информацию о защите
    на  инженерном   цилиндре.  В   отличие  от  системы  JAWS  они  решили
    использовать  41  цилиндр.  Однако  программа  COPYWRIT  также  успешно
    копирует эту  дискету.  Дискета  естественно  легко  копируется  платой
    OPTION BOARD.

                                    SHIELD.

         Авторы система  SHIELD не  пошли проторенным  путем  использования
    инженерного цилиндра. Они использовали свободное пространство на 0, 1 и
    2 цилиндрах  для размещения  ключевой информации. Дискета не копируется
    напрямую  программой  COPIWRYT.  Однако  после  копирования  программой
    COPYWRIT достаточно  немножко помочь  программой EXPLORER  и Вы  имеете
    работоспособную копию. Дискета не устойчива к копированию платой OPTION
    BOARD. Мы  рекомендуем Вам  при использовании платы скопировать сначала
    дискету программой DISKCOPY, а затем скопировать платой цилиндры 0-2.
         Для получения  работоспособной  копии  дискеты  после  копирования
    программой COPYWRIT Вам следует воспользоваться программой EXPLORER. Мы
    приведем пошаговую  инструкцию по  работе  с  программой  EXPLORER  при
    копировании дискеты системы SHIELD.
         Установите оригинальную дискету в НГМД.
         Вызовите программу EXPLORER.

         Перед Вами появится первый экран.

           Recover file   a:
         Read directory   a:
            Read layout   a: <-выберите номер НГМД клавишами +/-
                  Sides   2
          Diskette type   low density
               Position   0.0.0
          Analyze track  brief <-выберите режим brief и нажмите
                                   ввод.

                                                                          3

    Перед вами появиться второй экран.

    pos arc     C   H   R   N SC cluster flags
      9 37.8    0   0   1   2  2
     47 37.8    0   0   2   2  2
     85 37.7    0   0   3   2  2
    122 37.7    0   0   4   2  2
    160 37.7    0   0   5   2  2
    198 37.8    0   0   6   2  2
    236 37.7    0   0   7   2  2
    273 37.8    0   0   8   2  2
    311 37.8    0   0   9   2  2
    349 20.2   0   0  11   6  1         Sh <-установите сюда
                                             курсор и нажмите
                                                ввод.

         Перед вами появиться содержимое сектора. Сохраните его в буфере по
    команде Ctrl-F1.  Затем вернитесь  на предыдущий  экран  клавишей  Esc.
    Установите  дискету,   скопированную  программой   COPYWRIT.  Повторите
    действия для  экрана 2.  Восстановите данные из буфера по команде Ctrl-
    F2. Перед вами появиться картинка, похожая на следующую, хотя некоторое
    значения на ней могут быть другими.

    ЫЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЫ
    Ы цццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццц Ы
    Ы цццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццц Ы
    Ы цццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццц Ы
    Ы цццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццццц Ы
    Ы К·N99999999999999999999999999999998           ЖЖЗш  2)Ѕ9999999 Ы
    Ы 999999999999998            44?}fТ      (IдeЖ`  1
    drive:track.head  a:0.0   Ы    0   0   2   2   1
                              Ы    0   0   3   2   1
      N  SC GPL   D kind      Ы    0   0   4   2   1
      1  11 255  88           Ы    0   0   5   2   1
                              Ы    0   0   6   2   1
    timing consistency +.09 % Ы    0   0   7   2   1
    track estimate     6243   Ы    0   0   8   2   1
                              Ы    0   0   9   2   1
       key   purpose          Ы    0   0  11   6   1  Sh
             select field     Ы  123  17 249   7   1  Sh
      PgUp   edit command     Ы
      PgDn   edit id's        Ы
       Esc   return           Ы
      +  -   change field     Ы
        F5   format track     Ы
     enter   read sector      Ы

         Теперь нажмите клавишу F5 - форматирование и на запрос подтвердите
    операцию  форматирования  лавишами  CTRL-F.  Аналогичную  операцию  Вам
    необходимо проделать  для цилиндра  41. Номер  цилиндра  выбирается  на
    первом экране.
         Для цилиндра  41 Вам  следует  переписать  сектор,  у  которого  в
    столбце R  (см. предыдущий  экран) установлено  значение 1.  Это  можно
    сделать с  помощью программы  EXPLORER. Прочитайте  сектор  с  исходной
    дискеты.  Для   этого  установите  исходную  дискету  и  нажмите  ввод,
    установим курсор  напротив этого  сектора. Запомните данные в буфере по
    команде Ctrl-F1.  Теперь установите  приемную дискету и прочитайте этот
    же сектор. Восстановите данные из буфера по команде Ctrl-F2 и выполните
    запись сектора по команде F5, при этом подтвердите разрешение записи по
    команде Ctrl-W.
         Для цилиндра  0 Вам  следует переписать  все сектора, у которого в
    столбце R  (см. предыдущий экран) установлено значение 1 - 9. Вы можете
    это сделать  аналогичным образом  или воспользоваться  любой программой
    посекторного копирования.

                            ДОПОЛНИТЕЛЬНЫЕ ДАННЫЕ.

         В  этом  разделе  мы  приводим  некоторые  дополнительные  данные,
    полученные после написания первой части статьи.
         Дополнительно проводится  анализ вышеперечисленных систем, а также
    ряда других.

         CONVOY - распространяется фирмой ЭЛИАС.

         SOFT LOCK - производитель не известен.

         SUPER GUARD - производительне известен (возможно KAMI).

         GUARD -  производительне известен (возможно KAMI).

                                                                          5

                                     JAWS

         Ключевая  информация   в  системе   располагается  на   дорожке  0
    инженерного цилиндра  с номером 42. Автор системы защиты от копирования
    JAWS  утверждает,   что  созданные  дискеты  не  копируются  программой
    COPYWRIT. Это  утверждение не  соответствует действительности.  Дискета
    копируется  программой   COPYWRIT,  если   указать  максимальный  номер
    копируемого цилиндра,  равным 42. Естественно, дискета легко копируется
    с помощью  платы COPY  II PC  OPTION BOARD  DELUXE (в дальнейшем OPTION
    BOARD), если указать копирование до 42 цилиндра включительно.
         Формат ключевой информации следующий.
         Дорожка 0  цилиндра 42  форматируется на  9  секторов  с  обычными
    параметрами  (GAP=80,   N=2).  При   форматировании  применяется  метод
    нарушения последовательности  секторов. Первый  сектор на дорожке имеет
    номер 11, остальные сектора имеют последовательные номера от 2 до 9.
         Следует отметить, что программа проверяет только наличие сектора с
    номером 11  путем считывания сектора с этим номером. Поэтому достаточно
    иметь на  ключевой дорожке  обычный сектор  с номером  11, а  остальные
    сектора не нужны.

                                     НОТА

         Авторы этой системы также решили расположить информацию о защите в
    области инженерных  цилиндров. В  отличие от  системы JAWS  они  решили
    использовать дорожку  0 цилиндра  41. Однако программа COPYWRIT и плата
    OPTION BOARD также успешно копируют эту дискету.
         В системе  применен более  любопытный формат  ключевой дорожки, по
    сравнению с системой JAWS.
         На дорожке применяется один из вариантов метода нарушения значений
    CHRN. Метод  состоит в  следующем. Ключевая дорожка форматируется на 10
    секторов с параметрами GAP=16, N=2. В поле N всех секторов записываются
    значения 3.  Перезаписывается  сектор  с  номером  1.  Это  приводит  к
    затиранию  маркера   идентификатора  следующего   сектора.  На  дорожке
    остается  9  секторов.  Значения  CHRN  затираемого  сектора  не  имеют
    принципиального значения. Номера оставшихся секторов нумеруются обычным
    образом от  1  до  9.  В  сектор  с  номером  1  записывается  ключевая
    информация.
         Как и  в  предыдущей  системе  JAWS,  проверяется  только  наличие
    сектора с  номером 1  (R=1) и  N=3 и  считывается из  него  информация.
    Поэтому на  ключевой дорожке  достаточно иметь  только  этот  сектор  и
    записанную  в   него  информацию.  Остальные  сектора  не  проверяются.
    Копирование  проще   всего  сделать   отформатировав  ключевую  дорожку
    дискеты-копии на  1 сектор с параметром N=3 и записав в него информацию
    из первого сектора ключевой дорожки оригинальной дискеты.
         Следует  отметить,   что  авторы   не   использовали   возможность
    дополнительного  контроля   примененного  формата.  Чтение  секторов  с
    номерами  2, 3, ... , 8   и   анализ   информации   в   них   позволяет
    контролировать размер  GAP3, заданный  при  форматировании.  Информация
    сектора  с  номером  9  позволяет  определять  и  контролировать  длину
    дорожки. При  этом авторы  получили бы защиту от копирования программой
    COPYWRIT.

                                                                          6

                                    SHIELD

         Авторы системы  SHIELD не  пошли проторенным  путем  использования
    инженерного цилиндра  и  нарушения  CHRN.  Они  использовали  свободное
    пространство на  дорожке 0  цилиндров 0,  1 и 2 для размещения ключевой
    информации. Дискета  не копируется напрямую программой COPYWRIT. Однако
    после  копирования   программой  COPYWRIT  достаточно  немножко  помочь
    программой DISK EXPLORER и Вы имеете работоспособную копию. Естественно
    дискета легко копируется платой OPTION BOARD.
         На дискете  применяется метод  форматирования  с  кодом  длины  1.
    Рассмотрим формат ключевых дорожек.
         Все ключевые  дорожки форматируются  на 19  секторов с  N=1 и GAP3
    между 3  и 7. В данном случае длина GAP3 не имеет значения, так как она
    не проверяется. В нечетных секторах в CHRN устанавливается N=2 и номера
    секторов R  принимают последовательные  значения от  1 до 9. Перезапись
    этих секторов  затирает адресные  маркеры  идентификаторов  примыкающих
    секторов и получается стандартный формат с N=2 и номерами секторов R от
    1 до 9. Последний сектор используется для контроля ключевой информации.
         На цилиндре  0 последний  сектор имеет  параметры  N=6  и  R=11  и
    используется для контроля длины дорожки. При чтении этого сектора можно
    получить длину GAP4B и увидеть начало дорожки.
         На цилиндрах  1 и 2 последний сектор имеет параметры N=1 и R=10. В
    эти сектора записывается ключевая информация.
         Для получения  работоспособной  копии  дискеты  после  копирования
    программой  COPYWRIT   Вам  следует   воспользоваться  программой  DISK
    EXPLORER. При этом необходимо скорректировать последний сектор цилиндра
    0, чтобы  программа  проверки  ключевой  дискеты  получала  необходимые
    данные  при  чтении  этого  сектора.  Для  этого  необходимо  прочитать
    ключевой сектор  с оригинальной  дискеты и  выполнить  короткую  запись
    этого сектора  на дискету-копию.  Длина записываемых данных должна быть
    достаточной для  перезаписи GAP4B  и всех  данных начала дорожки. Чтобы
    при короткой  записи не  затереть маркер идентификатора первого сектора
    на дорожке, рекомендуем при форматировании ключевой дорожки на цилиндре
    0 использовать  маленький  GAP  порядка  3.  Это  обеспечит  достаточно
    большую  длину   GAP4B  и   необходимое  место   для   записи   данных,
    контролируемых программой.  Не забудьте  переписать  содержимое  других
    секторов на  этих дорожках,  так как  в них  содержится информация  для
    работы DOS.

                               PROTECT - INST_FD

         Авторы  этой   системы  не   удержались  от   примечательной  идеи
    использования  области   инженерных  цилиндров.   Нестандартный  формат
    применяется на  дорожке 0  цилиндров 0  и  41.  Дискета  не  копируется
    программами COPYWRIT  и COPYIIPC,  но успешно  копируется платой OPTION
    BOARD.
         На дискете  применяется метод  форматирования с  длиной  1.  Также
    применяется метод  увеличения длины последнего сектора, для запутывания
    программ  COPYIIPC  и  COPYWRIT.  Применяемый  формат  имеет  следующие
    характеристики.
         Формат одинаков  для цилиндров  0 и 41. Выполняется форматирование
    на 11  секторов с  N=1, GAP=255  и символом  заполнителем формата  X.
    Первые 9  секторов имеют  стандартные R  от 1 до 9 и N=2. Предпоследний
    CHRN имеет  R=11 и  N=6. У  последнего сектора поля CHRN соответственно

                                                                          7

    равны 123,  17, 249  и 7. Полученный формат при работе с секторами от 1
    до 9  имеет отрицательный  GAP3, так как форматирование выполняется с
    кодом длины  1, а операции с секторами выполняются с кодом длины 2. При
    этом CRC  сектора залезает  на SYNC  адресного  маркера  идентификатора
    следующего сектора.  В первом секторе цилиндра 41 записывается ключевая
    информация, а  сектора 2, 3, ... , 9  заполняются  символами  F6h,  что
    должно маскировать их под обычный формат.
         Вместе с тем, авторы проверяют из всего объема ключевой информации
    только информацию  из первого  сектора  на  цилиндре  41.  Поэтому  при
    копировании достаточно  завести  обычный  сектор  с  номером  1  на  41
    цилиндре и переписать туда ключевую информацию.
         Авторы  не   использовали  дополнительных   возможностей  контроля
    ключевой информации. Анализ данных при чтении предпоследнего сектора на
    ключевых  дорожках   позволяет  контролировать  размер  GAP3  и  символ
    заполнитель, использованные при форматировании, а также CHRN последнего
    сектора на дорожке и длину дорожки.

                                    CONVOY

         Анализ проводился  на основе  ключевой дискеты.  Самой  системы  в
    распоряжении не было.
         Дискета не  копируется программами COPYWRIT и COPYIIPC, но успешно
    копируется платой OPTION BOARD.
         Все дорожки форматируются стандартным образом. Ключевая информация
    в системе располагается в поле GAP 3 сразу за полем CRC первого сектора
    на цилиндре 0 дорожке 0.
         Рассмотрим способ  построения ключевой  дискеты. Для  изготовления
    дискеты может  быть применен  метод прекращения  операции  контроллера.
    Выполняется короткое форматирование на один сектор дорожки 0 цилиндра
    0 с  прекращением операции  в GAP 2. Параметры CHRN сектора - C=0, H=0,
    R=1 и кодом длины сектора N=3. Такое форматирование полностью сохраняет
    данные на  дискете, но позволяет перезаписывать данные сектора, включая
    данные GAP  3. Затем  выполняется короткая  запись  данных  ключевого
    сектора, причем записывается поле данных сектора, поле CRC и данные GAP
    3. Прекращение  операции выполняется в поле GAP 3 после записи ключевой
    информации. Затем  выполняется короткое форматирование на один сектор
    дорожки 0  цилиндра 0  с прекращением  операции в GAP 2. Параметры CHRN
    сектора - C=0, H=0, R=1 и кодом длины сектора N=2. Такое форматирование
    восстанавливает исходный формат дорожки.

                                   SOFT LOCK

         Формат дискеты системы SOFT LOCK строго аналогичен формату системы
    CONVOY.

                                  SUPER GUARD

         Cистема SUPER  GUARD использует  схему защиты, сходную с системами
    CONVOY и  SOFT LOCK,  но для  хранения ключевой информации используется
    поле GAP 3 первого сектора дорожки 0 цилиндра 1.
         Помимо этого,  авторы системы  для усиления  защиты на дисководах,
    обеспечивающих 80  цилиндров (дисководы  1.2 Мб),  записывают данные на
    цилиндр, не  используемый при форматировании дискеты на 360 Кб. Дорожка
    0 цилиндра  с абсолютным номером 31 (для накопителя, обеспечивающего 80

                                                                          8

    цилиндров) форматируется с параметрами GPL=84, N=1, H=0 на 9 секторов с
    номерами секторов  R соответственно  равными 1, 2, 3, 244, 5, 6, 7, 10,
    9. Ключевые  данные записываются в сектор с номером R равным 244. Такой
    метод позволяет защитить дискету от копирования платой OPTION BOARD при
    использовании на  дисководах 1.2 Мб (на дисководах 360 Кб копия дискеты
    естественно работает).  Это объясняется  тем, что плата OPTION BOARD не
    копирует промежуточные цилиндры для дискет емкостью 360 Кб.

                                     GUARD

         Анализ проводился  на основе  ключевой дискеты.  Самой  системы  в
    распоряжении не было.
         Дискета не  копируется программами COPYWRIT и COPYIIPC, но успешно
    копируется платой OPTION BOARD.
         Авторы  системы  не  отказали  себе  в  удовольствии  использовать
    инженерные цилиндры.  Вместе  с  тем  ключевая  информация  расположена
    практически на всей дискете.
         Дорожки 0  цилиндров 0,  1 и  2 форматируются обычным образом на 9
    секторов. Все  остальные дорожки  всех цилиндров,  включая  цилиндр  41
    форматируются на  5 секторов с параметрами GPL=192, кодом длины сектора
    N=3,  символом   заполнителем  формата   42  и   номерами  секторов   R
    соответственно равными  1, 2,  3, 4, 5. При этом данные записываются во
    все  сектора   дорожки  0  на  всех  цилиндрах.  На  дорожке  1  данные
    записываются в  сектора только  на цилиндрах  0, 1  и 2. Также ключевые
    данные записываются  в сектор с номером 5 на дорожке 1 цилиндра 41. Все
    остальные сектора  после  форматирования  не  перезаписываются.  Вполне
    возможно, что  информация в  эти сектора  не записывалась,  т. к. объем
    защищаемых данных был меньше.

                                    ВЫВОДЫ

         Анализ    вышеперечисленных    систем    позволяет    предположить
    (специальных  исследований   не  проводилось),  что  проверка  ключевой
    информации на  дискете в  ряде систем осуществляется с помощью INT 13h.
    Также следует  отметить, что  авторы не  всех систем  достаточно  полно
    использовали возможности контроля ключевой информации.
         Результаты    анализа    вышеперечисленных    систем    показывают
    однотипность используемых методов размещения ключевой информации в поле
    GAP 3  (CONVOY,  SOFTLOCK,  SUPER  GUARD).  Это  позволяет  говорить  о
    возможном заимствовании  схемы  построения  ключевой  дискеты.  Впервые
    такая схема была применена в системе защиты кооператива Эклипс.
         Исследованию  подвергался   еще  ряд   систем,  не   включенных  в
    изложение. Приведем их краткое описание.
         Система, с  помощью  которой  выполнялась  защита  русской  версии
    пакета GEM фирмы DIGITAL RESEARCH, копируется достаточно легко.
         Система защиты  русификатора  WINDOWS  3.0  (CYRWIN).  Система  не
    только легко  копируется, но  в ней очень просто изменить счетчик числа
    установок.
         Авторы анализировали  еще ряд  различных систем названий которых и
    параметров форматировыния  уже  не  помнят,  т. к.  не  обнаружили  там
    принципиально новых идей.

                                                                          9

            ЧТО НАДО ЗНАТЬ ПРИ ВЫБОРЕ СИСТЕМЫ ЗАЩИТЫ ОТ КОПИРОВАНИЯ

         Выбор системы  защиты от  копировании является  достаточно сложной
    проблемой. При необходимости выбора лучше всего получить консультацию у
    независимых экспертов  или по крайней мере у специалистов. Однако можно
    выделить следующие  основные вопросы, на которые следует получить ответ
    у разработчиков или распространителей системы.
         Вопрос:
         Используются ли  функции BIOS  для проверки ключевой информации на
    дискете?
         Если используются функции BIOS, то такая система легко вскрывается
    и формат дискеты вряд ли достаточно сложный.
         Вопрос:
         Копируется ли дискета платой OPTION BOARD?
         В СССР  платы OPTION  BOARD  получили  широкое  распространение  и
    скорее всего защищенная дискета будет копироваться и распространяться.
         Вопрос:
         Имеются ли в системе функции снятия установленной программы с НЖМД
    с восстановлением счетчика установок на ключевой дискете?
         Если  такие  функции  присутствуют,  то  при  использовании  такой
    система легко получить нелегальную копию.
         Вопрос:
         Применяются ли в системе специальные меры для защиты от отладчиков
    в процессорах INTEL 80386 и INTEL 80486?
         Если такие  меры не  применяются, то  легко выполнить  трассировку
    программы  на   специализированных   отладчиках,   использующих   режим
    виртуального процессора 8086 для процессоров INTEL 80386 и INTEL 80486.

                                  ЗАКЛЮЧЕНИЕ.

         Мы приглашаем  всех специалистов в увлекательную гонку по созданию
    систем защиты.  При этом рекомендуем программистам, не умеющим работать
    напрямую  с   контроллером  НГМД   без  применения  BIOS,  не  пытаться
    участвовать в этом увлекательном мероприятии.

                                                                        1

                                                   ГРУППА ПРОГРАММИСТОВ 2B

              АНАЛИЗ ОТЕЧЕСТВЕННЫХ СИСТЕМ ЗАЩИТЫ ОТ КОПИРОВАНИЯ
                                  (выпуск 2)

         Мы продолжаем обзор форматов ключевых дискет отечественных систем
    защиты от  копирования (предыдущий  обзор  Вы  можете  найти  в  файле
    2BINFO.ZIP в  статье 2BCOPY).  Несмотря на  заявления, содержащиеся  в
    рекламных  материалах   ряда  нижеперечисленных   систем   защиты,   о
    некопируемости ключевых  дискет с  помощью платы  OPTION BOARD (так мы
    для краткости  будем называть плату COPYIIPC DELUXE OPTION BOARD фирмы
    Central Point  Software), эти  заявления сильно  преувеличены.  Видимо
    авторы  этих   систем  выдают  желаемое  за  действительное.  Чтобы  в
    дальнейшем специально  не повторяться,  сразу отметим  - дискеты  всех
    нижеперечисленных систем  защиты легко  копируются этой платой. Авторы
    настоящего обзора  обычно используют  плату OPTION  BOARD для создания
    архивных копий  ключевых дискет  систем защиты  от  копирования.  Ниже
    помимо формата  ключевых  дискет  систем  защиты  приводится  один  из
    возможных способов получения соответствующего формата.

                                    STAS-3

         Анализ проводился  на основе  ключевой дискеты.  Самой системы  в
    распоряжении не было.
         Автор системы  Стас Ляшев  (см. систему НОТА в предыдущем обзоре)
    не отказался  от идеи  использования  инженерных  цилиндров.  Ключевая
    информация  располагается   на  0  поверхности  41  цилиндра.  Дорожка
    форматировалась на  3 сектора  с кодом  длины сектора  2  (стандартный
    сектор 512  байт), GAP=84  и символ  заполнитель  246.  Значения  CHRN
    секторов  следующие   -  (41,0,11,2),  (41,0,12,2)  и  (41,0,99,3).  В
    последний сектор  (с кодом  длины 3) записана ключевая информация. Для
    получения  работоспособной  копии  информацию  из  последнего  сектора
    ключевой  дискеты   необходимо  переписать  в  соответствующий  сектор
    дискеты-копии.
         Дискету крайне  легко копировать  с помощью программы EXPLORER, а
    те, кто  умеет работать  с дискетами  через BIOS,  с легкостью напишут
    программу копирования этой дискеты.

                             ALFA - 2.05 (RAIZOR)
                          (производитель МП АНКАД)

         Система ALFA  тоже  использует  крайне  простой  формат  ключевой
    дискеты. Поверхность  0 цилиндра  39 отформатирована  на 19 секторов с
    кодом  длины   сектора  1   (сектор  256   байт),  GAP=10   (точно  не
    анализировали за  ненадобностью) и символом заполнителем 246. Значения
    CHRN первых  9 секторов: C=39, H=0, R=1-9 и N=1. Остальные 10 секторов
    имеют  нулевые  значения  во  всех  полях  CHRN.  Ключевая  информация
    записана в  первом секторе.  Вообще говоря,  для  копирования  дискеты
    достаточно отформатировать  соответствующую дорожку дискеты-копии на 1
    сектор с  кодом длины 1 и CHRN (39,0,1,1) и перезаписать в этот сектор
    информацию из ключевой дискеты.
         Дискету крайне  легко копировать  с помощью  программы  EXPLORER.
    Если Вы  умеете работать  с  дискетами  с  помощью  средств  BIOS,  то
    написать программу копирования ключевой дискеты с помощью этих средств
    для Вас не составит труда.

                                                                        2

                                 PROTECT 5.0.

         Дискета строго аналогична по формату дискете системе ALFA.

                                     ECP
                          распространяется ЦЭИ МФТИ.

         Авторы этой  системы утверждают,  что они  гораздо  круче  систем
    COP's  COPYLOCK   и  CERBERUS.  Делать  такие  заявления  надо  весьма
    осмотрительно.  Мы,   как  разработчики   системы   CERBERUS,   весьма
    положительно относимся  к неизвестным  нам разработчикам системы COP's
    COPYLOCK,  т. к.   в  ней   применены  простые,  но  весьма  и  весьма
    эффективные средства создания ключевой дискеты. Спор может идти только
    вокруг стойкости  защиты от  отладчика и возможности выпуска ключей на
    различных ПЭВМ.  Защиту от  отладчика  COP's  COPYLOCK  делает  весьма
    слабо. Для  того чтобы  выпустить ключевую  дискету  с  помощью  COP's
    COPYLOCK, нужно  долго искать  подходящую ПЭВМ.  Также COP's  COPYLOCK
    страдает тем,  что ключевая  дискета  может  неустойчиво  опознаваться
    (даже в НГМД, в котором она была создана).
         Авторы же  ECP, похоже не пошли дальше использования средств BIOS
    при создании  ключевой дискеты.  Ключевая информация  располагается на
    инженерных цилиндрах.  Поверхность 0 цилиндра 40 форматировалась на 30
    секторов с  кодом длины  сектора 0,  GAP порядка 10 (это достаточно) и
    символом  заполнителем  11.  В  первом,  четвертом,  седьмом  и  т. д.
    секторах в  CHRN устанавливается  N=2 и  номера секторов  R  принимают
    последовательные значения от 1 до 9. Перезапись этих секторов затирает
    адресные  маркеры   идентификаторов  двух   примыкающих   секторов   и
    получается стандартный  формат с  N=2 и номерами секторов R от 1 до 9.
    Сектор  28  не  затирается  и  для  него  в  CHRN  при  форматировании
    устанавливается  (40,0,10,1).  В  этот  сектор  записывается  ключевая
    информация. После  записи затирается  адресный  маркер  идентификатора
    одного примыкающего  сектора. В  результате на  дорожке остается  один
    последний сектор,  используемый для  контроля GAP4B. Сектор имеет CHRN
    (40,0,11,2). Все это легко повторить с помощью программы EXPLORER. Для
    сохранения  длины   GAP  4B  необходимо  выполнить  короткую  запись
    информации из  этого сектора  с ключевой  дискеты. О методе короткой
    записи рассказывалось при анализе системы SHIELD в предыдущем обзоре.
         Также ключевая информация располагается на поверхности 1 цилиндра
    40.  Там   наворочена  всякая   ерунда  со   стандартными  параметрами
    форматирования (количество секторов = 9, N=2 и символ заполнитель 11).
    Вся игра  происходит на  длине GAP  и CHRN  секторов. Анализ структуры
    дорожки и  форматирование легко  сделать с помощью программы EXPLORER.
    Никакая дополнительная информация на эту дорожку не записывается.

                             СИСТЕМА БЕЗ НАЗВАНИЯ

         Система защиты,  название которой нам неизвестно, анализировалась
    на основе дискеты, на которой была записана ИПС ТРАНЗИСТОР.
         Очень приятно было увидеть использование новых принципов создания
    ключевой дискеты  (новых, с точки зрения рассмотренных в наших обзорах
    систем),  явно   требующих  знания   контроллера   НГМД.   Поздравляем
    разработчиков!!!
         Поверхности 0 и 1 форматировались, как описано для системы SHIELD
    в  предыдущем   обзоре.   Однако   последние   сектора   на   дорожках
    использовались не  для контроля  GAP 4B.  Они имеют R=11 и N=6 и в них
    производилась короткая запись ключевой информации (использование N=6
    препятствует копированию  этих секторов  с помощью программы COPYIIPC,
    которая не  умеет перезаписывать  короткие  сектора  с  таким  кодом

                                                                        3

    длины).  Помимо   этого  используется   хранение  информации   в  GAP3
    (аналогично системам  CONVOY, SOFT  LOCK  и  т. д.  -  см.  предыдущий
    обзор).
         На наш  взгляд, это  одна из лучших защищенных дискет, которые мы
    анализировали.

                               File_PROTECTION
                                 Version 3.10
                       (C) 1991 NOVEX Technology, Ltd.

         Ключевая  информация  располагается  на  инженерном  цилиндре  40
    поверхности 0.  Дорожка форматировалась  на 11  секторов с кодом длины
    сектора  1  и  GAP=232.  В  каждом  случае  используется  свой  символ
    заполнитель. Способ  его определения  мы опишем  ниже.  При  первичном
    форматировании CH секторов устанавливаются 40,0. R и N устанавливаются
    следующим образом:
    (1,2),(16,0),(17,0),(9,2),(5,3),(6,3),(7,3),(8,3),(9,3),(10,3),(11,3).
         Затем производится  запись в  сектор с  RN (11,3), что приводит к
    затиранию первого сектора дорожки, потом запись в сектор с RN (10,3) и
    т.д., включая  запись в  сектор с  RN (9,2).  В результате  получается
    формат дорожки  с 3-мя  секторами с RN - (16,0),(17,0),(9,2). Теперь в
    сектор  с  RN  (9,2)  переписывается  информация  из  соответствующего
    сектора ключевой дискеты.
         На  ключевой   дискете  с   самим   File_PROTECTION   также   был
    отформатирован инженерный  цилиндр 40  поверхность 1  с  CH  (40,1)  и
    остальным аналогичным форматом.
         Разработчики системы  не проверяют  многое из  того,  что  у  них
    получается в  формате дорожки.  Поэтому для получения ключевой дискеты
    достаточно выполнить форматирование на 3 сектора с кодом длины сектора
    2, RN  (16,0),(17,0),(9,2),  GAP=80  и  перезаписать  сектор  (9,2)  с
    ключевой дискеты.
         Для определения символа заполнителя достаточно прочитать сектор с
    RN (17,0) с ключевой дискеты и посмотреть код первого символа, который
    в нем записан. Это и есть символ заполнитель формата.
         Все  вышеперечисленные  процедуры  легко  выполняются  с  помощью
    программы EXPLORER.

                                 ЗАКЛЮЧЕНИЕ.

         Подводя итог  двум выпускам  этого  обзора  можно  отметить,  что
    данные, приведенные  в сборнике  фирмы ЭЛИАС,  по  стойкости  систем
    защиты от копирования, не совсем верные.
         Во-первых, все  вышеперечисленные (в  этом и  предыдущем  обзоре)
    системы легко копируются платой OPTION BOARD (мы также анализировали и
    другие отечественные  системы, о  которых уже  не помним,  но все  они
    легко копируются  платой OPTION  BOARD). Вообще  защита от копирования
    платой OPTION  BOARD является  делом весьма сложным и по внешнему виду
    формата ключевой дискеты всегда можно сказать, есть ли на дискете что-
    то, что  не позволяет скопировать ее с помощью платы. Также для защиты
    от платы  необходимо в совершенстве владеть знаниями о формате дискеты
    и о работе с контроллером НГМД (включая специальные трюки).
         Во-вторых, ряд  систем легко  копируется подручными  программными
    средствами (например с помощью программы EXPLORER).
         В-третьих, для  некопируемых с  помощью программы EXPLORER систем
    (типа CONVOY, SUPER GUARD и т.д.) можно разработать достаточно простые
    программы копирования, т.к. на ключевых дискетах слишком мало ключевых
    признаков и они достаточно однообразны.

                                                                        4

         На этом  мы пока  прекратим обзоры  систем защиты от копирования.
    Эти материалы  готовились для  того, чтобы  ввести  читателей  в  курс
    проблемы и  помочь сделать  правильный выбор.  В ближайшем  будущем мы
    готовим  к   выпуску   книгу,   посвященную   проблемам   компьютерной
    безопасности и  защите от  копирования. Также  планируется подготовить
    серию книг,  описывающих методы  программирования аппаратуры  ПЭВМ без
    использования BIOS на уровне адресов ввода/вывода. Если Вас интересует
    такая проблематика,  то  мы  готовы  выслушать  предложения,  о  какой
    аппаратуре следует  написать в  первую очередь  и  за  какую  цену  Вы
    согласны купить  такие  книги.  Серия,  помимо  книг,  будет  включать
    дискеты с примерами.
         Авторы не  только ковыряют чужие системы. Прямо скажем, что это
    вообще не  их профиль  (на анализ  всех вышеперечисленных систем у нас
    ушло очень  мало времени).  Мы такие  же разработчики  программ, как и
    все. В  качестве образца  наших программ  Вы  можете  познакомиться  с
    системой защиты от копирования CERBERUS.
         CERBERUS не  использует BIOS,  а работает напрямую с контроллером
    НГМД.
         На  дискете   системы  CERBERUS   версии  1.8   содержится  много
    контролируемых ключевых  признаков. На  отечественном  рынке  CERBERUS
    единственная система,  дискеты  которой  ДЕЙСТВИТЕЛЬНО  НЕ  КОПИРУЮТСЯ
    платой OPTION BOARD.
         Первые версии  CERBERUS (1.0 и 1.1) обладали недостаточно стойким
    алгоритмом защиты от отладчика. Разработчики имели ряд бесед со своими
    знакомыми специалистами по взлому, которые указали им на недостатки. В
    CERBERUS версии  1.8 алгоритм защиты от отладчика значительно улучшен.
    Также значительно  улучшена надежность  работы программы  на различных
    типах ПЭВМ.
         Сейчас  готовится   новая  версия  системы  -  CERBERUS  2.0.  (В
    настоящее время  готов бета-релиз  системы). Она  умеет  защищать  все
    классы DOS  программ -  COM, EXE,  внутренние оверлеи,  драйверы DOS и
    даже независимые  системные программы (Вы можете защитить саму DOS или
    программы, загружаемые  непосредственно с  дискеты; для  отладки  этой
    части мы  защищали операционную систему DR DOS). В алгоритме защиты от
    отладчика использованы  все мыслимые  (и немыслимые) приемы. По совету
    наших друзей  мы включили те приемы, о которых знали, но не считали их
    достаточно серьезными.  На дискете  значительно  увеличено  количество
    ключевых признаков.
         Помимо этого,  в настоящее  время также идет создание специальных
    инструментальных средств,  позволяющих разработчику программы включать
    средства защиты  в свой  модуль. Это позволит решить проблему снятия
    программы из оперативной памяти.
         Также  значительно   повышена  надежность   работы  программы  на
    различных типах ПЭВМ.

    Как связаться с авторами:
    телефон:  (095)329-4611
    телефакс: (095)329-4711
    адрес:    115598, г. Москва, ул. Ягодная, д.17 СП ДИАЛОГ
              Отдел экспертизы и сертификации ПО
    E-MAIL Vlad_Seregin 2:5020/6 @Fidonet (JVD1BBS,095-329-2192)
    RELCOM: qa-dep@jvd.msk.su
вверх