Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie kommen Buchstaben in eine Seriennummer? (https://www.delphipraxis.net/144832-wie-kommen-buchstaben-eine-seriennummer.html)

TheMiller 17. Dez 2009 18:51


Wie kommen Buchstaben in eine Seriennummer?
 
Hallo,

ich bin gerade dabei, einen Seriennummernschutz mit aktivierung zu programmieren. Ich habe jetzt mein erstes Projekt, was ich nicht einfach so für lau rausgeben will.

Nun würde ich gerne eine Seriennummer (Prinzip soweit klar und schon umgesetzt) mit Buchstaben und Zahlen erstellen. Und jetzt frage ich mich, wie die Buchstaben in der Seriennummer "errechnet", ausgewählt oder eingefügt werden. Also nach welchem Schema?

Wird zB eine Zahl errechnet, zB. 6 und dies ist dann der (26-6).Buchstabe des Alphabeten-Arrays oder so?

Wäre um ein paar Vorschläge dankbar!

Danke!

Progman 17. Dez 2009 19:15

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Vorschlag: Ein Array of Char ['0'..'9', 'A'..'Z'].
Dann immer zufällig ein Zeichen aus diesem Array "ziehen" und in deine Seriennummer einfügen.
Man kann dieses Array auch "durcheinanderwirbeln".
Ich habe das mal so gemacht, dass ich eine "Quersumme" über die Seriennummer errechnet habe, die aus der Summe von (Ord(Char) + Position im Array) bestand. Dann hab ich das 1000 mal durchlaufen lassen um die am meisten vorkommende "Quersumme" zu ermitteln.
Die habe ich dann zu Grunde gelegt, um aus einer Million "Ziehungen" nur die zu speichern, die diese "Quersumme" haben. So wurde die Prüfung auf Echtheit der Seriennummer garantiert. Es ergaben sich dann meist mehrere Tausend solcher Keys.
Wenn man das Quell-Array mit den Ursprungszeichen immer anders "durcheinanderbringt" hat man mit diesem Verfahren sehr viele Möglichkeiten, immer neue Keys (für z.B. andere Anwendungen) zu erstellen.

Micha88 17. Dez 2009 20:07

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Kleiner Tipp:

Wenn du einen solchen Schutz realisieren willst, würde ich dein "Vorhaben" NICHT hier öffentlich schreiben.
Ebenso würde ich keine Tipps aus dem Forum 1zu1 übernehmen.

Dann kannst du genau so gut einen Verschiebealgorythmus nehmen, der bringt genau soviel, und viel ist in diesem Sinne "nix".

TheMiller 17. Dez 2009 20:11

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Also, ich habe jetzt einen Algorithmus mit mathematischen Spielereien entwickelt. Die entstandene Serien-NUMMER überlagere ich dann quasi per Zufall mit Buchstaben aus einen indexierten Array.

Zum Beispiel:

Code:
1 = A, K, U
2 = B, L, V
3 = C, M, W
4 = ........
So kann ich dann, bevor ich die Seriennummer auf Korrektheit prüfe, die Buchstaben intern wieder in Zahlen umwandeln. Sollte doch so reichen, oder?

Blöd ist nur, dass die Buchstaben dann keinen eigentlichen Sinn haben, oder?

@MichaelLinden: Keiner kennt mein Programm ;) Außerdem verrate ich ja die mathematischen Berechnungen nicht.

-=Breeze=- 17. Dez 2009 20:23

Re: Wie kommen Buchstaben in eine Seriennummer?
 
BtW:
Dir bringt der komplizierteste Algorithmus nichts, wenn du nachher schreibst
Delphi-Quellcode:
if check(serial)=True then Starte_Programm;
Denn das kann jeder überspringen, der sich ein wenig auskennt ;)

Micha88 17. Dez 2009 20:33

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Zitat:

Denn das kann jeder überspringen, der sich ein wenig auskennt Wink
Stichwort: u.a. disassembler

- Umgehe direkte Vergleiche: if key then starte..;
- Umgehe Variablennamen wie: key, serial, seriennummer, generatedkey , usw
- Versuche den Key wenn schon in Form von char(65) + char(66) + char(67); (ABC) zu schreiben
statt ABC:

Progman 17. Dez 2009 20:40

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Zitat:

Zitat von MichaelLinden
Zitat:

Denn das kann jeder überspringen, der sich ein wenig auskennt Wink
Stichwort: u.a. disassembler

...
- Versuche den Key wenn schon in Form von char(65) + char(66) + char(67); (ABC) zu schreiben
statt ABC:

ähm....da macht aber der Compiler trotzdem "ABC" draus :)
Am Besten ist es, den Key gar nicht im Programm zu haben, sondern nach der Eingabe mit einer speziellen Berechnung (die auch recht kompliziert sein kann) auf Echtheit zu prüfen.

Namenloser 17. Dez 2009 20:42

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Zitat:

Zitat von MichaelLinden
- Versuche den Key wenn schon in Form von char(65) + char(66) + char(67); (ABC) zu schreiben

Das habe ich neulich in einem anderen Thread auch vorgeschlagen, es hat sich aber als wirkungslos herausgestellt, weil der Compiler dieses Konstrukt schon vor dem Compilieren evaluiert, sodass der Text am ende doch wieder im Klartext in der Exe steht. Da muss man shcon etwas kreativer werden.

Der einzige wirkliche Schutz wäre eh, die komplette Datei zu verschlüsseln und erst stückchenweise bei der Ausführung zu entschlüsseln. Auch das ließe sich zwar theoretisch umgehen, allerdings macht es afaik auch Skype so, das bisher immer noch als ungeknackt gilt. So ein Aufwand ist aber eigentlich immer unnötig.

Ich sehe schon wie wir hier wieder in die übliche Debatte zum Sinn und Unsinn von Kopierschutz hineinschlittern... :wink:

TheMiller 17. Dez 2009 20:51

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Vielen Dank für die Tipps...

Das mit dem Disassembler ist mir klar - kenne mich damit auch ein bissl aus. Nur ich weis nicht so recht, wie ich es sonst umgehen kann.

Die Aussage

Zitat:

Am Besten ist es, den Key gar nicht im Programm zu haben, sondern nach der Eingabe mit einer speziellen Berechnung (die auch recht kompliziert sein kann) auf Echtheit zu prüfen.
habe ich nicht ganz verstanden...
Wenn ich doch Seriennummern nach einem Algorithmus erstelle, kann ich sie doch auch wieder zurückrechnen. Jeder User soll seine persönliche Seriennummer bekommen. Wieso sollte ich jede persönliche Seriennummer im Programm speichern?

Micha88 18. Dez 2009 10:27

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Zitat:

mit einer speziellen Berechnung (die auch recht kompliziert sein kann) auf Echtheit zu prüfen.
So macht es Office 2007 bei Eingabe des Keys/Serials z.B.

Angel4585 18. Dez 2009 10:47

Re: Wie kommen Buchstaben in eine Seriennummer?
 
also wenn Buchstaben von A-Z, dann auf Unterscheidung 0(Zahl Null) und O(Buchstabe O) Rücksicht nehmen.
Ich würde hingehen und Kleinbuchstaben verwenden, so sieht man den Unterschied.
Oder was mir nochbesser gefällt: md5 hash :) Bzw z.B. bestimmte Teile daraus.
Du sagst zB das der Freischaltcode mit dem Namen verknüpft sein soll.
Den Namen muss man in der Software eingeben, z.B. Martin Weber
MD5-Hash von Martin Weber ist 481a6cc754f02475bc946bdfee3965f5
Daraus nimmst du jetzt z.B. die Stellen 1,3,7,9,12,17,21,24 und 29 => 41c50b6f6
Den Code muss man zusammen mit dem Namen im Programm eingeben um das Programm freizuschalten.

Ich weis, ist sehr schlicht und zusaätzlich zu dem Namen würd ich eventuell noch was anderes in den Hash reinmischen, aber für en kleines Programm reicht das allemal.

TheMiller 18. Dez 2009 10:51

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Das hört sich doch wunderbar an... Das ist auch eine sehr gute Idee. Da ich sowieso eine SN mit 5x5 Stellen haben möchte, kann ich ja einen Block komplett mit 5 fixen Stellen des MD5-Hashes füllen. Ich habe mehrere Informationen, die in den Hash einberechnet werden.

Sehr gute Idee, wenn man dies zusätzlich zu anderen Berechnungen benutzt. :thumb:

Mithrandir 18. Dez 2009 11:00

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Und damit man im Quellcode nicht die numerischen Werte sieht, die zur Heranziehung der Teile aus dem Hash benutzt werden, würde ich einfach eine kleine Primzahlberechnung einbauen. So könntest du dir ein Array mit den Ergebnissen der Primzahlen füllen, bspw. "2,3,5,7,11,13,17,19,23". Die Werte in dem Array dienen dann als Index. Wenn du ganz gemein bist, tauscht du die einzelnen Positionen nochmal, damit man die Reihenfolge nicht an einem MD5-Hash festmachen kann. ;)

Bspw.:
"2,3,5,7,11,13,17,19,23"
= Tausche um die Mitte =
"13,17,19,23,11,2,3,5,7"

usw...

TheMiller 18. Dez 2009 11:04

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Ehm, Prinzip verstanden, aber wie genau meinst du das mit der Primzahlenberechnung? (Ja, ich kenne Primzahlen ;))

Mithrandir 18. Dez 2009 11:37

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Hm... Naja, angenommen du setzt den Vorschlag um, den der Engel gebracht hat. Dann sähe das in Delphi in etwa so aus:

Delphi-Quellcode:
key := md5str[1] + md5str[3] + md5str[7]; //usw...
Ich weiß jetzt nicht, wie das im Disassembler aussähe, aber ich könnte mir vorstellen, dass man so relativ schnell erkennt, auf welche Elemente zugegriffen wird.

Daher war meine Idee, Primzahlen als Zugriff auf die einzelnen Elemente zu nutzen. Sagen wir, dein Key soll 6 Stellen haben, dann könnte eine Schleife so aussehen:

Delphi-Quellcode:
var
prime: integer;
idx,n: integer;

//[...]

key := '';
idx := 3;

for i := 0 to 5 do
begin
 repeat
  idx := idx + 2; //nur ungerade Zahlen
 until isPrimzahl(idx);
 key := key + md5str[idx];
end;
Die Funktion isPrimzahl prüft, ob eine Zahl eine Primzahl ist. Ist sie das, so wird sie als Index verwendet. Ist sie es nicht, wird die nächste ungerade Zahl getestet. Zum Test auf Primzahl fällt mir jetzt Miller-Rabin ein. Hier gibst was gut lesbares und lesenswertes dazu [PDF].

Und ich denke, für den Miller-Rabin-Test wird sich bestimmt eine Implementation in Pascal finden lassen.

Das Ziel ist eigentlich, dem Hacker oder RE die Arbeit möglichst aufwändig zu gestalten, indem man möglichst viele Berechnungen mit möglichst vielen Sprüngen (Bedingungen, Schleifen) einbaut. Die Script Kiddies werden so schnell aufgeben, da ihnen dass dann zu mühsam wird. Es soll aber auch exemplare geben, die durch sowas erst richtig aufblühen. :mrgreen:

Ich hoffe, meine geistigen Ergüsse waren etwas verständlich. :stupid:

TheMiller 24. Dez 2009 15:08

Re: Wie kommen Buchstaben in eine Seriennummer?
 
@Daniel G:
Danke für die tolle Erklärung. Das muss ich mir aber nochmal genauer ansehen ;)

@All:
Was ich bisher noch nicht verstanden habe ist folgende Sache: Oben hieß es, man solle Vergleiche vermeinden wie "if check(serial)=True then Starte_Programm;". Ist ja logisch, aber irgendwie muss ich doch prüfen, ob die SN gültig ist. Das kann ich ja in mehreren Prozeduren/Methoden machen, aber if-Vergleiche wie (if CheckBlock(1) = true) werde ich immer haben, oder?

Namenloser 24. Dez 2009 15:19

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Zitat:

Zitat von DJ-SPM
@All:
Was ich bisher noch nicht verstanden habe ist folgende Sache: Oben hieß es, man solle Vergleiche vermeinden wie "if check(serial)=True then Starte_Programm;". Ist ja logisch, aber irgendwie muss ich doch prüfen, ob die SN gültig ist. Das kann ich ja in mehreren Prozeduren/Methoden machen, aber if-Vergleiche wie (if CheckBlock(1) = true) werde ich immer haben, oder?

Nein, du kannst den Code mit der Seriennummer (bzw. einem daraus errechneten Wert) verschlüsseln. Zusätzlich solltest du irgendwo noch eine Checksumme ablegen, damit nicht bei falsch eingegebener Nummer irgendein Quark ausgeführt wird.

Ich stelle mir das aber nicht ganz trivial vor...

Mr_G 24. Dez 2009 22:00

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Es gibt nunmal ein par Tricks wie man das aushelben eines solchen Schutzes erschweren kann. Einer davon ist unter diesem Artikel zu finden.
Im übrigen habe ich mir sagen lassen, dass das packen der (gesamten) EXE mit gängigen Packern quasi gar kein Hindernis darstellt. Auf virustotal.com lassen z.B. die meisten schon identifizieren. Einen Unpacker zu finden ist dann eine Sache von einer google-Anfrage...

generic 26. Dez 2009 14:22

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Viele Interessante Ansätze hier.

Die meisten Seriennummern mit Buchstaben sind einfach nur eine andere Darstellung für Binärdaten.
Dieses kannst du vergleichen mit einer Base64 oder UUencode Kodierung.

Die Kodierung erfolgt allerdings etwas mit Verstand. Die zur Verfügung stehenden Buchstaben und Zahlen sind so gewählt das Verwechselungen beim abschreiben, nicht vorkommen sollten.
So kommen z.B. meist nicht 1,l und I vor.

Wenn du 32 Zeichen zusammen bekommst, dann kannst du damit je Zeichen 5 Bit kodieren.

In den Binärdaten sind fortlaufende Nummern abgelegt plus Prüfsummen und/oder Signaturen.

1carter1 28. Dez 2009 11:13

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Zitat:

indem man möglichst viele Berechnungen mit möglichst vielen Sprüngen (Bedingungen, Schleifen)
nunja da müssten es wirklich sehr viele jumps geben, dass da wirklich jemand aufhört, der das ding knacken will.

Aber mal b2t

Ne weitere idee wäre evtl noch nen PhP Backend miteinzubauen, wie das genau aussehen soll, darüber habe ich mir jetzt nicht ernsthaft gedanken gemacht aber wenn man für dein Programm sowieso Internet braucht, wäre nen zusätzlicher Schutz durch nen WebBackend nicht das schlechteste, da ließen sich dann ja unbegrenzte schutzmöglichkeiten aufstellen (Programm nur durch login,Hardware ID abfrage usw)

mfg carTer

Viktorii 28. Dez 2009 11:22

Re: Wie kommen Buchstaben in eine Seriennummer?
 
[quote="MichaelLinden"]
Zitat:

- Umgehe Variablennamen wie: key, serial, seriennummer, generatedkey , usw

Sind Variablennamen im Kompilat wiederzufinden?

himitsu 28. Dez 2009 11:48

Re: Wie kommen Buchstaben in eine Seriennummer?
 
Delphi-Quellcode:
uses ComObj;

type TSerial = TGUID;
  //TSerial = packed array[0..3] of LongWord;
  //TSerial = packed array[0..15] of Byte;
  //TSerial = packed record
  //  W0: LongWord;
  //  i1: LongInt;
  //  W2: LongWord;
  //  W3: LongWord;
  //end;
  //TSerial = packed record
  //  D1: LongWord;
  //  D2: Word;
  //  D3: Word;
  //  D4: array[0..7] of Byte;
  //end;

function SerialToStr(Serial: TSerial): String;
begin
  Result := Copy(GUIDToString(TGUID(Serial)), 2, 36);
end;

function StrToSerial(const S: String): TSerial;
begin
  try
    Result := TSerial(StringToGUID('{' + S + '}'));
  except
    ZeroMemory(@Result, SizeOf(TSerial));
  end;
end;
solange TSerial genau 16 Byte groß ist, kannst du es definieren, wie du willst

im Programm dann einfach StrToSerial aufrufen und danach dann einfach nur noch die "Integer" in der Serial irgendwie mathematisch verknüpfen.

Zitat:

Zitat von MichaelLinden
- Versuche den Key wenn schon in Form von char(65) + char(66) + char(67); (ABC) zu schreiben
statt ABC:

wurde schon gesagt

Zitat:

Zitat von MichaelLinden
- Umgehe Variablennamen wie: key, serial, seriennummer, generatedkey , usw

im Kompilat gibt es keine Variablennamen mehr ... also ist das vollkommen egal.

Klassennamen werden aber in der RTTI gespeichert, daher sollte man eine Serialprüf-/Verwaltungsklasse anders nennen


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 Uhr.

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