Seite 1 von 3

Seriennummer generieren

Verfasst: 01.08.2009 00:51
von Graffiti
mit diesem Code könnt ihr eine Seriennummer generieren, er ist einfach
EDIT: kann aber auch geknackt werden, für die die sich damit auskennen

ihr baut in eure Anwendung 2 Felder ein, ein Eingabefeld für die Angabe vom Benutzer und ein Feld für die generierte Zahl
Der User trägt dann die Kombination ein und in eurem Programm könnt ihr dann prüfen,
so wie mit dem 2. Button ob die Nummer stimmt.

Die Zahlen zum passenden String im Replace-Bereich könnt ihr ändern wie ihr wollt,
dann kommt beim generieren eine andere Seriennummer raus

Ich verwende das z.B in meiner Pyro Steuerung, auch wenn der Code falsch ist funktioniert das Programm,
nur die RS232 wird beschränkt und sendet ein bisserl weniger als es normalerweise soll.
Sozusagen ist die Software im Demomodus.

Code: Alles auswählen


Global serial$ , uservorgabe$ , controlstr.q

Procedure.s x(a$)

a$ = LCase(a$) 
a$ = Left(a$, 11)
ReplaceString(a$, "a", "1", 2, 1) : ReplaceString(a$, "b", "3", 2, 1)
ReplaceString(a$, "c", "6", 2, 1) : ReplaceString(a$, "d", "9", 2, 1)
ReplaceString(a$, "e", "7", 2, 1) : ReplaceString(a$, "f", "3", 2, 1)
ReplaceString(a$, "g", "2", 2, 1) : ReplaceString(a$, "h", "1", 2, 1)
ReplaceString(a$, "i", "6", 2, 1) : ReplaceString(a$, "j", "6", 2, 1)
ReplaceString(a$, "k", "5", 2, 1) : ReplaceString(a$, "l", "4", 2, 1)
ReplaceString(a$, "m", "9", 2, 1) : ReplaceString(a$, "n", "2", 2, 1)
ReplaceString(a$, "o", "0", 2, 1) : ReplaceString(a$, "p", "0", 2, 1)
ReplaceString(a$, "q", "8", 2, 1) : ReplaceString(a$, "r", "3", 2, 1)
ReplaceString(a$, "s", "7", 2, 1) : ReplaceString(a$, "t", "0", 2, 1)
ReplaceString(a$, "u", "1", 2, 1) : ReplaceString(a$, "v", "2", 2, 1)
ReplaceString(a$, "w", "5", 2, 1) : ReplaceString(a$, "x", "7", 2, 1)
ReplaceString(a$, "y", "8", 2, 1) : ReplaceString(a$, "z", "1", 2, 1)
ReplaceString(a$, "ä", "5", 2, 1) : ReplaceString(a$, "ö", "1", 2, 1)
ReplaceString(a$, "ü", "3", 2, 1) : ReplaceString(a$, "ß", "3", 2, 1)
ReplaceString(a$, "-", "1", 2, 1) : ReplaceString(a$, "@", "7", 2, 1)
ReplaceString(a$, "_", "1", 2, 1) : ReplaceString(a$, ",", "5", 2, 1)
ReplaceString(a$, ".", "9", 2, 1) : ReplaceString(a$, "/", "7", 2, 1)
ReplaceString(a$, ":", "3", 2, 1) : ReplaceString(a$, "+", "0", 2, 1)
ReplaceString(a$, "1", "3", 2, 1) : ReplaceString(a$, "6", "3", 2, 1)
ReplaceString(a$, "2", "1", 2, 1) : ReplaceString(a$, "7", "7", 2, 1)
ReplaceString(a$, "3", "1", 2, 1) : ReplaceString(a$, "8", "5", 2, 1)
ReplaceString(a$, "4", "9", 2, 1) : ReplaceString(a$, "9", "7", 2, 1)
ReplaceString(a$, "5", "3", 2, 1) : ReplaceString(a$, "0", "3", 2, 1)

Len(a$)
controlstr = ValQ(a$)
x.q = 1000000000000
y.q = x - controlstr
serial$ = StrQ(y.q)

ProcedureReturn serial$
EndProcedure

If OpenWindow(0, 200, 200, 240, 150, "CREATE SERIAL", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered )
If CreateGadgetList(WindowID(0)) 
      StringGadget(0,20,20,200,20,"xy string")
      StringGadget(1,20,50,200,20,"", #PB_String_Numeric)
      ButtonGadget(2, 20, 80, 200, 20, "generate")
      ButtonGadget(3, 20, 110, 200, 20, "test code")
EndIf  

Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget

Select EventGadget()

Case 2
    uservorgabe$ = GetGadgetText(0)
    uservorgabe$ = Trim(uservorgabe$)
    uservorgabe$ = uservorgabe$ + "abcdefghijk"
    uservorgabe$ = ReplaceString(uservorgabe$," ","x")
    serial$ = x(uservorgabe$)
    SetGadgetText(1, serial$)

Case 3
 serial$ = GetGadgetText(1)
 a.q = ValQ(serial$)
 a.q = (a + controlstr)/1000000000
 If a.q = 1000
 MessageRequester("Serial Control", "Test OK", #MB_OK|#MB_ICONINFORMATION)
 Else
 MessageRequester("Serial Control", "Test Failed", #MB_OK|#MB_ICONINFORMATION)
 EndIf
 

EndSelect 
EndIf

Until EventID = #PB_Event_CloseWindow
EndIf
End   

Verfasst: 01.08.2009 13:09
von KeauHou
Wenn auch ein bisschen billig, könnte man nicht einfach aus der Kombination von eingegebenen Daten (Name, Email, usw) den MD5-hash errechnen und denn als Seriennummer missbrauchen? Bei mehreren Feldern wird das schwer bis unmöglich zu knacken weil es ja nur in eine Richtung funktioniert...

Verfasst: 01.08.2009 13:19
von PMTheQuick
Nicht sehr sicher.

Vorgang:

1) Build.exe kompiliert, Ziel: Jede Serial soll stimmen.
2) W32Dasm angeschmissn & File geöffnet
3) String References geöffnet
4) Test Failed rausgesucht, Doppelklick
5) Leicht raufgescrollt:
>>> Referenced by (U)nconditional or (C)onditional Jump at Adress:
>>>> 004012CF
6) Zu Adresse in W32Dasm geh
7) Da steht:
>>> je 004012E7 = IF Abfrage, Bingo
8) Offset notieren: 000006CF
9) Hex Editor öffnen & Datei laden
10) Zu Adresse springen (000006CF)
11) 74/84 je zu 75/85 jne patchen ((j)ump if (e)qual zu (j)ump if (n)ot (e)qual patchen, also 74 oder 84 zu 75 oder 85...)
12) Abspeichern

Gecrackt! Zeitaufwand 10 Minuten hier... Kompletter Mechanismus ausgehebelt, indem einfach If zu If Not gepatcht wurde... Das heisst jetzt wird hier jede Serial akzeptiert:

Bild

Nunja, fast jede, die richtige wird jetzt natürlich abgelehnt.
http://em.q-soft.ch/49Build.exe
Hier noch die Datei zum downloaden, habe nur deinen Source 1:1 gebuildet & dann gecrackt. Also so ist das niemals sicher und binnen Minuten geknackt. Ohne Anleitung wärens vermutlich höchstens 5 Minuten gewesen.

Klar, es gibt kein 100% sicher, das ist mir bewusst. Du kannst deinen Code auch so lassen, doch jeder sollte wissen, wenn ers so schwach einbaut mit EINER If-Abfrage oder auch ZWEI If (von mir aus auch 6 If's is alles schon im Disassembler) und keine Verwirrung oder so hinzufügt, wird das sehr schnell gecrackt sein.

Also sollte jedem bewusst sein, wenn ers ziemlich sicher haben will, dann noch Schikanen einbauen! Das hier diente mal zur Aufklärung. :lol:

Gruss
PMTheQuick ;-)

@Mods: Mir ist bewusst, das ist hier ein bisschen ein heikles Thema, ich bitte jedoch um Verständnis, es soll alle aufklären wie schnell dieser Schutz geknackt werden kann und ist zudem ja kein fertiges Produkt, weshalb ein Crack hier nicht sehr schlimm ist. Das wird ja auch teilweise in anderen legalen Boards gemacht, bzw man erstellt Prüfroutinen und andere knacken sie just 4 fun...

Verfasst: 01.08.2009 13:41
von cxAlex
Noch einfacher: direkt in OllyDbg disassemblieren und reassemblieren:

Bild

Gruß, Alex

Verfasst: 01.08.2009 13:52
von Graffiti
OK nicht so sicher, aber den Generator gibst du ja nicht aus der Hand, mit diesem generierst du ja nur eine Seriennummer die dem User übermittelt wird.
und z.B mein Code hat sicher bereits über 7000 Zeilen wenns reicht, dann tust du dich mit dem suchen schon schwerer, keiner weiß wo ich die Berechnung ausführe und mit welchen Zahlen ich arbeite die letztendlich irgendwo im Code abgefragt werden bzw geprüft werden.

wenn ich die exe fertig habe sende ich sie euch mal, mal schauen was dann dabei rauskommt

Verfasst: 01.08.2009 13:57
von PMTheQuick
Ok, Herausforderung angenommen! Wenn du gewinnst, erhältste 20 MB Webspace falls Bedarf besteht ^^. Wann lässt du uns eine Version zukommen? Muss ja nicht vollständig funktionieren, geht ja nur um den Schutz.

Gruss
PMTheQuick :)

Verfasst: 01.08.2009 14:02
von Graffiti
Jo dann werde ich die Routine mal mit einbauen, dieses Wochenende

und wenn du gewinnst gebe ich dir einen Sixpack Warsteiner aus
(sende ich dann mit dem Paketdienst) :allright:

Verfasst: 01.08.2009 14:10
von KeauHou
Ja das mit dem deassemblieren ist mir klar, aber ist eine nicht umkehrbare "Verschlüsselung" nicht grundsätzlich sicherer?

Verfasst: 01.08.2009 14:15
von cxAlex
KeauHou hat geschrieben:Ja das mit dem deassemblieren ist mir klar, aber ist eine nicht umkehrbare "Verschlüsselung" nicht grundsätzlich sicherer?
Grundsätzlich schon, aber in dem Fall sitzt der Fehler wo anders (verrate ich jetzt aber erst wenn die App da ist :mrgreen:).

Es kommt immer darauf an welchen Algo man nimmt. MD5 ist IMHO inzwischen angreifbar und wird wohl demnächst von SHA-1 abgelöst. Aber da auch gegen diesen Algo schon Angriffe entwickelt werden hat man schon SHA-2 in den Startlöchen usw....

Ein ewiges Katz-und-Maus Spiel.

Verfasst: 01.08.2009 14:16
von PMTheQuick
Wieso soll das sicherer sein? Du musst ja nur die If-Abfrage patchen, wie es genau geht ist schlussendlich doch egal. Ob du jetzt Zahlen oder nen MD5 vergleichst...

Gruss
PMTheQuick