Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
защита программ.doc
Скачиваний:
6
Добавлен:
29.08.2019
Размер:
301.06 Кб
Скачать

Программа chkintrl

Для анализа используемого чередования секторов можно использовать программу CHKINTRL (листинг 5.5), которая пытается прочитать подряд два расположенных рядом сектора с номерами 1 и 2. Если используется стандартное чередование, то секторы с номерами 1 и 2 находятся рядом. Если же дорожка отформатирована приведенной выше программой, то эти секторы находятся на максимальном удалении друг от друга.

Программа анализирует время, необходимое на то, чтобы 50 раз подряд прочитать эти два сектора на двадцатой дорожке. Вначале используется головка 0 - это нестандартная дорожка, подготовленная программой FMTINTRL, затем - головка 1, для которой раньше было выполнено стандартное форматирование.

Листинг 5.5. Файл chkintrl\chkintrl.cpp

#include <stdio.h>

#include <conio.h>

#include <bios.h>

#include <dos.h>

#include <stdlib.h>

#include <time.h>

char diskbuf[1024];

int main(void)

{

unsigned status = 0, i, j;

struct diskinfo_t di;

time_t start, end;

float t1, t2;

// Читаем первый сектор дорожки

// для синхронизации таймера

di.drive = 0;

di.head = 0;

di.track = 20;

di.sector = 1;

di.nsectors = 1;

di.buffer = diskbuf;

for(i = 0; i < 3; i++)

{

status = _bios_disk (_DISK_READ , &di) >> 8;

if(!status) break;

}

// Отсчет времени начинаем сразу после чтения

// сектора,это позволит компенсировать время,

// необходимое на разгон мотора НГМД

start = clock();

// Повторяем 50 раз чтение секторов с номерами 1 и 2

for(j=0; j<50; j++)

{

di.drive = 0;

di.head = 0;

di.track = 20;

di.sector = 1;

di.nsectors = 2;

di.buffer = diskbuf;

for(i = 0; i < 3; i++)

{

status = _bios_disk (_DISK_READ , &di) >> 8;

if(!status) break;

}

}

end = clock();

t1 = ((float)end - start) / CLK_TCK;

printf("Время для головки 0: %5.1f\n",t1);

// Выполняем аналогичную процедуру для дорожки,

// которая была отформатирована обычным способом

di.drive = 0;

di.head = 1;

di.track = 20;

di.sector = 1;

di.nsectors = 1;

di.buffer = diskbuf;

for(i = 0; i < 3; i++)

{

status = _bios_disk (_DISK_READ , &di) >> 8;

if(!status) break;

}

start = clock();

for(j=0; j<50; j++)

{

di.drive = 0;

di.head = 1;

di.track = 20;

di.sector = 1;

di.nsectors = 2;

di.buffer = diskbuf;

for(i = 0; i < 3; i++)

{

status = _bios_disk (_DISK_READ , &di) >> 8;

if(!status) break;

}

}

end = clock();

t2 = ((float)end - start) / CLK_TCK;

printf("Время для головки 1: %5.1f\n",t2);

return 0;

}

5.2. Защита программ на жестком диске

Обычно процесс установки защищенного от копирования программного продукта выглядит следующим образом:

  • в НГМД вставляется установочная дискета; с нее запускается программа установки;

  • программа установки уменьшает на единицу счетчик выполненных установок (этот счетчик может находиться в нестандартном секторе или в каком-нибудь другом месте на дискете);

  • если количество установок, выполненных с этой дискеты, превысило максимально допустимое, на экран выдается сообщение об этом и работа программы установки завершается;

  • если ресурс количества установок еще не исчерпан, выполняется копирование файлов программного продукта на жесткий диск и другие необходимые действия;

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

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

В этом разделе книги мы опишем несколько методов настройки программного обеспечения на конкретный компьютер:

  • привязка файлов программного продукта к их физическому расположению на диске (метод основан на том, что при восстановлении файлов на другом компьютере они будут располагаться в других секторах диска);

  • запись в неиспользуемый участок последнего кластера, распределенного файлу, контрольной информации (при выгрузке и восстановлении файлов эти неиспользуемые участки файлов пропадают);

  • привязка программы к конкретной версии BIOS, при этом используется дата трансляции BIOS и метод контрольных сумм;

  • проверка производительности отдельных подсистем компьютера.

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

Программа установки, пользуясь таблицей размещения файлов FAT , определяет список кластеров, распределенных файлу и записывает этот список в конец защищаемого файла или в отдельный файл. Можно использовать, например, файл конфигурации, предназначенный для хранения текущих параметров программного пакета. Список кластеров можно зашифровать, сложив его с каким-либо числом, например, с использованием логической операции "ИСКЛЮЧАЮЩЕЕ ИЛИ".

После запуска программный продукт определяет расположение защищенного файла на диске и сравнивает его с записанным при установке. Если расположение изменилось - запущена незаконная копия.

Какие недостатки у этого способа?

Прежде всего, невозможна оптимизация диска такими программами, которые могут изменить расположение файлов на диске, например, Norton Speed Disk .

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

Первый недостаток можно преодолеть, используя процедуру "деинсталляции", или съема программного пакета с диска компьютера. Эта процедура заключается в том, что с жесткого диска удаляются файлы программного продукта, затем соответствующий счетчик на установочной дискете уменьшается на единицу. После выполнения всех необходимых операций с диском можно выполнить повторную установку программного продукта.

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

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

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

Метод проверки версии или контрольных сумм программы BIOS пригоден для защиты от копирования между компьютерами, содержащими разные версии BIOS. Однако при покупке партии компьютеров все они почти наверняка будут иметь одинаковую систему BIOS, поэтому, хотя этот метод достаточно прост, его эффективность относительно невысока.

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

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