Avatar billede mads-j Nybegynder
25. december 2001 - 19:15 Der er 12 kommentarer

På den igen:-)

Jeg har engang set en artikel på en af de store delphi sites, der omhandler hvordan man beskytter sine programmer, med en kode som brugeren skal have fra producentens hjemmeside...altså en form for registring af programmet, så producenten kan se hvor mange der bruger deres program, det så jeg en tutirial om hvordan man lavede, men fik smidt linket væk..

nogle der har en ide til hvordan man gør dette?
eller har nogle gode links?

mads-j
Avatar billede razersedge Nybegynder
25. december 2001 - 21:56 #1
lytter
Avatar billede jekk Nybegynder
26. december 2001 - 02:52 #2
Der er sikkert utoligt mange måde at gøre det på, men her et forslag til løsningsplan:
1. fastlæg en \"simpel\" kodestrategi - så også du kan huske den, hvis du bliver vækket midt om natten!
2. på nettet har du lavet noget asp / javascript, som dekoder programmets kode - f.eks. når programmet starter, så oplyser det den kode, der skal dekodes (via nettet) - åbningskoden taster brugeren så ind i dit program, her checker du om det er ok, og \"markerer\", at nu er programmet køreklart !

jeg har leget lidt med tekniken, men pt. skal brugeren ringe til mig for at få en åbningskode, der matcher med programmets kode...
den skal jeg snart ha\' lagt ud på nettet!

som det fremgår, er der flere ting, der skal afklares inden det falder på plads ...
Avatar billede mads-j Nybegynder
26. december 2001 - 12:39 #3
ja det kan jeg godt se, tror lige jeg holder mig til det lidt mere simple indtil jeg har mere styr på delphi så:-)
Avatar billede borrisholt Novice
27. december 2001 - 10:44 #4
prøv den her :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  GUID : String = \'{300C7CF3-98E9-4EBD-B7AC-8D3AC93FF4A9}\';//Find på din egen tryk Shift + Ctrl + g
  EvalTid = 10; //10 dage
type
  TMyDataStruct = packed record
    Nonsens : ShortString;
    InstDate : TDateTime;
  end;

procedure TForm1.FormCreate(Sender: TObject);
  function DayDiff(Beginning: TDateTime; Ending:TDateTime): integer;
  begin
    Result := Trunc(Ending -Beginning);
  end;
var
  i : Integer;
  MyDataStruct : TMyDataStruct;
  Registry : TRegistry;

begin
  Registry := TRegistry.Create;
  Randomize;

  with Registry do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OPenKey(\'CLSID\', false);
    if not OPenKey (GUID, false) then
    begin
      OpenKey(GUID, true);
      i := Random(255);
      repeat
        MyDataStruct.Nonsens[i] := chr(Random(233) + 32);
        dec(i);
      until i = 1;
      MyDataStruct.InstDate := Now;
      OpenKey (\'InprocServer32\',true);
      WriteBinaryData(\'\',MyDataStruct, SizeOf(MyDataStruct));
      Destroy;
    end
    else
    begin
      OpenKey(GUID, false);
      OpenKey (\'InprocServer32\',false);
      ReadBinaryData(\'\',MyDataStruct, SizeOf(MyDataStruct));
      i := DayDiff(NOW, MyDataStruct.InstDate);

      if i < 0  then
      begin
        MessageDlg(\'Du fusker med datoen din nar !!!!!!\', mtError, [mbOk], 0);
        Application.Terminate;
      end;

      if i > EvalTid then
      begin
        MessageDlg(\'Game over !!!!!!\' + #13 + \'Nu skal du købe !!!!\', mtError, [mbOk], 0);
        Application.Terminate;
      end;

      i := EvalTid - i;
      MessageDlg(\'Du har nu \'+IntToStr(i)+\' Dage tilbage  !!!!!!\', mtError, [mbOk], 0);
      Destroy;
    end;
  end;
end;
end.

Sådan lidt fridt fra leveren !

Jens B
Avatar billede borrisholt Novice
27. december 2001 - 10:44 #5
Frit UDEN d :-)

Jens B
Avatar billede borrisholt Novice
27. december 2001 - 11:01 #6
du kan også bygge en anelse sikkerhed ind i din dims :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Procedure FastDeCrypt(ptrBuffer : Pointer; iSize : Integer; uiInit : Byte = $00);
    procedure FastCrypt(ptrBuffer : Pointer; iSize : Integer; uiInit : Byte = $00);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  GUID : String = \'{300C7CF3-98E9-4EBD-B7AC-8D3AC93FF4A9}\';//Find på din egen tryk Shift + Ctrl + g
  EvalTid = 10; //10 dage
type
  TMyDataStruct = packed record
    Nonsens : ShortString;
    InstDate : TDateTime;
  end;

procedure TForm1.FastCrypt(ptrBuffer: Pointer; iSize: Integer;  uiInit: Byte);
var
  iIdx      : Integer;
  uiCurrByte : Integer;
  uiLastByte : Integer;
begin
  uiLastByte := 0;

  for iIdx := 1 to iSize do
  begin
    uiCurrByte := Byte(ptrBuffer^);
    uiCurrByte := uiCurrByte xor uiLastByte;
    uiCurrByte := not uiCurrByte;
    uiCurrByte := uiCurrByte xor uiInit;
    uiCurrByte := ((uiCurrByte and $0F) shl 4) or ((uiCurrByte and $F0) shr 4);
    uiLastByte := uiCurrByte;
    Char(ptrBuffer^) := Char(uiCurrByte);
    inc(pChar(ptrBuffer));
  end;
end;

procedure TForm1.FastDeCrypt(ptrBuffer: Pointer; iSize: Integer; uiInit: Byte);
var
  iIdx      : Integer;
  uiCurrByte : Byte;
  uiLastByte : Byte;
begin
  uiLastByte := 0;
  for iIdx := 1 to iSize do
  begin
    uiCurrByte := Byte(ptrBuffer^);
    uiCurrByte := ((uiCurrByte and $0F) shl 4) or ((uiCurrByte and $F0) shr 4);
    uiCurrByte := uiCurrByte xor uiInit;
    uiCurrByte := not uiCurrByte;
    uiCurrByte := uiCurrByte xor uiLastByte;
    uiLastByte := Byte(ptrBuffer^);
    Char(ptrBuffer^) := char(uiCurrByte);
    inc(pChar(ptrBuffer));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
  function DayDiff(Beginning: TDateTime; Ending:TDateTime): integer;
  begin
    Result := Trunc(Ending -Beginning);
  end;
var
  i : Integer;
  MyDataStruct : TMyDataStruct;
  Registry : TRegistry;

begin
  Registry := TRegistry.Create;
  Randomize;

  with Registry do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OPenKey(\'CLSID\', false);
    if not OPenKey (GUID, false) then
    begin
      OpenKey(GUID, true);
      i := Random(255);
      repeat
        MyDataStruct.Nonsens[i] := chr(Random(233) + 32);
        dec(i);
      until i = 1;
      MyDataStruct.InstDate := Now;
      MyDataStruct.InstDate := MyDataStruct.InstDate + Integer(MyDataStruct.Nonsens[Integer(MyDataStruct.Nonsens[15])]);
      FastCrypt(@MyDataStruct,SizeOf(TMyDataStruct));
      OpenKey (\'InprocServer32\',true);


      WriteBinaryData(\'\',MyDataStruct, SizeOf(MyDataStruct));
      Destroy;
    end
    else
    begin
      OpenKey(GUID, false);
      OpenKey (\'InprocServer32\',false);
      ReadBinaryData(\'\',MyDataStruct, SizeOf(MyDataStruct));
      FastDeCrypt(@MyDataStruct,SizeOf(TMyDataStruct));

      MyDataStruct.InstDate := MyDataStruct.InstDate  - Integer(MyDataStruct.Nonsens[Integer(MyDataStruct.Nonsens[15])]);
      i := DayDiff(NOW, MyDataStruct.InstDate);

      if i < 0  then
      begin
        MessageDlg(\'Du fusker med datoen din nar !!!!!!\', mtError, [mbOk], 0);
        Application.Terminate;
      end;

      if i > EvalTid then
      begin
        MessageDlg(\'Game over !!!!!!\' + #13 + \'Nu skal du købe !!!!\', mtError, [mbOk], 0);
        Application.Terminate;
      end;

      i := EvalTid - i;
      MessageDlg(\'Du har nu \'+IntToStr(i)+\' Dage tilbage  !!!!!!\', mtError, [mbOk], 0);
      Destroy;
    end;
  end;
end;
end.

Jens B
Avatar billede mads-j Nybegynder
27. december 2001 - 12:12 #7
hehe jens, det er da vist en rimlig advanceret kode

Lidt spørgesmål

Hvad gør denne kode præsist?GUID : String = \'{300C7CF3-98E9-4EBD-B7AC-8D3AC93FF4A9}\';//Find på din egen tryk Shift + Ctrl + g
  hvad skal jeg gøre her?

Og hvordan kan jeg gøre følgende

Jeg har en mail form der sender brugeren en email, men der skal der jo være en kode man skal indtaste et sted

nogle ide?
Avatar billede borrisholt Novice
27. december 2001 - 12:18 #8
Det her kode laver til program om til Shareware .... Jeg gemmer en nøgle i reg. et sted hvor den er godt skjult .... Nemlig sammen med alle de Class ID\'er der er registeret nede i reg.

Det jeg mener er du skal finde på dit eget \"GUID\" nummer, i stedet for \"MIT\", det gør du ved at trykke \"Shift + Ctrl + g\"

Jens B
Avatar billede mads-j Nybegynder
27. december 2001 - 12:23 #9
dette guid nummer, er det et der forandre sig hver gang, eller er det altid det samme?

shift ctrl g hvor skal jeg skrive det
Avatar billede borrisholt Novice
27. december 2001 - 12:24 #10
Det jeg har vist dig er den basale teknik til at lave sådan en shareware program ... Det er tænkt som inspiration til det endelige program ....

Jeg vil ikke lave programmet forr dig .. Du har så godt af at kunne lave etræsonoment .. Men inden for en halv time burde du have sådan en reg kode fætter i luften.

Jens B
Avatar billede borrisholt Novice
27. december 2001 - 12:27 #11
du skal bruge dine fingere ...

Jeg anbefaler højre tommerfinger til CTRL tasten i højre side af dit keyboard, ligeledes anbefaler jeg pege fingeren på højrehånd til at hold højre shift taste nede ... Så har du pegefingeren fri på venstrehånd til at trykke på g.

Det GUID nummer er forskelligt for hvert nyt projekt du bruger denne teknik i. Derfor skal du også skifte nummeret ud i det kode du har fra mig.

Jens B
Avatar billede mads-j Nybegynder
27. december 2001 - 12:28 #12
oki doki, jeg kigger lige på det:_)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester