{$R-}
for k:=2 to 255 do
N:=N+Bif[k];
if (N mod 256=Bif[256]) then
begin
if N=0 then
DSK:=4;
LegalDiskett:=False;
Exit
end;
DSK:=0;
LegalDiskett:=True
end
else
LegalDiskett:=False
end; {LegalDiskett}
function LegalHD(var DSK: Byte): Boolean;
{проверяет легальность стационарной копии}
var
k:Word;
Date:^TDate;
Legal:Boolean;
label
ExitL;
{Расшифровываем ключ}
with Key do for k:=2 to 5 do
KeyW[k]:=KeyW[k] xor KeyW[1];
{Проверяем дату изготовления ПЗУ}
k:=1;
Date:=ptr($F000,$FFF5);
repeat
Legal:=Date^[k]=Key.Dat[k];
inc(k)
until not Legal or (k=5);
LegalHD:=Legal;
{проверяем дискету}
if Legal then
DSK:=0
Legal:=LegalDiskett(DSK);
LegalHD:=Legal
{----------------}
procedure ProtCheck(var P1,P2;var Res:Integer);
{Проверяет легальность копии:
Р1 - адрес процедуры NORMA; Р2 - адрес процедуры ALARM;
Res - результат работы:
0: был вызов NORMA;
1: был вызов ALARM;
2: не вставлена дискета.
Любое другое значение может быть только при трассировке программы}
type
PType = Procedure;
Norma: PType absolute P1;
Alarm: PType absolute P2;
DSK: Byte;
L1,L2;
Res:=-1;
if Key.Hard=0 then
if LegalDiskett(DSK) then
L1:
Norma;
Res:=0
L2:
if DSK=2 then
Res:=2
Alarm;
Res:=1
if LegalHD(DSK) then
goto L1
goto L2
end; {ProtCheck}
{---------------}
Procedure HidnSec(var Buf:TBuf;Inst,Limit:Byte);
{Шифрует буфер ключевого сектора}
k,n:Word;
Randomize;
for k:=2 to 254 do
Buf[k]:=Random(256);
Buf[1]:=Random(255)+1; {Ключ для шифровки}
Buf[17]:=Inst; {Счетчик установок}
Buf[200]:=Limit; {Лимит установок}
n:=0; {Подсчет КС}
n:=n+Buf[k];
Buf[256]:=n mod 256; {Контрольная сумма}
{Шифруем все данные}
for k:=2 to 256 do
Buf[k]:=Buf[k] xor Buf[1];
{$R+}
end; {HidnSec}
{-----------------}
Function SetOnHD: Integer;
{Устанавливает стационарную копию на жесткий диск. Возвращает:
-1 - не вставлена дискета;
-2 - не мастер-дискета;
-3 - защита от записи или ошибка записи ГД;
-4 - программа не скопирована на ЖД;
-5 - ошибка доступа к ЖД;
-6 - исчерпан лимит установок;
-7 - программа уже установлена.
>=0 - количество оставшихся установок}
DSK:Byte; {Диск}
F:file; {Файл с программой}
Date:^TDate; {Дата ПЗУ}
NameF:String; {Имя файла с программой}
W:array[1..5] of Word; {Заголовок файла}
n:Word; {Счетчик}
L:LongInt; {Файловое смещение}
Inst:Byte; {Количество установок}
ErrWrt;
if Key.Hard<>0 then
SetOnHD:=-7;
{проверяем резидентность программы}
NameF:=FExpand(ParamStr(0));
if NameF[1] in ['A','B'] then
SetOnHD:=-4;
if not LegalDiskett(DSK) then
case DSK of
2: SetOnHD:=-1;
SetOnHD:=-2;
if (Bif[200]<>255) and (Bif[17]>=Bif[200]) then
begin {Исчерпан лимит установок}
SetOnHD:=-6;
{Запоминаем дату изготовления ПЗУ}
Key.Dat:=Date^;
{Шифруем параметры}
with Key do
while Hard=0 do Hard:=Random($FFFF);
for n:=2 to 5 do with Key do
KeyW[n]:=KeyW[n] xor Hard;
{Открываем файл с программой}
Assign(F,NameF);
Reset(F,1);
{Читаем заголовок файла}
BlockRead(F,W,SizeOf(W),n);
if n<>SizeOf(W) then
SetOnHD:=-5;
{Ищем в файле положение Hard}
R.ah:=$62;
MSDOS(R);
P:=@Key;
L:=round((DSeg-R.bx-16+W[5])*16.0)+ofs(P^);
Seek(F,L);
{Записываем в файл}
BlockWrite(F,Key,SizeOf(Key),n);
if n<>SizeOf(Key) then
Close(F);
{Шифруем ключевой сектор}
Inst:=Bif[200]-Bif[17]-1;
HidnSec(Bif,Bif[17]+1,Bif[200]);
{записываем на дискету новый ключ}
if not DiskettPrepare(DSK) then
begin {Ошибка доступа к дискете: удаляем установку}
ErrWrt:
FillChar(Key,SizeOf(Key),0);
SetOnHD:=-3;
with R do
ah:=0;
dl:=DSK;
Intr($13,R);
ah:=3;
al:=1;
ch:=TRK;
cl:=SEC;
dh:=HED;
es:=seg(Bif);
bx:=ofs(Bif);
if(Flags and FCarry)<>0 then
goto ErrWrt
{Нормальное завершение}
SetOnHD:=Inst;
SetIntVec($1E,P);
Close(F)
end; {SetOnHD}
function RemoveFromHD: Integer;
{Удаляет стационарную копию. Возвращает:
k,n:Integer;
NameF:String;
B:array[1..512] of Byte;
F:file;
DSK,Inst:Byte;
RemoveFromHD:=-4;
RemoveFromHD:=-1
RemoveFromHD:=-2;
{Стираем файл с программой на ЖД}
if NameF[1] in ['A'..'B'] then
{$I-}
{$I+}
if IOResult<>0 then
RemoveFromHD:=-5;
{Уничтожаем заголовок файла}
FillChar(B,512,0);
BlockWrite(F,B,512,n);
if n<>512 then
Erase(F); {Стереть файл}
Inst:=Bif[200]-Bif[17]+1;
HidnSec(Bif,Bif[17]-1,Bif[200]);
{Записываем на дискету новый ключ}
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9