logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak w Delphi przypisać klucz do sprzętu, by zabezpieczyć aplikację demo?

machoney 10 Mar 2008 15:06 8606 21
REKLAMA
  • #1 4893325
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    Witam,
    napisałem sofcik, który chcę wypuścić w wersji demo w pełni funkcjonalne przez 30 dni. Następnie program ma poprosić o klucz. Program jest w instalce i klucz powinien być przypisany do komputera. Znalazłem coś odnośnie woluminu dysku ale to nie rozwiązanie bo po formacie wolumin się zmienia i klucz nie zadziała. Czy ktoś ma sposób na pobranie w delphi lub przez WinAPI sprzętowego numeru np. dysku, procesora lub biosu? Może jest na to inny sposób. proszę o pomoc, pzd
  • REKLAMA
  • #2 4893637
    Konto nie istnieje
    Konto nie istnieje  
  • #3 4893728
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    próbowałem coś takiego:
    
    function ID: string;
    var
       VolumeSerialNumber : DWORD;
       MaximumComponentLength : DWORD;
       FileSystemFlags : DWORD;
       SerialNumber : string;
    begin
      GetVolumeInformation ( 'C:', nil, 0, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, nil, 0 );
      SerialNumber := IntToHex( HiWord( VolumeSerialNumber ), 4 ) +  IntToHex( LoWord( VolumeSerialNumber ), 4 );
      Result := SerialNumber;
      form1.edit1.text := result;
    
    end;
    

    niestety to zwraca mi serial woluminu.

    Jaką ma składnię GetVolumeSerialNumber bo nigdy tego nie używałem.
  • #4 4893735
    Konto nie istnieje
    Konto nie istnieje  
  • #5 4893996
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    Nie znalazłem jeszcze dokładnego opisu ale z tego co znalazłem mam wrażenie że to jest to samo co GetVolumeInformation. Jesteś pewny że da mi to serial dysku i zarówno z partycji c: jak i z d: wynik będzie ten sam i po formacie się nie zmieni?
  • REKLAMA
  • #7 4894325
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    Dlatego szukam czegoś stałego w sprzęcie. Może coś z BIOS-em albo z prockem. Potrzebuję coś co się nie zmieni po formacie
  • #9 4894426
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    Wybaczam ;)
    Wielkie dzięki!! Niestety widocznie moje zdolności poszukiwacza są marne bo siedzę dwa dni i ciągle nic nie miałem. Siadam do przeglądania linów od Ciebie. jeszcze raz wielkie thx
  • #10 4894436
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #11 4899910
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    Niestety u mnie ciągle bez efektów. Mimo dużej ilości różnych linów ciągle nie mogę trafić w 10. Zaczniemy od tego, że piszę w Turbo Delphi i chcę uniknąć dodawania komponentów. Po drugie - dużo znalazłem na temat WMI jednak nie wiem jak z tego skorzystać w TD. Szukam też w WinAPI ale narazie też bez praktycznych efektów.
    Jeśli masz jeszcze cierpliwość i wyrozumiałość dla mnie to pomóż. thx
  • #13 4900390
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    link otrzymany dzięki uprzejmości Roch Brada
    http://www.codeguru.pl/article-265.aspx
    jest super tylko ja nie potrafię przjść z C# na Delphi. Mam wmiutils.dll i nie wiem co dalej bo nigdy podobnych rzeczy nie robiłem. Narazie bezustannie walczę z tym tematem.

    Dodano po 1 [godziny] 1 [minuty]:

    Trafiłem na coś takiego
    http://www.delphi3000.com/articles/article_3118.asp

    wygląda spoko jednak nie mogę w Turbo znaleźć importu do projektu. Po wklejeniu funkcji z linku zgłasza błąd przy deklaracji zmiennych

    
    var  // These are all needed for the WMI querying process 
      Locator:  ISWbemLocator; 
      Services: ISWbemServices; 
      SObject:  ISWbemObject; 
      ObjSet:   ISWbemObjectSet; 
      SProp:    ISWbemProperty; 
      Enum:     IEnumVariant; 
      Value:    Cardinal; 
      TempObj:  OleVariant; 
      SN: string; 
    


    Jak powiązać funkcję z wmiutils.dll którą znalazłem w system32??
  • #14 4900599
    Konto nie istnieje
    Konto nie istnieje  
  • #15 4902094
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    znalazłem implib ale nie chce mi skonwertować. 'Error : unable to open file'.
    Proszę, spróbuj u siebie zrobić ten plik lib.
    Załączniki:
    • wmiutils.zip (43.6 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 4903754
    Konto nie istnieje
    Konto nie istnieje  
  • #17 4904045
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    dzięki,
    znalazłem jeszcze coś takiego:
    http://cc.codegear.com/download.aspx?id=19255&file=UnitSimpleWMI.pas&ln=1

    niestety nie mogę skompilować bo woła o WbemScripting_TLB które
    
    {
     You need the WbemScripting_TLB unit, which you can create by installing the type library
     <Windows System32>\wbem\wbemdisp.tlb type library using the "Project|Import type library" menu option.
    }
    

    niby wszystko jest a jednak ... ja tego nie umiem odpalić
  • Pomocny post
    #18 4904650
    Konto nie istnieje
    Konto nie istnieje  
  • #19 4907106
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    Chyba tu właśnie będzie główny problem - ja mam Turbo Delphi które jest darmowe (również komercyjnie) i nie mam 'Project | Import Type Library' natomiast pytałem znajomego czy w Delphi 7 ma import - on ma. Jeżeli u niego się to skompiluje to będę musiał znaleźć sposób na dodanie typu w Turbo. Dam znać o efektach.
  • #20 4913969
    machoney
    Poziom 15  
    Posty: 204
    Ocena: 4
    jest wszystko ok. Udało mi się dostać do WMI z poziomu Turbo Delphi. WbemScripting_TLB.pas wygenerował Delphi 7 łącznie z plikiem dcu. Po przekopiowaniu do folderu LIB dla Turbo wszystko się kompiluje. Aby dostać sie do WMI pomogła mi funkcja:
    
    function TForm1.GetWMIstring (wmiHost, wmiClass, wmiProperty : string):string; 
    var  // These are all needed for the WMI querying process 
      Locator:  ISWbemLocator; 
      Services: ISWbemServices; 
      SObject:  ISWbemObject; 
      ObjSet:   ISWbemObjectSet; 
      SProp:    ISWbemProperty; 
      Enum:     IEnumVariant; 
      Value:    Cardinal; 
      TempObj:  OleVariant; 
      SN: string; 
    begin 
      try 
      Locator := CoSWbemLocator.Create;  // Create the Location object 
      // Connect to the WMI service, with the root\cimv2 namespace 
       Services :=  Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '','', 0, nil); 
      ObjSet := Services.ExecQuery('SELECT * FROM '+wmiClass, 'WQL', 
        wbemFlagReturnImmediately and wbemFlagForwardOnly , nil); 
      Enum :=  (ObjSet._NewEnum) as IEnumVariant; 
      while (Enum.Next(1, TempObj, Value) = S_OK) do 
      begin 
        SObject := IUnknown(tempObj) as ISWBemObject; 
        SProp := SObject.Properties_.Item(wmiProperty, 0); 
        if VarIsNull(SProp.Get_Value) then 
          result := '' 
        else 
        begin 
          SN := SProp.Get_Value; 
          result :=  SN; 
        end; 
      end; 
      except // Trap any exceptions (Not having WMI installed will cause one!) 
       on exception do 
        result := ''; 
       end; 
    end; 
    


    którą należy wcześniej zadeklarować a do wywołania wpisujemy:

    
    Memo1.Text := getWMIstring('','Win32_BIOS','SerialNumber'); 
    


    WIELKIE DZIĘKI ROCH ZA POMOC I INSPIRACJĘ, ZA TO ŻE MNIE NIE ZOSTAWIŁEŚ W POTRZEBIE!! Pzd
  • REKLAMA
  • #21 5849589
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    mam rozumieć, że ktoś (lub aplikacja) musi podać ci nr seryjny biosu a Ty odsyłasz jemu klucz... to jest dobre rozwiązanie ale tylko i wyłącznie dla przejście z wersji demo / full ponieważ do tych wersji 30-dniowe to są darmowe narzędzia hakerskie, które dokładnie prześledzą podczas instalacji Twój program i jednym kliknięciem zrobią kolejne 30dni... śledzą one zmiany w rejestrze, dyskach itd... problem z kluczami pod konkretnego kompa jest również z większą ilością użytkowników programu gdzie musisz każdego obsłużyć ręcznie lub "półautomatycznie".... Sam czasem kombinuję jak się zabezpieczyć i szczerze ręce opadają.
  • #22 5866119
    Chris_W
    Poziom 39  
    Posty: 8418
    Pomógł: 379
    Ocena: 1033
    Tu jest poważna zaleta VB. Jego pseudo-skryptowe działanie jest trudne do 'łamania'. Pseudo-kodu nie da się tak łatwo rozgryźć.

Podsumowanie tematu

✨ Dyskusja dotyczy zabezpieczenia aplikacji demo napisanej w Delphi poprzez przypisanie klucza do sprzętu komputera, tak aby po 30 dniach użytkownik musiał wprowadzić klucz licencyjny. Użytkownik poszukuje trwałego identyfikatora sprzętowego, który nie zmienia się po formacie dysku, gdyż numer seryjny woluminu dysku (uzyskiwany np. funkcją GetVolumeInformation) jest zmienny i niewystarczający. Proponowano wykorzystanie numerów seryjnych BIOS-u, płyty głównej lub procesora, jednak implementacja w Turbo Delphi jest utrudniona ze względu na brak wsparcia dla importu bibliotek typów (np. WbemScripting_TLB) potrzebnych do korzystania z WMI (Windows Management Instrumentation). Wskazano na konieczność generowania plików .lib z DLL (np. wmiutils.dll) i importu typów w Delphi 7, co pozwala na dostęp do informacji sprzętowych przez WMI. Podano przykładową funkcję Delphi do pobierania danych z WMI. Alternatywnie zasugerowano użycie klucza sprzętowego USB (np. HASP HL Basic) jako zabezpieczenia. W dyskusji podkreślono, że zabezpieczenia oparte na kluczach sprzętowych są trudne do idealnego wdrożenia, a wersje demo można łatwo obejść za pomocą narzędzi hakerskich. Wspomniano także o zaletach języka Visual Basic w kontekście trudności łamania zabezpieczeń ze względu na pseudo-kod.
Wygenerowane przez model językowy.
REKLAMA