Привязка софта к железу и онлайн верификация

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by LooseURmind, 24 Jul 2011.

  1. LooseURmind

    LooseURmind New Member

    Joined:
    20 Jul 2011
    Messages:
    4
    Likes Received:
    3
    Reputations:
    0
    Данную статью я представляю вниманию новичков для обеспечения защиты своего софта. Защита реализуется путем привязки к железу компа + онлайн проверка.

    Наша защита будет состоять из нескольких частей:
    • Генератор серийного номера по системным характеристикам.
    • Генератор ключа авторизации по серийнику
    • Защищаемая программа

    Итак... с структурой мы разобрались, теперь нужно определиться к каким параметрам мы будем осуществлять привязку.
    Мы сделаем это через 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 и т.д.
    Будут вопросы - пишите, но я тут разжевал все до процедур онклика)
    Всем удачи в начинаниях.
     
  2. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    И где тут защита?
    Этот софт ломается изменением одного условного перехода.