1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
что за программа, что ее так надежно надо защищать?
Речь о любой программе. Сейчас, или потом, прийдется об этом подумать. Всегда есть вещи, которые не хочется распространять. Допустим, вид шифровки. Допустим, я пишу программу, которая зашифровывает текст. И ли просто создаю обычный пароль, но внутри программы паскаля. Или допустим, создаю игру, а в ней внутри одного файла есть много уровней. Перейти на которые можно лишь пройдя предыдущий и плучив пароль. Масса всего некомерческого. И защита просто необходима. И речь об обычных программках на Турбо Паскале.
Дело в том, что если защищать, так надежно, иначе нет смысла защищать.
Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
Тема очень интересная и не все способы защиты здесь обсудили. Есть ещё одно направление. Как раз на паскалевских программах оно должно давать неплохую защиту для ограниченного количества информаци. Дизасемблирование не панацея. Дизасемблировать то можно всё, да кто потом в этом разберётся... Как раз пример такой проги, кошмар асматика. Нужно дизасемблировать и исправить ошибку
Я сейчас перешел на Free Pascal, поэтому, можно и по нему давать советы для защиты. В целом, пересмотрю все уже данные советы, и буду заглядывать сюда еще. Спасибо всем за предыдущие советы и будущие(заранее спасибо) : )
Type BoolProc = function (s: string): boolean; PBoolProc = ^BoolProc;
Const HashSum: longint = 3412; // это, скорее всего, слабое место
var str: string;
Function Hash (Key: string): Longint; Var I, Sum:Integer; Begin Sum := 0; For I := 1 To Length (Key) Do Sum := Sum + (Ord (Key[I]) * (1 shl I)); Result := Sum; End;
function Passed (ss: string): boolean; begin Result := (Hash (ss) = HashSum); end;
procedure TestPsw (f: BoolProc); var b: boolean; begin b := f (str); writeln ('Passed test: ', b); end;
// здесь надо сбить кракера с толку (самый наивный способ :-) asm inc PP //если изменить адрес вызываемой функции проверки, то произойдёт ошибка dec PP //чтобы ошибка не произошла, здесь я возвращаю указатель обратно end;
TestPsw (PP); end.
В ней наверняка есть слабые места, но для начала сойдёт.
--------------------
Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
Если вы решили защитить вашу информацию то маааленькие советы: 1. Пойдите в ВУЗ на кафедру Защиты Информации. 2. Научитесь ломать программы, ну положим начнем с малого:
Вообще есть такой автор как Крис Касперски, который учит как взламывать программы, и сам показывает как их можно было бы лучше защитить, Я даю его тексты, точнее фрагменты из его книги. Я думаю кто захочет тот разберется - там используется асм и си.
Для тех кто любит техносказки - первая часть kasper01 вторая часть - его перевод обучалки от Орка "Взлом как искуство" третья - взлом програм, его собственные исследования IDA_PRO - его обучалка об IDA - взламывающей системе, и не только его...
Вот ещё исходник на 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- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.