Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программирование изменений характеристик файла
Лабораторная работа
Цель работы: получить навыки по маскировке защитных действий в разрабатываемом приложении.
1. Основные положения. Разработчик программы заинтересован в наиболее полном представлении возможностей своих разработок для привлечения внимания потенциального покупателя, в результате он вынужден рисковать, предлагая на рынок Trial и Demo-версии приложений, являющиеся полнофункциональными. В качестве средств защиты от несанкционированной эксплуатации программного обеспечения широко используются способы распространения продукта с ограниченными возможностями, такими как - ограниченный по времени период возможного использования продукта, - ограниченное количество запусков программы. При применении типовых методик в случае использования вышеупомянутых способов защиты, программисты ограничиваются записью контрольных параметров (счетчик запусков, предельная дата работы) непосредственно в реестр операционной системы. Для квалифицированного пользователя, работа в реестре не представляет больших затруднений. Как показала практика, упомянутый подход не является эффективным, так как место хранения контрольных параметров не является тайной. Пример организации типовой защиты, основанной на ограничении количества запусков программы:
program Trial;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Registry, SysUtils, Dialogs; // Для TRegistry, IntToStr и ShowMessage {$R *.RES} var N: Integer; Reg: TRegistry; begin Reg: = TRegistry.Create; with Reg do begin OpenKey('software', True); OpenKey('TrialProg', True); if ValueExists('MaxRun') then // Первый запуск? begin // - Нет N: = ReadInteger('MaxRun')-1; if N> =0 then WriteInteger('MaxRun', N) end else begin // -Да, первый запуск N: = 5; WriteInteger('MaxRun', N) end; Free end; if N> 0 then begin Application.CreateForm(TForm1, Form1); Form1.Label2.Caption: = IntToStr(N-1); Application.Run; end else ShowMessage('Исчерпано максимальное количество запусков пробной версии программы') end.
При использовании защит, основанных на контроле даты выполнения или контроле количества запусков программы, более перспективным является хранение контрольных параметров в замаскированной форме в файлах, выбранных самим разработчиком и хранимых в произвольном месте (например, среди вспомогательных файлов самого приложения). При подобном подходе актуальной становится маскировка обращений к файлам, в которых хранятся текущие значения контрольных параметров. Общеизвестно, что при любом изменении содержимого файла операционная система автоматически корректирует внешние характеристики файла, такие, как длина, время и дата создания, которые хранятся в файловой системе. Изменение даты и времени файла Использование процедуры FileSetDate(Handle: Integer; newDate: TDateTime); Handle - указатель (дескриптор) обрабатываемого файла, может быть определен с помощью - функции API-Windows FileOpen, например var Handle: Integer; .............................. Handle: = FileOpen(filename, fmOpenReadWrite); FileSetDate(Handle, Datetimetofiledate(newtime)); FileClose(Handle); - свойства Handle класса TFileRec, например var TheFile: file; .............................. AssignFile(TheFile, FileName); Reset(TheFile); FileSetDate(TFileRec(TheFile).Handle, DateTimeToFileDate(newDate)); Close(TheFile);
Использование процедуры SetFileTime procedure ChangeDate(FileName: string); var i: TDate; Handle: Integer; f: TFileTime; s: TSystemTime; begin Handle: = CreateFile(PChar(FileName), $0100, 0, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); i: = Date; DateTimeToSystemTime(i, S); SystemTimeToFileTime(S, F); LocalFileTimeToFileTime(F, F); SetFileTime(Handle, @f, @f, @f); CloseHandle(Handle); end;
Использование процедуры SetFTime var f: file; begin Assign(f, DirInfo.Name); Reset(f); SetFTime(f, Time); Close(f); end;
2. Выполнение работы Лабораторное задание Задача лабораторной работы - организовать защиту, основанную на ограничении количества запусков приложения, причем значение счетчика запусков хранить в файле, внешние характеристики которого (дата и время создания) остаются постоянными.
2.1. Разработайте тестовую программу, в которой в режиме диалога можно изменить дату создания выбранного файла 2.2. Для выбора файла используйте стандартные диалоговые компоненты TEdit, TButton, TOpenDialog. 2.3. Рекомендуемый интерфейс тестовой программы:
2.4. Возможный вариант организации процедуры для изменения даты и времени файла: function SetFileDateTime(FileName: string; NewDateTime: TDateTime): Boolean; var Handle: Integer; FileTime: TFileTime; LFT: TFileTime; LST: TSystemTime; begin Result: = False; try DecodeDate(NewDateTime, LST.wYear, LST.wMonth, LST.wDay); DecodeTime(NewDateTime, LST.wHour, LST.wMinute, LST.wSecond, LST.wMilliSeconds); if SystemTimeToFileTime(LST, LFT) then begin if LocalFileTimeToFileTime(LFT, FileTime) then begin Handle: = FileOpen(FileName, fmOpenReadWrite); if SetFileTime(Handle, nil, nil, @FileTime) then Result: = True; end; end; finally FileClose(Handle); end; end;
2.5. Для маскировки действий используйте отвлекающие функции (мусорный код, например: организация «пустого» цикла с невыполняемыми переходами на лишние метки).
3. Контрольные вопросы 1. Какие способы распространения программных продуктов Вы знаете? 2. В файле какого формата предпочтительнее хранить значение счетчика запусков программы?. 3. В каком виде предпочтительнее хранить значения даты и времени? 4. Как организовать в теле программы дополнительные проверки? 5. Что понимается под недокументированными точками входа в программу? 6. Сформулируйте рекомендации для обеспечения тестовых проверок работы приложения в случае использования защиты, основанной на использовании счетчика запусков программы. 7. Как рационально организовать ведение протокола при защите, основанной на учете количества запусков программы? 8. Как противостоять применению отладчиков при попытке взлома программы?
|