Автор: Пользователь скрыл имя, 28 Ноября 2011 в 22:26, курсовая работа
В данном курсовом проекте рассматривается проблема создания программы, нелегальное (без ведома официального распространителя) копирование которой приводит к потере программы способности нормально работать.
Введение………………………………………………………………………..3
Описание существующих методов………………………………………..5
Проверка типа ПК и версии ДОС……………………………………..6
Проверка даты изготовления и контрольной суммы ПЗУ…………..6
Проверка места расположения файла на диске………………………7
Проверка состава аппаратных средств………………………………..8
Использование скрытых частей программы и особенностей физических носителей информации…………………………………..............9
Обоснование выбора используемого метода…………………………….11
Описание программы……………………………………………………...12
Заключение…………………………………………………………………….18
Список ссылок……………..…………………………………………………..19
Приложение……………………………………………………………………20
Если ошибка обнаружена, печатает строку S и завершает работу программы}
begin
Intr($13, R);
if R.Flags and FCarry<>0 then
if R.ah<>6 then {Игнорируем ошибку от смены типа дискеты}
begin
WriteLn(S);
SetIntVec($1E, Old); {Восстанавливаем старую ТПД}
Halt
end
end; {Intr13}
Function AccessTime(DSK,TRK: Byte):Real;
{Измеряет время
доступа к дорожке и
var
E: array [1..18*512] of Byte;
t,k: LongInt;
R: registers;
begin
t:=MemL[0:$046C];
while t=MemL[0:$046C] do;
for k:=1 to 10 do with R do
begin
ah:=2;
al:=9;
ch:=TRK;
cl:=1;
dh:=0;
dl:=DSK;
es:=seg(E);
bx:=ofs(E);
Intr13(R, 'Error')
end;
AccessTime:=(MemL[0:$046C]-t-
end;
{--------------}
var
B: array [1..18] of F_Buf; {Буфер для форматирования}
k,N:Integer; {Счетчик цикла}
R:registers; {Регистры}
DBT:PDBT_Type; {Указатель на новую ТПД}
C, D: array[1..1024] of Byte; {Буфер чтения/записи}
Size: Word; {Длина сектора}
Info: TDisk;
begin {Главная программа}
{Проверяем доступ к диску и настраиваем драйвер}
GetDiskInfo(DSK, Info);
if Disk_Error then
begin
WriteLn('Ошибка доступа к
Halt
end;
{Получаем длину сектора в байтах}
case SIZ of
0: Size:=128;
1: Size:=256;
2: Size:=512;
3: Size:=1024
else
WriteLn('Недопустимый код длины сектора')
end;
{Корректируем
таблицу параметров дискеты.
в ПЗУ, делаем ее копию в ОЗУ и изменяем нужные элементы}
Old:=ptr(MemW[0:$1E*4+2],MemW[
New(DBT);
DBT^:=Old^; {Получаем копию ТПД в ОЗУ}
SetIntVec($1E,DBT); {Изменяем ссылку на ТПД}
with DBT^ do
begin
SizeCode:=SIZ;
LastSect:=18;
FillChar:='+'
end;
with R do
begin
{Сбрасываем дисковод}
ax:=0;
dl:=DSK;
Intr13(R,'Ошибка доступа к диску');
{Готовим буфер форматирования
с обратным фактором
for k:=1 to 18 do {Для каждого из 18 секторов:}
with B[k] do
begin
Track:=TRK; {указываем номер дорожки}
Head:=0; {номер головки}
Sect:=19-k; {номер
сектора в обратной
Size:=SIZ {и код размера}
end;
{Форматируем дорожку}
ah:=$05; {Код операции форматирования}
al:=18; {Создаем 18 секторов}
ch:=TRK; {на дорожке TRK}
cl:=1; {начиная с сектора 1}
dh:=0; {на поверхности 0}
dl:=DSK; {диска DSK}
es:=seg(B); {ES:BX - адрес буфера}
bx:=ofs(B);
Intr13(R,'Ошибка
{Заполняем сектор случайными числами}
Randomize;
for k:=2 to 255 do
C[k]:=Random(256);
{Запрашиваем количество инсталяций на ЖД}
Write('Кол-во установок на ЖД: ');
ReadLn(C[200]);
C[17]:=0;
{Cчитываем контрольную сумму}
N:=0;
for k:=2 to 255 do
N:=N+C[k];
C[256]:=N mod 256;
{Шифруем сектор}
C[1]:=Random(255)+1;
for k:=2 to 256 do
C[k]:=C[k] xor C[1];
{Записываем сектор}
ah:=$03; {Код операции записи}
al:=1; {Записать 1 сектор}
ch:=TRK; {На дорожке TRK}
cl:=1; {Начиная с сектора 1}
dh:=0; {На поверхности 0}
dl:=DSK; {Диск DSK}
es:=seg(C);{Адрес буфера С
bx:=ofs(C);
Intr13(R,'Ошибка записи');
{Читаем сектор}
ah:=$02;
al:=1;
ch:=TRK;
cl:=1;
dh:=0;
dl:=DSK;
es:=seg(D); {Адрес буфера D для чтения}
bx:=ofs(D);
Intr13(R,'Ошибка чтения')
end;
{Проверяем совпадение}
for k:=1 to Size do
if c[k]<>d[k] then
begin
WriteLn('Несовпадение данных');
SetIntVec($1E,Old);
Halt
end;
WriteLn('Создана и проверена ',TRK+1,
'-я дорожка с секторами по ',Size,' байт');
{измеряем время доступа к
Write('Время доступа к
WriteLn(AccessTime(DSK,TRK):6:
{измеряем время доступа к стандартной дорожке}
DBT^.SizeCode:=2; {Указываем стандартную длину сектора в ТПД}
Write('Доступ к обычной
WriteLn(AccessTime(DSK,20):6:
{Восстанавливаем старую ТПД}
SetIntVec($1E,Old)
end.
uses F_Prot,F_Disk;
procedure Alarm;Far;
begin
writeln('Нелегальная копия')
end;
procedure Norma;Far;
begin
writeln('Легальная копия')
end;
function ParStr:String;
var
S:string;
k:Byte;
begin
S:=ParamStr(1);
for k:=1 to Length(S) do S[k]:=UpCase(S[k]);
ParStr:=S
end;
var
p1,p2:Pointer;
d:Integer;
dsk:Byte;
begin
p1:=@Norma;
p2:=@Alarm;
if ParStr='/SET' then
Writeln('Установка на ЖД: ',SetOnHD)
else
if ParStr='/REMOVE' then
writeln('Удаление с ЖД: ',RemoveFromHD)
else
begin
ProtCheck(p1,p2,d);
Writeln('Результат проверки ',d);
readln
end
end.
Информация о работе Защита программы от нелегального копирования