Испытано на себе TiberiuZ (admin@progamer.org.ru) Спецвыпуск: Хакер, номер #053, стр. 053-044-4 Маленькие хитрости Купив сам у себя программу несколько раз, я отладил систему, казалось бы, идеально... Но вот тут, как всегда, появилось одно злобно-трусливое и очень подлое "но". Rupay сочли прием платежей из-за границы нерентабельным и закрыли его, несмотря на протесты на форуме. Пришлось искать другие пути. Для приема платежей из-за границы я прилепил E-Gold, а для России - WebMoney. WM также покорился мне не с первого раза: электронная подпись не хотела сходиться. Google отправил меня на WM-форум, в котором эта проблема не одну неделю обсуждалась с местным администратором. Он долго не мог понять, почему у людей на php и perl md5-подпись не сходится, а ссылался на то, что он знает только asp. Оказалось, что в perl и php результатом функции md5 является строка в нижнем регистре, а на ASP - в верхнем. После замены в моем скрипте md5($a) на strtoupper(md5($a)) все заработало. Тот топик популярен и по сей день и находится по адресу google->"site:webmoney.ru md5 не сходится" :-). Теперь web-сервер мог принимать платежи, но надо было принимать данные от web-сервера программой, написанной на C Builder. Тогда я толком не знал, что такое xml и тем более не знал ничего путного о сетевых протоколах. Так как в моей программе был браузер для просмотра меню, я решил использовать его и для регистрации. Итак, человек жмет кнопку on-line registration и: Browser->Navigate(WideString("http://my.com/?hid="+GetHID()+"&ver=1.04"),...} //Передаем web-серверу HardwareID и текущую версию программы. OnDocumentComplete(){ AnsiString Url=Browser->LocationURL; if(Url.Pos("about:blank#key=")==NULL)return; if((UnLockKey=Url.SubString(17,32)).Length()!=32)return; if(!Validate(UnLockKey))return; StrToFile("reg.key",SerialKey); //Получаем код разблокировки программы через тот же url. Готово, программа зарегистрирована. Не знаю, во сколько строк это реализовал бы профессиональный программист, но, думаю, на несколько страниц растянул бы точно. Как написана функция Validate(), рассказывать не буду. Это коммерческая тайна. Но скажу, что код разблокировки в ней не сравнивается, а обрабатывается и только потом сравнивается. Это немного повышает защищенность программы. Также в ней сложно подделать серийный номер, считываемый с диска, так как он не хранится в памяти. Еще я подумывал о том, чтобы добавить к программе проверку crc32, вычитанную на xakep.ru, но забил на это дело - уж больно все геморно получается :-). Все равно, если захотят взломать, взломают даже ради спортивного интереса. Главной цели я добился - для пользования программой было три главных пути: покупка, crack, keygen. А большинство пользователей на дух не переносит десятки порно-toolbars, забитые рекламой favorites, и прочие проблемы, напрямую зависящие от количества использованных кряков. |