Данную статью я представляю вниманию новичков для обеспечения защиты своего софта. Защита реализуется путем привязки к железу компа + онлайн проверка. Наша защита будет состоять из нескольких частей: Генератор серийного номера по системным характеристикам. Генератор ключа авторизации по серийнику Защищаемая программа Итак... с структурой мы разобрались, теперь нужно определиться к каким параметрам мы будем осуществлять привязку. Мы сделаем это через WIN Api функции: GetUserName - Имя текущего пользователя. GetComputerName - Имя компутора. GetVolumeInformation - Получение информации о носителе. GlobalMemoryStatus - Информация о используемой системой памяти. Что бы облегчить вам жизнь, я приведу готовые функции: Code: function UserName: string; var u: pchar; i: dword; begin i := 1024; u := StrAlloc(Succ(i)); if GetUserName(u, i) then Result := StrPas(u) else Result := '?'; end; function ComputerName: string; var buffer: array[0..255] of char; size: dword; begin size := 256; if GetComputerName(buffer, size) then Result := buffer else Result := '' end; function GetHard: String; var VolumeName, FileSystemName: array [0..MAX_PATH-1] of Char; VolumeSerialNo: DWord; MaxComponentLength,FileSystemFlags: Cardinal; begin GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo, MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH); Result := IntToHex(VolumeSerialNo,8); end; function GetMem: String; var MyMem: TMemoryStatus; begin MyMem.dwLength:=SizeOf(MyMem); GlobalMemoryStatus(MyMem); with MyMem do begin Result:= IntToStr(dwTotalPhys); end; end; Итак, мы получили всю интересующую нас информацию. Теперь мы склеим эти данные в hex строку, что бы конечный пользователь не знал, какие параметры мы используем. Берем функцию преобразования в 16ричный вид. Code: function StringToHex(str1,Separator:String):String; var buf:String; i:Integer; begin buf:=''; for i:=1 to Length(str1) do begin buf:=buf+IntToHex(Byte(str1[i]),2)+Separator; end; Result:=buf; end; Склеим все параметры - Code: function getSerial:string; begin Result := StringToHex((UserName + ComputerName + GetHard + GetMem)); end; Вывод полученной строки в TEdit Code: procedure TForm2.Button1Click(Sender: TObject); begin Edit1.Text := getSerial; end; Мои поздравления, пупсики, готов модуль получения serial кода. Генератор регистрационного ключа Полученый серийник надо шифрануть, что бы жизнь медом не казалась. Используйте любые методы, я приведу пример MD5. ( Йа ссылко на модуль ) функция шифрации. Code: function getKey(Serial: string):string; begin Result := MD5DigestToStr(MD5String(Serial+'123')); end; Теперь кидаем на форму два Tedit и кнопку. на онклик ставим . Code: procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := getKey(Edit1.Text); / в первый Edit вставляем серийник, во втором будет зашифрованый вариант(очевидно) end; Кейген готов. Пишем основную программу. 1) Кидаем все функции сбора инфы о компе и генерации серийника из первого модуля. 2) Кидаем функцию шифрации серийника из генератора рег ключа. Приступим к регистрации программы и онлайн привязки. Кидаем Tedit(для ввода рег ключа) + 2 кнопки (1 - проверка на валидность рег ключа 2 - коннект к серверу и проверка на наличия записи там) Code: procedure TForm2.Button1Click(Sender: TObject); begin if Edit1.Text = getKey(GetSerial) then ShowMessage('RegOk') else ShowMessage('NoFuckinWay') ; end; При валидности рег ключа - RegOk, если нет, то посылает. В качестве онлайн проверки будем использовать простейший вариант - txt файл. Алгоритм - на хосте лежит файл серийник.txt, а в нем же рег ключ. Программа сравнивает содержимое текстовика и ключ, сгенереный программой. Code: procedure TForm2.Button2Click(Sender: TObject); begin if getKey(GetSerial)= IdHTTP1.Get('http://zzzzzz.com/reg/'+GetSerial+'.txt') then ShowMessage('RegOk') else ShowMessage('NoFuckinWay') ; end; Вот и все Осталось вам придумать, куда прописывать то, что программа зарегистрирована. Я лишь описал наглядный пример, как строятся такие методы защиты... вы можете использовать свои способы привязки, совершенствуя код + верификация через txt самый ненадежный способ. используйте php+mysql и т.д. Будут вопросы - пишите, но я тут разжевал все до процедур онклика) Всем удачи в начинаниях.