Здравствуйте Аноним, Вы писали:
IT>> В результате, все эти эксперименты советских учёных были заменены простенькой защитой от дурака, написанной за пару часов.
А>А вот здесь нельзя ли по подробней.... пожалуйста.... :)
О чём поподробнее? О защите от дурака? :)
Да тут в общем-то ничего такого. В качестве ключа для локальной защиты вполне подойдёт серийный номер логического диска 'C', тот который возвращается функцией
GetVolumeInformation:
DWORD dwSN;
GetVolumeInformation("C:\\",NULL,0,&dwSN,NULL,NULL,NULL,0);
У этого способа только один недостаток, серийный номер будет утерян, если диск будет переформатирован. Хотя есть ещё один, это не будет работать, если машина сетевая и вообще не имеет диска C :) Но это уже другой случай.
Для привязки программы в сети в качестве ключа можно использовать имя компьютера, на котором установлена программа или имя общего файла данных. Работает железно для любых видов сетей и вряд ли вменяемый администратор будет менять имя сервера ради того, чтобы поставить туда стыреннай софт. Получить имя сервера можно либо явно указывая UNC имя файла с разделяемымы данными '\\SERVER\PATH\file.dat', либо, если сетевой ресурс ассоциирован с локальным диском, можно воспользоваться функцией
WNetGetConnection, чтобы получить соответсвующее диску UNC имя. Единственное, надо помнить, что на лысой 95'й винде, если сетевая поддержка не установлена, то библиотека mpr.dll тоже не установлена и программа не будет загружаться, причём молча, поэтому лучше вызывать эту функцию через LoadLibrary/GetProcAddress. Еще была проблема в сетях Novell NetWare, там UNC имя ресурса может представлятся в совершенно дебильном формате и по разному в разных конфигурациях W9x/NT, например
\\SERNAME\SYS
\\$NDS\.SERVNAME_SYS.SERVNAME
\\ROOT\.SERVNAME_SYS.SERVNAME
$NDS\.0=SERVNAME
Это можно обойти либо явно указав полный UNC-путь, либо я пытался изобразить что-то типа:
CString ReadServerName (cconst char *path)
{
char buf[MAX_PATH];
strcpy(buf,path+2);
strupr(buf);
if (strrchr(buf,'.') == 0) {
char *end = strchr(buf,'\\');
if (end) *end = 0;
return buf;
} else {
char *beg = strchr(buf,'\\');
if (beg == 0) return "";
beg++;
if (*beg == '.') beg++;
char *end = strchr(buf,'_');
if (end) {
*end = 0;
return beg;
}
}
return "";
}
Но и это не всегда работает в сложных конфигурациях NetWare.
Ну, а далее полученный ключ можно пошифровать какими-нибудь простенькими алгоритмами и спрятать подальше. Крутой ломак всё равно найдёт, а для большинства народа достаточно просто наличия хоть какого-нибудь барьера.