Защита программы от нелегального копирования

Автор: Пользователь скрыл имя, 28 Ноября 2011 в 22:26, курсовая работа

Краткое описание

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

Оглавление

Введение………………………………………………………………………..3
Описание существующих методов………………………………………..5
Проверка типа ПК и версии ДОС……………………………………..6
Проверка даты изготовления и контрольной суммы ПЗУ…………..6
Проверка места расположения файла на диске………………………7
Проверка состава аппаратных средств………………………………..8
Использование скрытых частей программы и особенностей физических носителей информации…………………………………..............9
Обоснование выбора используемого метода…………………………….11
Описание программы……………………………………………………...12
Заключение…………………………………………………………………….18
Список ссылок……………..…………………………………………………..19
Приложение……………………………………………………………………20

Файлы: 1 файл

Курсовик по КИЗИ.doc

— 344.00 Кб (Скачать)

 Если ошибка  обнаружена, печатает строку 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-1)*0.055

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[0:$1E*4]);

  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:2,' c');

          {измеряем время доступа к стандартной дорожке}

          DBT^.SizeCode:=2;  {Указываем стандартную  длину сектора в ТПД}

          Write('Доступ к обычной дорожке: ');

          WriteLn(AccessTime(DSK,20):6:2,' c');

          {Восстанавливаем старую ТПД}

          SetIntVec($1E,Old)

end. 

  1. ТЕКСТ ПРОГРАММЫ TEXT.EXE
 

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.

Информация о работе Защита программы от нелегального копирования