Seriennummer generieren

Anwendungen, Tools, Userlibs und anderes nützliches.
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Seriennummer generieren

Beitrag 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   
Zuletzt geändert von Graffiti am 02.08.2009 10:58, insgesamt 1-mal geändert.
Benutzeravatar
KeauHou
Beiträge: 133
Registriert: 23.06.2009 00:22
Computerausstattung: Q9550, GTX260, Corsair Dominator 4GB 1066mhz, 22" Asus 16:10
Wohnort: Vorm Monitor
Kontaktdaten:

Beitrag 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...
If x = 1 and x = 2
MessageRequester("!!!", "WTF")
EndIf
Es ist möglich!
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag 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...
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Noch einfacher: direkt in OllyDbg disassemblieren und reassemblieren:

Bild

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag 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
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag 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 :)
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag 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:
Benutzeravatar
KeauHou
Beiträge: 133
Registriert: 23.06.2009 00:22
Computerausstattung: Q9550, GTX260, Corsair Dominator 4GB 1066mhz, 22" Asus 16:10
Wohnort: Vorm Monitor
Kontaktdaten:

Beitrag von KeauHou »

Ja das mit dem deassemblieren ist mir klar, aber ist eine nicht umkehrbare "Verschlüsselung" nicht grundsätzlich sicherer?
If x = 1 and x = 2
MessageRequester("!!!", "WTF")
EndIf
Es ist möglich!
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag 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
Antworten