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

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

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

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

Оглавление

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

Файлы: 1 файл

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

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

    BegSC:Word;                  {Сектор/цилиндр начала}

    SysCode:Byte;                {Системный код}

    EndHead:Byte;                {Головка конца раздела}

    EndSC:Word;                  {Сектор/цилиндр конца}

    RelSect:LongInt;             {Относительный сектор начала}

   FoolSiz:LongInt              {Объем в секторах}

  end; {PartType}

  {Загрузочный  сектор диска}

  PBoot=^TBoot;

  TBoot=record

  case Byte of

  0:(

    a:array[1..11] of Byte;

    BPB:BPB_Type;

    Add:Add_BPB_Type;

    c:array[1..+$1BE-(SizeOf(BPB_Type)+SizeOf(Add_BPB_Type)+11)] of Byte;

    Par:array[1..4] of PartType);

  1:(b:array[1..512] of Byte)

  end;

  {Описатель  диска по структуре IOCTL}

  IOCTL_Type=record

    BuildBPB:Boolean;        {Строить ВРВ}

    TypeDrv:Byte;            {Тип диска}

    Attrib:Word;             {Атрибуты диска}

    Cylindrs:Word;           {Число цилиндров}

    Media:Byte;              {Тип носителя}

    BPB:BPB_Type;

    Add:Add_BPB_Type;

    Reserv:array[1..10] of Byte;

  end;

  {Описатель диска}

  TDisk=record

    Number:Byte;                  {Номер диска 0=А, ...}

    TypeD:Byte;                   {Тип диска}

    AttrD:Word;                   {Атрибуты диска}

    Cyls:Word;                    {Число цилиндров на диске}

    Media:Byte;                   {Дескриптор носителя}

    SectSize:Word;                {Количество байт в секторе}

    TrackSiz:Word;                {Количество секторов на дорожке}

    TotSecs:LongInt;              {Полная длина в секторах}

    Heads:Byte;                   {Количество головок}

    Tracks:Word;                  {Число цилиндров на носителе}

    ClusSize:Byte;                {Количество секторов в кластере}

    MaxClus:Word;                 {Максимальный номер кластера}

    FATLock:Word;                 {Номер 1-го сектора FAT}

    FATCnt:Byte;                  {Количество FAT}

    FATSize:Word;                 {Длина FAT в секторах}

    FAT16:Boolean;                {Признак 16-битового элемента FAT}

    RootLock:Word;                {Начало корневого каталога}

    RootSize:Word;                {Количество элементов каталога}

    DataLock:Word;                {Начальный сектор данных}

  end;

  {Список описателей  диска}

  PListDisk=^TListDisk;

  TListDisk=record

    DiskInfo:TDisk;

    NextDisk:PListDisk

  end;

var

  Disk_Error:Boolean;       {Флаг ошибки}

  Disk_Status:Word;         {Код ошибки}

const

  Disks:PListDisk=NIL;      {Начало списка описателей диска} 

function ChangeDiskette(Disk:Byte):Boolean;

{Возвращает TRUE, если  изменялось положение

запора на указанном  проиводе гибкого диска} 

procedure FreeListDisk(var List: PListDisk);

{Удаляет список описателей дисков} 

procedure GetAbsSector(Disk,Head:Byte; CSec:Word; var Buf);

{Читает абсолютный  дисковый сектор с помощью  прерывания $13} 

function GetCluster(Disk:Byte; Sector:Word):Word;

{Возвращает номер кластера по заданному номеру сектора} 

function GetDefaultDrv:Byte;

{Возвращает номер  диска по умолчанию} 

procedure GetDirItem(FileName:String; var Item:Dir_Type);

{Возвращает элемент  справочника для указанного файла} 

procedure GetDirSector(Path:String; var Disk:Byte; var Dirs,DirSize:Word);

{Возвращает адрес  сектора, в котором содержится

начало нужного  каталога, или 0, если каталог не найден.

Вход:

PATH - полное имя  каталога ('', если каталог текущий).

Выход:

DISK - номер диска;

DIRS - номер первого сектора каталога или 0;

DIRSIZE - размер каталога (в элементах DIR_TYPE).} 

procedure GetDiskInfo(Disk:Byte; var DiskInfo:TDisk);

{Возвращает информацию  о диске DISK} 

function GetDiskNumber(c:Char):Byte;

{Преобразует имя  диска A...Z в номер 0...26.

Если указано  недействительное имя, возвращает 255} 

function GetFATItem(Disk:Byte;Item:Word):Word;

{Возвращает содержимое  указанного элемента FAT} 

procedure GetIOCTLInfo(Disk:Byte; var IO:IOCTL_Type);

{Получить информацию  об устройстве согласно общему выову IOCTL} 

procedure GetListDisk(var List:PListDisk);

{Формирует список описателей дисков} 

procedure GetMasterBoot(var Buf);

{Возвращает в  переменную Buf главный загрузочный  сектор} 

function GetMaxDrv:Byte;

{Возвращает количество  логических дисков} 

function Getsector(Disk:Byte;Cluster:Word):Word;

{Преобразует номер  кластера в номер сектора} 

function PackCylSec(Cyl,Sec:Word):Word;

{Упаковывает цилиндр  и сектор в одно слово для  прерывания $13} 

procedure ReadSector(Disk:Byte;Sec:LongInt;NSec:Word;var Buf);

{Читает сектор(секторы)  на указанном диске} 

procedure SetAbsSector(Disk,Head:Byte;CSec:Word;var Buf);

{Записывает абсолютный  дисковый сектор с помощью  прерывания $13} 

procedure SetDefaultDrv(Disk:Byte);

{Устанавливает  диск по умолчанию} 

procedure SetFATItem(Disk:Byte;Cluster,Item:Word);

{Устанавливает  содержимое ITEM в элемент CLUSTER таблицы  FAT} 

procedure SetMasterBoot(var Buf);

{Записывает в  главный загрузочный сектор содержимое Buf} 

procedure UnPackCylSec(CSec:Word;var Cyl,Sec:Word);

{Декодирует цилиндр и сектор для прерывания $13} 

procedure WriteSector(Disk:Byte;Sec:LongInt;NSec:Word;var Buf);

{Записывает сектор(секторы)  на указанный диск} 

                                IMPLEMENTATION

uses DOS;

var

  Reg:Registers;

procedure Output;

{Формирует значения Disk_Status и Disk_Error}

begin

  with Reg do

    begin

      Disk_Error:=Flags and FCarry=1;

      Disk_Status:=ax

    end

end; {Output}

{----------------------}

function ChangeDiskette(Disk:Byte):Boolean;

{Возвращает TRUE, если  изменялось положение

запора на указанном  приводе гибкого диска}

begin

  with Reg do

    begin

      AH:=$16;

      DL:=Disk;

      Intr($13,Reg);

      Output;

      ChangeDiskette:=Disk_Error and (AH=6)

    end

end; {ChangeDiskette}

{----------------------}

procedure FreeListDisk(var List:PListDisk);

{Удаляет список  дисковых описателей}

var

  P:PListDisk;

begin

  while List<>NIL do

    begin

      P:=List^.NextDisk;

      Dispose(List);

      List:=P

    end

end; {FreeListDisk}

{---------------------}

procedure GetAbsSector(Disk,Head:Byte;CSec:Word;var Buf);

{Читает абсолютный  дисковый сектор с помощью  прерывания $13}

begin

  with Reg do

    begin

      ah:=2;          {Операция чтения}

      dl:=Disk;       {Номер привода}

      dh:=Head;       {Номер головки}

      cx:=CSec;       {Цилиндр/сектор}

      al:=1;          {Читать  один сектор}

      es:=seg(Buf);

      bx:=ofs(Buf);

      Intr($13,Reg);

      Output

    end

end;  {GetAbsSector}

{--------------------}

function GetCluster(Disk:Byte;Sector:Word):Word;

{Возвращает номер  кластера по заданному номеру  сектора}

var

  DI:TDisk;

begin

  GetDiskInfo(Disk,DI);

  if not Disk_Error then with DI do

    if(Sector-DataLock>=0) and (TotSecs-Sector>=0) then

      GetCluster:=             {Нормальное обращение}

        (Sector-DataLock) div ClusSize+2

    else

      GetCluster:=0            {Неверный номер сектора}

  else GetCluster:=0           {Неверный номер диска}

end; {GetCluster}

{----------------------}

function GetDefaultDrv:Byte;

{Возвращает номер диска по умолчанию}

begin

  with Reg do

    begin

      AH:=$19;

      MSDOS(Reg);

      GetDefaultDrv:=AL

    end

end; {GetDefaultDrv}

{---------------------}

procedure GetDirItem(FileName:String;var Item:Dir_Type);

{Возвращает элемент  справочника для указанного файла}

var

  Dir:array[1..16] of Dir_Type;        {Буфер на 1 сектор каталога}

  Path:DirStr;                         {Маршрут поиска}

  NameF:NameStr;                       {Имя файла}

  Ext:ExtStr;                          {Расширение файла}

  Disk:Byte;                           {Номер диска}

  Dirs:Word;                           {Номер сектора}

  DirSize:Word;                        {Размер каталога}

  Find:Boolean;                        {Флаг поиска}

  j:Integer;                           {Номер элемента каталога}

{-----------}

procedure FindItem;

{Ищет нужный  элемент в секторах каталога}

var

  k,i:Integer;

  m:array[1..11] of char;      {Массив имени}

  Clus:word;                   {Номер кластера}

  DI:TDisk;

begin

  GetDiskInfo(Disk,DI);             {Получаем длину кластера}

  ReadSector(Disk,Dirs,1,Dir);      {Читаем первый сектор}

  k:=0;                             {Количество просмотренных элементов}

  j:=1;                             {Текущий элемент каталога}

  {Готовим имя и расширение для поиска}

  FillChar(m,11,' ');

  Move(NameF[1],m[1],Length(NameF));

  if ext<>'' then

    Move(Ext[2],m[9],Length(ext)-1);

  Find:=False;

  {Цикл поиска}

  repeat

    if Dir[j].Name[1]=#0 then

      exit;           {Обнаружен конец поиска}

    if (Dir[j].FAttr and $18)=0 then

      begin           {Проверяем очередное имя в каталоге}

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