|
Полезные советы по криптографии
Алексей! С удовольствием
читаю ваши странички о криптографии и не смог удержаться чтобы не рассказать еще
ободном достаточно эффективном способепрограмм от копирования . Сам я пишу
программы на Fox и использую этот метод сущность которого привожу ниже.
Как обычно выглядит запароленная программа? Ее воруют, запускают, и она
гордо так спрашивает: Пароль?!!! (Ей отвечают: НА ГОРШКЕ СИДИТ КОРОЛЬ(joke) или
что-то в этом роде Программа говорить: Password неверен, работать не буду. Зовут
хакера. Говорят, врага видишь. Вижу отвечает. Давай,борись. Хакер достает из
кобуры дебагер 38 калибра, и справляется с поставленой задачей. У меня
точно также, только программа после ухода хакера начинает глючить со страшной
силой. То процент начисления не тот поставит, то директора поставитзавхозом, а
секретарше зарплату начислит повыше директорской и т.д. Причем все изредка и
случайно. Зовут опять хакера, говорят ему - ты программу плохо вскрыл.Хакер
смотрит еще раз, нет говорит, все нормально. А она глючит у нас говорят ему. А
что он им может ответить, прямого образа врага перед ним нет, не можетже он
гнать всю программу под отдадкой, он же не программист, он хакер. Если я имея
исходники отлаживал прогу полгода, то ему в бинарных кодах сколькопотребуется?
А суть метода как ты догадывешся очень проста: В одной из менюшек
программы, с виду такой-же как и все остальные вводишь пароль, и если он неверен
топользуясь генератором случайных чисел выполняешь неверные команды(обычно я
использую свои глюки из ранних версий программ). Работает такая штука у
менянесколько лет уже, и достаточно эффективно. То есть сущность идеи
заключается в том чтобы не было видно защищена программа или нет. Мне кажется
что такимспособом можно криптовать даже тексты, но как, пока до конца не
додумал, хотя идеи есть. Регистрация основанная на серийных ключах. Уважаемый
Алексей, посмотрел Вашу страничку о защите программ -- довольно неплохо, но у
меня есть некоторые замечания. Вы рассматриваете два метода --
. Ваше утверждение,
что второй метод намного более надежен, чем первый, несколько спорно. Дело
в том, что при хорошем знании ассемблера очень просто его обойти: когда
пользователь вводит свое имя и регистрационный код, программа
генерирует правильный код и сравнивает его с тем, который он ввел,
поэтому перехватить этот код (просто считать его из памяти) не
составлетособого труда. В большинстве случаев достаточно просто поставить
breakpoint на функцию -- и все дела... Упаковка
программы,анти-дебаггерные и анти-дизассемблерные примочки помогают
слабо. Очень рекомендую заглянуть на А вот первый метод может быть реализован достаточно неплохо.
Хранить правильные ключи в программе совсем не обязательно --
можноподчинить их некоторым правилам; что-то подобное делает
со своими CD-keys, но у них все слишком просто.
Алгоритм проверки может бытьдлинным и запутанным, так что его дизассемблирование
(и разборка , что же он делает) причинит немало головной боли. Именно
первый метод я иприменил для защиты своей программы ( -- старые версии), но и он был сломан (хотя, как
мне написал ломавшийего хакер, подборка всего двух правильных ключей отняла у
него много времени). Тогда мне в голову пришла идея: а что, если ключи хранить
внутри программы, нозашифрованными? Я сгенерил некоторое количество
ключей (абсолютно случайным образом), зашифровал их (по отдельности) 128-битным
ключом поалгоритму RSA и прошил в программу в виде ресурса. Когда пользователь
вводит ключ, он шифруется по тому же алгоритму и сравнивается с правильными. Так
каксистема с открытым ключом не позволяет произвести обратное преобразование,
базируясь только на открытом ключе (а закрытого нет даже у меня -расшифровывать-
то не надо), то подобрать ключи невозможно даже теоретически. Есть,
впрочем, еще одна проблема: хакер (или крэкер , если угодно) может
заменить 'je' на 'jne' (или что-то в этом роде) там, гдепроисходит последняя
проверка, и функция будет всегда
возвращать TRUE. Останется лишь написать маленький patch... Чтобызащититься и от
этого, я вычисляю CRC своего exe-файла и сравниваю его с правильный, прошитым
тоже внутри программы (естественно, при вычислении этачасть файла -- где лежит
правильный CRC -- исключается; а прошивается он после компиляции).
Кстати, это еще и защита отвирусов. Вообще-то, проверку CRC тоже можно
локализовать и запатчить , но это уже немного сложнее, особенно если
программавызывает функции чтения/записи и для других целей. Кроме того, не стоит
в случае несовпадения CRC сразу об этом сообщать, иниче можно будет
поставитьhardware breakpoint и найти место, где он вычисляется. И последнее.
Если хочется защитить программы совсем уж круто , томожно
несколькофункций в своей программе (те, которые должны вызываться только в
зарегистрированной версии), зашифровать по тому же алгоритму с открытым
ключом.При этом, естественно, часть серийного номера (отсылаемого
зарегистрировавшимся) надо сделать статическим , т.е. неизменным
длявсех пользователей. На основе этой части после регистрации генерируется
полный закрытый ключ, который далее используется для расшифровки указанных
функций.Таким образом, даже если будет написан patch, позволяющий
зарегистрироваться с любым (произвольным) кодом, расшифровкапройдет
неправильно, и вместо нормального кода будет выполняться
мусор . ), и ее пока не вскрыли. Всего
наилучшего, Как написать свой собственный
регистратор. - это так называемые серийные ключи. Они встраиваются в
программу и совершенно не зависят ни от введенного имени владельца, ни от
введеннойорганизации. Его не желательно использовать по Интернету, т.к. автору
Shareware программы необходимо поместить несколько серийных номеров, которые
могут бытьпросмотрены в exe-шнике и затем легко распостроняться через все тот же
Интернет. - это создание своего алгоритма регистрации,
зависящего от введенного имени владельца (и организации). Вот на нем мыподробно
и остановимся. Такой тип регистрации применяется во многих Shareware программах,
например: WinZIP, CutFTP и т.д. Для его написания необходимоиспользовать один и
тот же алгоритм дважды: вначале в самой программе для проверки правильности
введенного кода, и в программе генерирования ключей,посредством которой Вы,
получив предварительно имя регистрируемого, создаете регистрационный ключ.
В поле NameEd типа TEdit
вводится имя (зависит от регистров букв), а в поле PasswEd тоже типа
TEditпоявляется регистрационный ключ. Изменив глобальную константу RegCode можно
получить совсем другой ключ для одного и того же вводимого имени. Смысл
этогоалгоритма в том, что вначале с первым элементом Reg (который приравнивается
RegCod'у) делается побитовая операция XOR со всеми элементами стринга имени иXOR
с длинной этого стринга, затем в цикле XORится текущий элемент с предыдущим, а
потом весь полученный массив переводится в 16-разрядную систему счисления
изаписывается в результирующий стринг PasswEd.Text. RegCode : array [1..5] of integer = ($3В,$1E,$FB,$A1,$92); { Введите сюда
своисобственные значения } Reg : array [1..5] of
integer; HEXCase ( HexNm : integer ); 10 : PasswEd.Text := PasswEd.Text + 'a'; 13 : PasswEd.Text := PasswEd.Text + 'd'; { Приравниваем RegCode=Reg } Reg[1] := Reg[1] z := 1 to Length
(NameEd.Text) do { XORим предыдущий с
текущим}
HexCase (Reg[z] div 16); Если Вы
хотите получать за свою Shareware программу деньги, то можете
воспользоваться услугами предлагаемыми российской компанией StrongSoftware
| |