1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Вот ещё исходник на FPC (Free Pascal), который легко переделать для любого другого компилятора. Функция замера текущего тика процессора (времени) GetClock реализуется с помощью функции GetTickCount из модуля Windows. Модуль Windows подключается именно по этой причине. Для портирования в ТП7 нужно заменить реализацию замера тика (времени) в функции GetClock на свою (можно через GetTime). Модуль MD5 можно взять отсюда: http://wikisource.org/wiki/MD5_Hash
Идея такова: вы вводите пароль в виде строки, специальная функция проверки сверяет пароль и потом выдаёт ответ в boolean о корректности. Сверка паролей делается при помощи известного алгоритма MD5, который выполняет односторонние преобразования и выдаёт хеш (hash). Кроме проверки хешей вводимых строк проверяется ещё и наличие отладочных инструментов (debugger). Если между точкой ввода и проверкой хешей замечена разница во времени, большая 10 тиков (на самом деле, без отладки она вообще = 0), то меняется адрес точки входа в функцию проверки хешей. Тогда программа "вылетит" с ошибкой. Пароль: "test"
{$IFDEF FPC} {$Mode Delphi} {$ENDIF FPC}
uses md5, Windows;
Type BoolProc = function (s: string): boolean; PBoolProc = ^BoolProc;
function GetClock () : DWord; begin Result := GetTickCount end;
function Passed (ss: string): boolean; begin Result := MD5Match (MD5String (ss), Hash); end;
procedure TestPsw (); var b: boolean; f: boolproc; pp: pointer; ds,de: DWord; dr: word; begin PP := @Passed; {...some operations...} ds := GetClock (); dr := 137 + random (1299); // просто цифры inc (PP, dr); // меняем точку входа в функцию проверки de := GetClock (); if (de - ds < 10) then // если разность больше 10 тиков, то прогу взламывают (дебагер)... dec (PP, dr); // возвращаем, если всё нормально ds := GetClock (); // просто так, для отвлечения внимания {.../some operations...} @f := PP; b := f (str); writeln ( 'Test passed: ', b ); end;
Этот код не претендует на реальную защиту программ и выполняет функцию пособия для разработки более серьёзной защиты.
Сообщение отредактировано: Romtek -
--------------------
Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.