Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Seriennummer Sicherheit (https://www.delphipraxis.net/160684-seriennummer-sicherheit.html)

Bjoerk 27. Mai 2011 18:09

AW: Seriennummer Sicherheit
 
Ich mache es so: Ich liefere mit Dongle aus. Manche Kunden lehnen Dongle jedoch kategorisch ab.

Dann mache ich es so:
Setup speichert einen Zufallsstring. Das Programm liest den String und möchte einen GegenCode zur Aktivierung. Diesen gibt es bei uns per Mail.

Nachteil: Der GegenCode ist auf der Kiste des Anwenders und wer ihn finden will, findet ihn auch.
Ein Hacker sucht aber normalerweise nur ein paar Tage, dann hat er kein Lust mehr.

Dein Programm muß so gestaltet sein, daß es diese Tage übersteht. Dazu gehört (mindestens), daß alle die Aktivierung betreffenden strings im Programm hexadezimal stehen.

himitsu 27. Mai 2011 21:50

AW: Seriennummer Sicherheit
 
Was meinst du mit hexadezimal?
Mal an einem Codebeispiel gesehn.

Wenn es wirklich so einkompiliert wurde, dann findet man das schneller, als wenn es irgendwo binär kodiert wurde, da eine reihe von hexadezimalen Zeichen zwischen den vielen Binärdaten schön auffällt.
Abgesehn davon, daß Hexadezimal doppelt so lang ist und somit doppelt so leicht entdeckt werden kann. ('nen billiger XOR-manipulierter Wert fällt dagegen viel weniger auf, wenn überhaupt)

Installierst du dann das Programm selber?
Wenn der String irgendwo von dem Setup gespeichert wird und wenn du da nicht danebenstehst/zuguckst, dann dauert es keine 10 Sekunden und der String ist gefunden >>> brauch mir ja nur Loggen lassen, was dein Setup wo hinschreibt. (Sysinternals) :angle2:
Wenn man dagegen den "String" aus partiell statischen Zufallswerten des Systems berechnet wird, dann muß man nichts verstecken. (Seriennummer der HDD, CPU und Co.)

OldGrumpy 27. Mai 2011 21:58

AW: Seriennummer Sicherheit
 
Ich habe einige Produkte im Markt bei denen jede Kundenversion stark personalisiert ist. Die Arbeit die dafür in die Build-Umgebung investiert werden musste, hat sich rentiert: Selbst von der Soft die am längsten so ausgeliefert wird, gibts keine geleakten Versionen seit diese Strategie gefahren wird. Und wenn mal eine auftauchen sollte, wäre es relativ einfach, herauszufinden wer dafür verantwortlich ist (ja, ich weiss, zur Rechenschaft ziehen könnte trotzdem illusorisch sein, aber...). Durch Continuous Integration ist es ausserdem selbst dann aufwendig, Schutz von Nutzlast zu trennen wenn man doch mehrere Versionen eingesammelt hat und die vergleichen will. Ist aber natürlich nix für die eigene Hobby-Software, dafür steckt dann doch ein bissl viel Arbeit drin ;)

Bjoerk 28. Mai 2011 11:18

AW: Seriennummer Sicherheit
 
Zitat:

Was meinst du mit hexadezimal?
ich habe es so, ist das leicht zu erkennen?

const
sRef: array [1..52] of Byte =
($69, $63, $72, $6F, $73, $6F, $66, $74, $5C, $57,
$69, $6E, $64, $6F, $77, $73, $5C, $43, $75, $72,
$72, usw..

die Entschlüsselungsroutine läuft über Ord xor Ord.

Zitat:

Seriennummer der HDD, CPU und Co.)
Der Gegencode muß doch auch irgendwo gespeichert werden.
Nutzt das denn etwas ?

Aphton 28. Mai 2011 11:27

AW: Seriennummer Sicherheit
 
Zitat:

Zitat von Bjoerk (Beitrag 1103362)
Dazu gehört (mindestens), daß alle die Aktivierung betreffenden strings im Programm hexadezimal stehen.

Totaler Blödsinn!!!

Mach mal ein
Delphi-Quellcode:
const
  sRef: array [0..21] of Byte =
($69, $63, $72, $6F, $73, $6F, $66, $74, $5C, $57,
$69, $6E, $64, $6F, $77, $73, $5C, $43, $75, $72,
$72, $00); // "usw" abgeschnitten..

begin
  writeln(pchar(@sRef));
  readln;
end.
Begründung

himitsu 28. Mai 2011 11:50

AW: Seriennummer Sicherheit
 
jupp, beide Zeichenfolgen sehen im Kompilat (der EXE) genau gleich aus.
Delphi-Quellcode:
sRef: array [1..22] of Byte = ($69, $63, $72, $6F, $73, $6F, $66, ...);
// enspricht
sRef: AnsiString = 'icrof...';
Und wenn man diesen Text jetzt irgendwie nochmal umwandelt (z.B. über XOR), dann steht der Text unverschlüsselt im RAM und man kann ihn von da auslesen.

Darum sollte man sowas niemals entschlüsseln.
Was dagegen schonmal einen Hauch sicherer ist, wenn man das eingegebene Passwort/Serial verschlüsselt und dann hiermit vergleicht.

Bjoerk 28. Mai 2011 11:55

AW: Seriennummer Sicherheit
 
Zitat:


Totaler Blödsinn!!!

Aua !!

Immer noch besser als

Delphi-Quellcode:
OpenKey('Dingens-Software.de', false)

Aphton 28. Mai 2011 11:57

AW: Seriennummer Sicherheit
 
Tut mir Leid, aber was ist, das ist!

Bjoerk 28. Mai 2011 12:05

AW: Seriennummer Sicherheit
 
Dann kann ich meine Aladdin Dongle auch gleich wegschmeißen, der Vendorcode von denen steht genau so in der Unit, die man einbinden soll. :shock:

Delphi-Quellcode:
const
  vendor_code: array[1..519] of Byte =
(
  $c8, $7a, $9c, $29, $87, $ff, $40, $f3,
  $47, $a0, $83, $2a, $eb, $df, $d0, $88,
  $08, $4d, $c3, $72, $91, $f3, $21, $cf,
  $65, $a8, $61, $ff, $40, $1c, $05, $b0,
  $58, $09, $e2, $f3, $25, $ee, $ee, $4f,
  $67, $a2, $e0, $6a, $18, $b7, $2f, $67,
  $59, $81, $50, $4e, $c9, $7c, $38, $15,
  $df, $0d, $04, $30, $96, $d7, $55, $6f,
  $83, $9b, $4f, $81, $b4, $8e, $c7, $21,
  $eb, $27, $8f, $c6, $28, $0c, $b5, $0e,
  $42, $c0, $c3, $7d, $4d, $67, $99, $87,
  $6b, $06, $4b, $24, $cb, $28, $41, $2e,
  usw.. );

himitsu, Aphton, trotzdem Danke für eure Hinweise.

showmessage (pchar(@zRef)) macht mich fertig..

geskill 28. Mai 2011 15:24

AW: Seriennummer Sicherheit
 
Ich habe das bei mir so gelöst:

Kunde kauft Software und bekommt einen Aktivierungsschlüssel per Mail. Damit kann er nun einen Account erstellen oder einen vorhandenen verlängern. Bei jedem Programmstart loggt sich der Kunde ein.
Einige werden jetzt sagen und was passiert, wenn der Server ausfällt? Nach jedem Login wird auf dem lokalen PC eine Lizenzdatei erstellt, die bei mir X Tage gültig ist. So hat man genügend Zeit um Serverprobleme zu lösen. Man könnte natürlich auch die EXE so modifizieren, dass man direkt eingeloggt ist. Dazu prüfe beim Programmstart ob die initialisierten Werte passen. Eine weitere Möglichkeit wäre ein Serveremulator, dazu gibt es weitere Möglichkeiten der Absicherung. Ich will jetzt aber hier nicht alles im Detail erklären.

Hier noch ein paar Tipps:
  • Benutze keine Aussagekräftigen Prozeduren/Variablen Namen
  • Programmiere richtig aber "schluderig" xD => Spagetticode
  • Wiederhole Prüfungen (gerne auch an verschiedenen Stellen)
  • Vermeide Fehlermeldungen a la Seriennummer ist falsch (Hacker weiß dann sofort wo er suchen muss ;) )

Und das wichtigste: Alles dokumentieren, spätestens nach 3 Monaten weißt du nicht mehr wie es funktioniert!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.
Seite 3 von 6     123 45     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz