Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Общие вопросы разработки программ _ защита от копирования

Автор: мисс_граффити 24.08.2007 12:38

Здравствуйте.
Возникла такая ситуация - делаю программку (БД). Хотелось бы как-то ограничить возможности ее копирования (специально ее ломать нафиг никому не надо, люди от хакерства весьма и весьма далеки, поэтому в супер-заморочках необходимости нет). С подобными задачами никогда не сталкивалась... Поделитесь опытом, пожалуйста - как можно подойти к вопросу?
Спасибо заранее.

Автор: Neznaika 24.08.2007 15:32

Цитата

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


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

Извиняюсь, что одни общие слова. Но я думаю, что так действуют все файловые защиты.

Автор: Malice 24.08.2007 16:47

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

Автор: мисс_граффити 24.08.2007 17:21

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

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

Автор: Malice 24.08.2007 17:45

Цитата(мисс_граффити @ 24.08.2007 14:21) *

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

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

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

Автор: -Neznaika- 24.08.2007 19:29

Эх, пример не получается создать.
Я думал примерно так:

Записываем 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 24.08.2007 22:34

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

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

Автор: hardcase 25.08.2007 0:55

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

Единственным способом распространения программы будет пакет, который производит установку.

Автор: -Neznaika- 25.08.2007 1:43

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


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

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

Весь вопрос в GenTestString. Чем один компьютер отличается от другого?
Не захотели в начале века использовать серийный номер процессора, а зря.

Автор: мисс_граффити 25.08.2007 3:35

Как интересно получается smile.gif Я думала, все, кто пишет софт на заказ, с этим сталкивался (сама-то писала только курсовики и прочие учебные работы, к которым, естественно, отдавались исходники... ни о какой защите речи не было).

Цитата
Позвонят в службу поддержки (к тебе), продиктуешь им ответ.

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

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

В общем, спасибо за ответы. Пока буду обдумывать... Если будут еще идеи - с удовольствием почитаю.

Автор: Bokul 25.08.2007 4:36

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

Без связи программ между собой, например через интернет-сервер, это невозможно. ИМХО. Как можно определить один компьютер из любого? smile.gif

Автор: мисс_граффити 25.08.2007 14:42

Ключ... который физически один. А без него - не запускается.

Автор: Lapp 26.08.2007 5:56

Цитата(мисс_граффити @ 25.08.2007 11:42) *

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

Юля, ты передергиваешь.. smile.gif
Ты начала с _простейшей_ защиты, к тому же не определив точно, что именно тебе нужно. А теперь говоришь о физическом ключе (на usb?) - и это уже далекооооо не простейшая штука.. Таккие ключи (обычно на LPT) были очень популярны некоторое время назад, но (с приходом Инета?) утратили популярность. Если говорить про такую штуку, то вопрос можно считать закрытым - нужно просто обратиться в фирму, которая их делает (думаю, такая должна быть). Они же дадут и софт к нему.

Автор: мисс_граффити 26.08.2007 13:34

У нас они по-прежнему популярны.
Про простейшую=не требующую особых усилий. Мне не хотелось, чтобы защита была по объему кода сопоставима с самим проектом.
А ключи продаются готовые, еще и с софтинкой, вписывающей его в откомпилированную программку.

Автор: Lapp 26.08.2007 17:39

Цитата(мисс_граффити @ 26.08.2007 10:34) *

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

Дык.
smile.gif

Автор: SKVOZNJAK 31.08.2007 15:45

Можно использовать дату создания файла. Все файлы вне диапазона неработоспособны - триалверсия.

Автор: Neznaika 27.09.2007 16:22

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

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

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

Автор: FreeMan 27.09.2007 19:29

Цитата
Но я думаю, что так действуют все файловые защиты.

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

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

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

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

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

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

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

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

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

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

Автор: S1name 4.06.2010 20:56

Цитата(Bokul @ 24.08.2007 19:34) *

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

tracert -a tracert-an

Автор: Lapp 5.06.2010 4:04

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

Автор: SKVOZNJAK 6.06.2010 2:44

Цитата(Lapp @ 4.06.2010 21:04) *

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

Смутные подозрения терзают: идёт прокачка бота для какой-нибуть рекламы. Пользователей со стажем за рассылки так сразу не банят wink.gif

Автор: Lapp 6.06.2010 6:39

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

lol.gif lol.gif lol.gif

Автор: SKVOZNJAK 6.06.2010 19:20

Да нет, пост не глупый, свою функцию выполняет. От его автора не видел ни одного сообщения указывающего на принадлежность к пасквилянтам http://forum.pascal.net.ru/index.php?showtopic=25943&hl= а счётчик постов тем не менее тикает. Представь, некто зарегился на ~20 форумах, постит иногда билеберду для количества а через годик продаст рекламодателям прокачанные аккаунты по баксу штука - бизнес. На сайте проституток платят за привод новых клиентов с уникальным айпи. Нужно лишь заманить народ на тематически близкий сайт а оттуда переплавить к спонсору. Свой акк за 5 баксов продать не желаешь? lol.gif

Автор: Lapp 7.06.2010 7:16

Цитата(SKVOZNJAK @ 6.06.2010 16:20) *
Свой акк за 5 баксов продать не желаешь?
Стартовая цена моего акка - $555,555.55. Могу выставить eBay )). Вырученные деньги пойдут на развитие форума, 100%.