![]() |
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. |
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.) |
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 ;)
|
AW: Seriennummer Sicherheit
Zitat:
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:
Nutzt das denn etwas ? |
AW: Seriennummer Sicherheit
Zitat:
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. ![]() |
AW: Seriennummer Sicherheit
jupp, beide Zeichenfolgen sehen im Kompilat (der EXE) genau gleich aus.
Delphi-Quellcode:
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.
sRef: array [1..22] of Byte = ($69, $63, $72, $6F, $73, $6F, $66, ...);
// enspricht sRef: AnsiString = 'icrof...'; 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. |
AW: Seriennummer Sicherheit
Zitat:
Immer noch besser als
Delphi-Quellcode:
OpenKey('Dingens-Software.de', false)
|
AW: Seriennummer Sicherheit
Tut mir Leid, aber was ist, das ist!
|
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.. |
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:
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 06:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz