Seriennummer Abfrage

  • Hallo Leute,

    ich habe mir mal aus Langeweile ein Skript erstellt,
    mit dem man eine Seriennummerabfrage machen kann.
    Jeder PC auf dem dieses ausgeführt wird, bekommt seine
    eigene Produkt-Nummer. Auf Basis dieser wird dann eine
    Seriennummer generiert.

    Skript
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #Include <String.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $PW1 = "VerschlüsselungsPasswort1"
    $PW2 = "VerschlüsselungsPasswort2"
    $RegPath = "HKEY_CURRENT_USER\Software\SerialTest" ;Am besten irgendwo hin, wo es niemand findet
    $RegName = "SerialTest" ;Am besten ein verschlüsselter String (wirre Zeichenkombination)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Seriennummer", 256, 112)
    GUICtrlCreateLabel("Produkt-Nummer:", 8, 8, 86, 15)
    $ProdNrInput = GUICtrlCreateInput(_GetProductNr(), 8, 24, 241, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlCreateLabel("Seriennummer:", 8, 48, 74, 15)
    $SerialNrInput = GUICtrlCreateInput("", 8, 64, 241, 21)
    $ButtonCheck = GUICtrlCreateButton("Check", 176, 88, 74, 17)
    $ButtonClear = GUICtrlCreateButton("Registry leeren", 8, 88, 80, 17)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    $Form2 = GUICreate("Korrekte Seriennummer", 257, 55)
    GUICtrlCreateLabel("Korrekte Seriennummer:", 8, 8, 117, 15)
    $CorrectSerialNrInput = GUICtrlCreateInput(_GetSerialNr(), 8, 24, 241, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonCheck
    _CheckSerial($SerialNrInput)
    Case $ButtonClear ;Um neue Produktnummer zu generieren
    RegDelete($RegPath , $RegName)

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetProductNr()
    $RegProdNr = RegRead($RegPath , $RegName)
    If $RegProdNr = "" Then
    $ProductNr = Random(1000000000,9999999999, 1) ;Produktnummer wird Generiert (Pro PC unterschiedlich)
    RegWrite($RegPath , $RegName, "REG_SZ", _StringEncrypt(1, $ProductNr, $PW1, 2) & Random(10,99,1)) ;$SerialPosition wird hinten angehängt (Serials ähneln sonst zu stark)
    Else
    $ProductNr = _StringEncrypt(0, StringTrimRight($RegProdNr, 2), $PW1, 2)
    EndIf
    Return $ProductNr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetSerialNr()
    Local $CorrectSerialNr = ""
    $RegProdNr = RegRead($RegPath , $RegName)
    $SerialPosition = StringRight($RegProdNr, 2)
    $RegProdNr = StringTrimRight($RegProdNr, 2)
    $ProductNr = _StringEncrypt(0, $RegProdNr, $PW1, 2)
    $Serial = _StringEncrypt(1, $ProductNr, $PW2, 3)
    $Serial = StringTrimLeft(StringLeft($Serial, $SerialPosition + 20), $SerialPosition)
    For $i = 1 To 4
    If $i < 4 Then
    $CorrectSerialNr &= StringTrimLeft(Stringleft($Serial, $i * 5), $i * 5 - 5) & "-"
    Else
    $CorrectSerialNr &= StringTrimLeft(Stringleft($Serial, $i * 5), $i * 5 - 5)
    EndIf
    Next
    Return $CorrectSerialNr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CheckSerial($CheckSerialInput)
    If GUICtrlRead($CheckSerialInput) = _GetSerialNr() Then
    MsgBox(0, "Test", "Korrekt")
    Else
    MsgBox(0, "Test", "Falsch")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Um eine neue Produkt-Nummer zu erstellen, einfach
    auf "Registry leeren" im Programm klicken.


    MfG
    qixx

  • Nette Idee allerdings in Autoit auch überflüssig, da eh jeder den Code verändern kann der es will ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Da unterliegst du aber einem gewaltigen Irrtum, nur weil es von offizieller Seite keinen mehr gibt, heißt es nicht das keiner existiert.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Du kannst die exe decompilieren und siehst den Code dann im Klartext.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Es ist zwar eine gute Idee, aber für AutoIt ungeeignet, da es wie bereits gesagt einen Decompiler gibt. Nach wie vor.
    Jeder der das Wissen hat, nach etwas zu googeln kommt leicht an diesen ran.
    Auch obfuscatede Skripte kann der Decompiler in die Originalversion zurückversetzen, was den Ofuscator eigentlich nutzlos bzw. überflüssig macht.
    Eine mit AutoIt erstellte *.exe ist daher immer unsicher, es sei denn, man verändert die *.exe.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Welche Sprache ist denn dafür geeignet?

    Jeden Code kann man reversen, ob nun AutoIt, C/C++, Delphi, Assembler, etc. und z.B. einen Keygenerator erstellen!

    Mag sein, dass es in AutoIt etwas leichter geht...


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ du willst doch jetzt nicht ernsthaft Autoit und Assembler auf eine Stufe stellen? Es ist schlicht Fakt, dass so etwas wie eine Seriennummer Abfrage in Autoit zu machen humbug ist weil es wirklich jeder und noch dazu im Klartext decompilieren kann.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    2 Mal editiert, zuletzt von chip (16. September 2010 um 08:20)

  • Zitat

    UEZ du willst doch jetzt nicht ernsthaft Autoit und Assembler auf eine Stufe stellen? Es ist schlicht Fakt, dass so etwas wie eine Seriennummer Abfrage in Autoit zu machen humbug ist weil es wirklich jeder und noch dazu im Klartext decompilieren kann.


    Du muss über den Tellerrand hinausschauen! Es ist kein Vergleich zwischen Assembler und AutoIt, sondern das jeder Code knackbar ist, unabhängig von der Programmiersprache!

    Mit jedem Disassembler kann ich auch in den Assembler Code reinschauen und den Code nachvollziehen!


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Mit jedem Disassembler kann ich auch in den Assembler Code reinschauen und den Code nachvollziehen!


    Dem kann ich nur voll zustimmen. Wenn man durch den Spaghetticode durchblickt (was mit ein wenig Übung gar nicht so schwer ist), kann man recht problemlos jeden Produktkey, jedes Passwort oder was auch immer den Zugang zu einem Programm beschränken soll ausfindig machen. Die dafür notwendigen Programme sind auch völlig legal. Somit sind m.M. Passwortbeschränkungen nur geeignet um völlig programmiertechnisch unbedarfte Personen außen vorzuhalten. Wer dies umgehen will findet immer Mittel und Wege.
    Mein Tipp daher:
    Gestaltet eure Software immer als OpenSource. Wenn dies von allen so gehandhabt wird, haben wir ein reges Geben und Nehmen von dem alle profitieren (und lernen) können. :thumbup:

  • [...]kann man recht problemlos jeden Produktkey, jedes Passwort oder was auch immer den Zugang zu einem Programm beschränken soll ausfindig machen.


    So programmiert man ja auch nicht!
    Es wäre dumm ein Passwort direkt im Quelltext zu schreiben und eingegebene Passwörter dann damit zu vergleichen.
    Es wird in der Regel eine Hash-Summe hinterlegt und eine Berechnungsvorschrift.
    Für ein eingegebenes Passwort wird dann eine Hashsumme berechnet und wenn diese mit der internen übereinstimmt ist das Passwort korrekt.
    Wenn man nun mit einem Disassembler (was nach eurer Aussage ja ein Kinderspiel ist) die nötige Hashsumme ausliest kann man damit immer noch nicht das Programm knacken - denn Rückschlüsse auf das Passwort lässt dies nur zu wenn die Hashfunktion invertierbar ist und man sich aus einer Hashsumme ein Passwort berechnen kann.
    Allerdings gibt es, wenn man bisschen in Mathe aufgepasst hat, Funktionen welche nicht invertierbar sind...

    Also keine Ahnung wie Programme generell unsicher werden nur weil man ihre Funktionsweise nachvollziehen kann.
    Es gibt sicheren und es gibt unsicheren Code - sicher ist Code wenn seine Schutzfunktion immer noch Bestand hat auch wenn man den Code kennt.

    Einmal editiert, zuletzt von AspirinJunkie (16. September 2010 um 11:35)

  • Zitat

    Allerdings gibt es, wenn man bisschen in Mathe aufgepasst hat, Funktionen welche nicht invertierbar sind...

    was dich nicht dagegen schützt, mit einem einfachen Abändern der Sprungadresse die "Passwortabfrage" (incl sämtlicher von dir beschriebenen "Schutzfunktionen") auszuhebeln. Genau aus diesem Grund verschwanden auch die schweineteuren Hardware-Dongles (erinnert sich noch jemand an reihenweise aufeinandergesteckte Dongles an der parallelen Schnittstelle^^ ? )
    Fakt ist, man kann es als Programmierer dem Angreifer etwas schwerer machen, aber gänzlich "sicher" bekommt man sein Programm nie!
    Eine sehr gute Schutzmethode, nämlich selbsmodifizierender Code, wurde ja leider seitens der Programmiererschaft "geächtet" und als "kein guter Programmierstil" bezeichnet. Ob das von denjenigen Programmierern initiiert wurde, die nicht in der Lage sind, selbsmodifizierenden Code nachzuvollziehen, lasse ich jetzt mal dahingestellt :rolleyes:
    Selbstmodifizierender Code erfreut sich bei den "guten" Virenprogrammierern jedenfalls steigender Beliebtheit. Was allerdings durch die Speicherverwürfelung und diverse andere Schutzmechanismen wieder kompensiert wird.

    Wer mit genug Penetranz, KnowHow und dem Willen gesegnet ist, lange durchzuhalten, der "knackt" jedes Programm! Ob sich dieser Aufwand allerdings bei einem (ich lege mal den Finger in die Wunde) "WoW-Angelbot bei Ebay für nur 4,99!" lohnt?

  • was dich nicht dagegen schützt, mit einem einfachen Abändern der Sprungadresse die "Passwortabfrage" (incl sämtlicher von dir beschriebenen "Schutzfunktionen") auszuhebeln.

    Klar - dann sind wir aber beim Verändern des Binärcodes des Programmes ("Cracken") - im Gegensatz zum hier behandelten simplen Auslesen ( Stichwort "KeyGenerator").

  • Zitat

    ...
    Wenn man nun mit einem Disassembler (was nach eurer Aussage ja ein Kinderspiel ist) ...

    Ich habe nie gesagt, dass das Disassemblieren ein Kinderspiel ist, für den Reverser viel eher. ;)

    Gibt es ein unknackbaren Code? Ich sage mal NEIN!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • "Wir Klosterschwestern" sollten uns hier nicht streiten^^
    Aber ich hake trotzdem nochmal nach 8o

    Zitat

    dann sind wir aber beim Verändern des Binärcodes des Programmes ("Cracken") - im Gegensatz zum hier behandelten simplen Auslesen ( Stichwort "KeyGenerator").

    wobei wir uns absolut eing sein sollten, daß auch jemand der "nicht in Mathe aufgepasst hat", wesentlich einfacher einen "Keygenerator" aushebeln bzw auskommentieren kann, als nachzuvollziehen, was der Code eigentlich macht!
    Über Methoden, "sichere" Keys zu generieren, referieren hochintelligente Professoren mehrere Semester lang, wie man allerdings Sprungadressen in Programmen "verbiegt" und so die Passwortabfrage umgeht, dafür gibts sehr gut gemachte 5-Minuten-Tuts auf Youtube!

  • was dich nicht dagegen schützt, mit einem einfachen Abändern der Sprungadresse die "Passwortabfrage" (incl sämtlicher von dir beschriebenen "Schutzfunktionen") auszuhebeln. Genau aus diesem Grund verschwanden auch die schweineteuren Hardware-Dongles (erinnert sich noch jemand an reihenweise aufeinandergesteckte Dongles an der parallelen Schnittstelle^^ ? )

    Da unterliegst einer falschen Info. Wir haben selbst gestern erst wieder ein Software angeschafft die auf Hardwaredongle setzt, allerdings an der USB Schnittstelle. Aktuell haben wird sieben Hardwaredongle am Server stecken und das ist keine alter Software die die braucht. Dongle werden nach wie vor noch bei vielen Programmen genuzt die mit Netzwerklizenzen angeboten werden.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • chip, hast Recht, ich sollte meine Aussage ändern zu "Genau aus diesem Grund verschwanden auch die schweineteuren Hardware-Dongles bei für jedermann nützliche/verwendbare Software"

  • UEZ
    Sicherlich nicht im Klartext gesagt - aber suggeriert.
    Und darum ging es mir hier.
    So wie ihr eure Aussagen hier formuliert kommt es für den Leser so rüber dass es für euch kein Problem darstellt jedes beliebige Programm zu knacken.
    Zitate:

    Mit jedem Disassembler kann ich auch in den Assembler Code reinschauen und den Code nachvollziehen!

    Wenn man durch den Spaghetticode durchblickt (was mit ein wenig Übung gar nicht so schwer ist), kann man recht problemlos jeden Produktkey, jedes Passwort oder was auch immer den Zugang zu einem Programm beschränken soll ausfindig machen.


    Ja es wird sogar suggeriert dass nur jemand der überhaupt keine Ahnung von Programmierung hat Programme nicht knacken kann:

    Somit sind m.M. Passwortbeschränkungen nur geeignet um völlig programmiertechnisch unbedarfte Personen außen vorzuhalten.


    Dass BugFix' Aussage aber gerade darauf basiert das der Programmierer völlig dämlich programmiert hat und nur in diesem Sonderfall die Sache einfach ist hat mich zu meinem Statement hierzu bewegt.
    Es bezieht sich also weniger auf deine Aussagen
    Jedes Programm ist knackbar - da hast du vollkommen Recht.
    Das Gegenteil habe ich wiederrum aber auch nicht behauptet.(Krümelkackrige Sonderfälle wie One-Time-Pad lassen wir mal in der Betrachtung weg)
    Die Diskussion schweift, was wohl mein Fehler ist, vom eigentlichen Ziel meiner Aussage ab.
    Daher nun konkret ohne Umschweifungen:

    Auch wenn man jedes Programm vom Code her nachvollziehen KANN ist es nur für einen Bruchteil der Menschheit möglich die Mehrheit der Programme wirklich zu knacken.
    Suggeriert bitte nicht das Gegenteil und verunsichert den Threadstarter und andere Leser nicht unnötigerweise.
    Ein Passwort im Klartext in den Code zu schreiben ist Blödsinn - es gibt genügend andere Sicherheitsmaßnahmen mit denen man als Normalsterblicher ausreichend gesicherte Programme schreiben kann.

    Ich hoffe dass wir daher nicht weiter über Sachen "streiten" bei denen wir prinzipiell einer Meinung sind.

    @ Oberin Andy
    Wir sind uns einig.
    Warum meine Aussage habe ich hier drüber erläutert - es geht um einen Sonderfall.

  • AspirinJunkie, volle Zustimmung in allen Punkten!
    Wie man sich die "Hacker und Cracker" erfolgreich vom Hals hält demonstriert zzt Apple. Die Programme sind entweder so billig (Apps für den Ei-Kram) daß sich ein Hack/Crack überhaupt nicht lohnt, oder dermassen "gehyped" (z.B. die Apple Standardanwendungen in Firmen), daß sich jeder zu Tode schämt, der nicht spätestens 1 Woche nach release die tolle neue Verpackung der allerneuesten Version auf dem Schreibtisch stehen hat!