Помощь - Поиск - Пользователи - Календарь
Полная версия: защита от копирования
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Общие вопросы разработки программ
мисс_граффити
Здравствуйте.
Возникла такая ситуация - делаю программку (БД). Хотелось бы как-то ограничить возможности ее копирования (специально ее ломать нафиг никому не надо, люди от хакерства весьма и весьма далеки, поэтому в супер-заморочках необходимости нет). С подобными задачами никогда не сталкивалась... Поделитесь опытом, пожалуйста - как можно подойти к вопросу?
Спасибо заранее.
Neznaika
Цитата

...Возникла такая ситуация - делаю программку (БД).
Хотелось бы как-то ограничить возможности ее копирования...


Ограничить возможности копирования, значит привязать к определённому месту на носителе(жёстком диске,
CD-ROM и т.д. и т.п.). Известно, что под файлы файловая система отводит не столько байт, сколько они занимают, а сколько, сколько минимально кластеров нужно для хранения всех данных файла. Короче,
реальный размер файла кратен размеру кластера(например в NTFS обычно 4096).
Так как обычно размер файла не кратен размеру кластера, то остаются так называемые "хвосты"(неиспользуемые байты в последнем кластере файла). В них можно записать контрольные значения и при старте программы первым делом проверять их. Если совпадают, то всё нормально, иначе - копия программы нелегальная - выход. Только кроме изменений в самой программе потребуется создать установочную программу, которая запишет контрольные значения в "хвосты". В идеале эта установочная программа должна самоликвидироваться(самоудалаться).

Извиняюсь, что одни общие слова. Но я думаю, что так действуют все файловые защиты.
Malice
Простой способ, встречающийся частенько: привязаться к оборудованию, например через GetVolumeInformation получить серийный номер винта, потом на основании него по любой хитрой формуле (md5 подойдет smile.gif )получить некий id. У себя иметь генерилку ответов на него, в программе - проверку. Единственное тонкое место - умудриться сделать проверку так, чтобы в самой программе не была включена этаже генерилка, иначе выдерут 5 сек (хотя говоришь это не надо никому).
мисс_граффити
Neznaika, не совсем поняла идею. на каком этапе писать контрольные значения?

Malice, сначала думала в ту же сторону...
но возникает проблема: винт полетел - им опять обращаться ко мне? в общем, не придумала, к чему можно сделать привязку.
почитала про hasp... идея интересная, но, к сожалению, аладдиновский сайт лежит - не могу узнать про цены и т.п.
Malice
Цитата(мисс_граффити @ 24.08.2007 14:21) *

Neznaika, не совсем поняла идею. на каком этапе писать контрольные значения?

Malice, сначала думала в ту же сторону...
но возникает проблема: винт полетел - им опять обращаться ко мне?

Да, конечно, а что такого ? Позвонят в службу поддержки (к тебе), продиктуешь им ответ. Ты же по простетцки хотела. Посложнее - активация через инет или хасп, но это та еще заморочка.
ps или купи протектор какой нибудь и навесь, никаких заморочек, как с хаспом. Главное, чтоб окупилось.
-Neznaika-
Эх, пример не получается создать.
Я думал примерно так:

Записываем MAGIC в "хвост" файла FileName:

type
String5 = String[5];
const
MAGIC : String5 = 'Magic';
MAGIC_SIZE = SizeOf(String5);
CLUSTER_SIZE = 4096;
FileName : array[0..12] of Char = 'TestFile.dat'#0;
var
hFile : THandle;
FileSize : DWord;
DW : DWord;
...
hFile := CreateFile(@FileName,GENERIC_READ or GENERIC_WRITE,0,NIL,OPEN_EXISTING,0,0);
FileSize := GetFileSize(hFile,NIL);
if (CLUSTER_SIZE - FileSize mod CLUSTER_SIZE) < MAGIC_SIZE then
begin
Write('No memory in tail!');
CloseHandle(hFile);
Exit
end;
SetFilePointer(hFile,FileSize,NIL,FILE_BEGIN);
WriteFile(hFile,MAGIC,MAGIC_SIZE,DW,NIL);
SetFilePointer(hFile,FileSize,NIL,FILE_BEGIN);
SetEndOfFile(hFile);
CloseHandle(hFile)



К сожалению вызов SetEndOfFile(hFile) затирает MAGIC !fire.gif
Bokul
Цитата
в общем, не придумала, к чему можно сделать привязку.

Если полагаться что у пользователей чистая ОС, то наверняка можно достать ее номер (если такое существует) и ассоциировать программу именно с ним.
hardcase
Никогда не задумывался над подобными вещами... Но вот придумал схему (наверняка это велосипед).
Создаем специальный установочный пакет.
Для защиты исполняемого файла от копирования нужно на этапе установки поместить к нему в ресурс некоторый идентификатор ОС или машины. Далее нужно запаковать/зашифровать исполняемый файл (конечно вместе с ресурсом) (пример подобного пакера - upx) и именно в таком виде записать его на машину клиента.
Каждый раз при запуске приложения происходит распаковка приложения в память и мы проверяем на валидность эту самую сигнатуру, которую записали в ресурс при установке.
Вот в принципе и все.

Единственным способом распространения программы будет пакет, который производит установку.
-Neznaika-
Цитата
hardcase:
Для защиты исполняемого файла от копирования нужно на этапе установки поместить к нему в ресурс некоторый идентификатор ОС или машины...


Да, это сделать несложно.
Заводим типизированную константу, например.
TestString : String = 'TestString0123456789'
и специальную функцию GenTestString : String. Эта функция будет генерировать некую строку-идентификатор
компьютера, на котором установлена программа. В начале программы будет проверка
if GenTestString = TestString then
ВСЁ НОРМАЛЬНО - ПРОДОЛЖАЕМ РАБОТУ.

TestString находится в сегменте данных, поэтому установщик вызывает GenTestString, получая правильное
значение, ищет в файле программы строку 'TestString0123456789' и заменяет её на полученное значение.
Программа защищена. smile.gif

Весь вопрос в GenTestString. Чем один компьютер отличается от другого?
Не захотели в начале века использовать серийный номер процессора, а зря.
мисс_граффити
Как интересно получается smile.gif Я думала, все, кто пишет софт на заказ, с этим сталкивался (сама-то писала только курсовики и прочие учебные работы, к которым, естественно, отдавались исходники... ни о какой защите речи не было).
Цитата
Позвонят в службу поддержки (к тебе), продиктуешь им ответ.

Позвонят, скажут что новый винт (комп... апгрейдились), я продиктую, они скопируют и отдадут smile.gif
Странная защита получается.

Немножко продумала, что мне нужно: чтобы программа запускалась на _любом_ компьютере. Но - только на одном. Судя по описанию, hasp - именно то, что нужно (кстати, никто не знает, у обычных флешек есть какие-либо идентификаторы?).

В общем, спасибо за ответы. Пока буду обдумывать... Если будут еще идеи - с удовольствием почитаю.
Bokul
Цитата
Немножко продумала, что мне нужно: чтобы программа запускалась на _любом_ компьютере. Но - только на одном.

Без связи программ между собой, например через интернет-сервер, это невозможно. ИМХО. Как можно определить один компьютер из любого? smile.gif
мисс_граффити
Ключ... который физически один. А без него - не запускается.
Lapp
Цитата(мисс_граффити @ 25.08.2007 11:42) *

Ключ... который физически один.

Юля, ты передергиваешь.. smile.gif
Ты начала с _простейшей_ защиты, к тому же не определив точно, что именно тебе нужно. А теперь говоришь о физическом ключе (на usb?) - и это уже далекооооо не простейшая штука.. Таккие ключи (обычно на LPT) были очень популярны некоторое время назад, но (с приходом Инета?) утратили популярность. Если говорить про такую штуку, то вопрос можно считать закрытым - нужно просто обратиться в фирму, которая их делает (думаю, такая должна быть). Они же дадут и софт к нему.
мисс_граффити
У нас они по-прежнему популярны.
Про простейшую=не требующую особых усилий. Мне не хотелось, чтобы защита была по объему кода сопоставима с самим проектом.
А ключи продаются готовые, еще и с софтинкой, вписывающей его в откомпилированную программку.
Lapp
Цитата(мисс_граффити @ 26.08.2007 10:34) *

ключи продаются готовые, еще и с софтинкой, ..

Дык.
smile.gif
SKVOZNJAK
Можно использовать дату создания файла. Все файлы вне диапазона неработоспособны - триалверсия.
Neznaika
Недавно попробовал "раздеть" одну программу и ... она "согласилась" smile.gif
Немного головной боли в ИДЕ - оказалось, что эта программа всего лишь проверяет идентификатор
компакт диска - и программа "свободна".

Вообще найти условные операторы(которые осуществляют проверки) несложно. Главное определить,
что эта проверка не влияет на данные, которые потом будет использовать программа.

Здесь вроде все знают ассемблер, информация по WINAPI тоже доступна,
"снять" "несложную защиту" сможет каждый.
FreeMan
Цитата
Но я думаю, что так действуют все файловые защиты.

вы очень далеки от реальности
Цитата
пример подобного пакера - upx

им же и распаковать при необходимости
Цитата
мы проверяем на валидность эту самую сигнатуру, которую записали в ресурс при установке.

и на этой проверке и палемся
Цитата
Позвонят, скажут что новый винт (комп... апгрейдились), я продиктую, они скопируют и отдадут

пусть новый ключ стоит денег.
Цитата
Судя по описанию, hasp - именно то, что нужно

так вроде как эмуляторов этой бадяги полно
Цитата
А ключи продаются готовые, еще и с софтинкой, вписывающей его в откомпилированную программку.

и также продает клиентам и скидывает деньги на счетsmile.gif
Цитата
Можно использовать дату создания файла.

типа нельзя заменить?
Цитата
Недавно попробовал "раздеть" одну программу и ... она "согласилась"

извращенец
Цитата
Вообще найти условные операторы(которые осуществляют проверки) несложно.

вот ты наконец и сгенерировал правельный вывод - программа не должна проверять правильность сигнатуры, тогда сложность взлома увеличивается в разы.

а вообще как говорил великий-мудрый "все, что можно запустить, можно взломать"
S1name
Цитата(Bokul @ 24.08.2007 19:34) *

Если полагаться что у пользователей чистая ОС, то наверняка можно достать ее номер (если такое существует) и ассоциировать программу именно с ним.

tracert -a tracert-an
Lapp
Цитата(S1name @ 4.06.2010 17:56) *
tracert -a tracert-an
и что бы сие значило?.. blink.gif
SKVOZNJAK
Цитата(Lapp @ 4.06.2010 21:04) *

и что бы сие значило?.. blink.gif

Смутные подозрения терзают: идёт прокачка бота для какой-нибуть рекламы. Пользователей со стажем за рассылки так сразу не банят wink.gif
Lapp
Цитата(SKVOZNJAK @ 5.06.2010 23:44) *
Смутные подозрения терзают: идёт прокачка бота для какой-нибуть рекламы.
Верх дипломатичности - вместо того, чтоб сказать: "какой глупый мессадж!" - сказать: "Ах, какой умный бот это ляпнул!.."

lol.gif lol.gif lol.gif
SKVOZNJAK
Да нет, пост не глупый, свою функцию выполняет. От его автора не видел ни одного сообщения указывающего на принадлежность к пасквилянтам Диапазон а счётчик постов тем не менее тикает. Представь, некто зарегился на ~20 форумах, постит иногда билеберду для количества а через годик продаст рекламодателям прокачанные аккаунты по баксу штука - бизнес. На сайте проституток платят за привод новых клиентов с уникальным айпи. Нужно лишь заманить народ на тематически близкий сайт а оттуда переплавить к спонсору. Свой акк за 5 баксов продать не желаешь? lol.gif
Lapp
Цитата(SKVOZNJAK @ 6.06.2010 16:20) *
Свой акк за 5 баксов продать не желаешь?
Стартовая цена моего акка - $555,555.55. Могу выставить eBay )). Вырученные деньги пойдут на развитие форума, 100%.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.