Seite 6 von 7
Verfasst: 04.08.2007 17:41
von PureBasic4.0
@DerProgger: Der Code ist schon so komplex - irgendwie steige ich da nicht mehr ganz durch...
Habe die Zeile
durch
ersetzt.
Habe mal gedebuggt, was der Code zurückgibt, wenn 4 Stellen verwendet werden. Folgendes passiert:
Code: Alles auswählen
[...]
m99B
m99C
m99D
m99E
m99F
m99G
m99H
m99I
m99J
m99K
m99L
m99M
m99N
m99O
m99P
m99Q
m99R
m99S
m99T
[...]
z99g
z99h
z99i
z99j
z99k
z99l
z99m
z99n
z99o
z99p
z99q
z99r
z99s
[...]
199M
199N
199O
199P
199Q
199R
199S
[...]
Es befinden sich also immer zwei 9er zwischen den Buchstaben:
x99x
Ziel ist ja,
ALLE Buchstaben aus MyAlphabet$ miteinander zu verknüpfen.
Und wie schreibe ich den Code um, dass die Länge des zu BruteForcenden Strings variabel ist? Klar - Alles in Variablen umwandeln, aber da funktioniert doch der Trick mit PokeB und PokeC nicht mehr, oder?
Verfasst: 04.08.2007 17:55
von rolaf
PureBasic4.0 hat geschrieben:@Habe die Zeile
durch
ersetzt.
fehlt da jetzt nicht "step - 1"
mittlerweile glaub ich fast es ist besser du strickst dir selbst ne lösung, in der ganzen zeit in der du auf eine maßgeschneiderte lösung wartest hätteste das bestimmt schon hinbekommen.
Verfasst: 04.08.2007 18:17
von PureBasic4.0
@Falo: Ist Step - 1 nicht für PB selbstverständlich? Habe das damals mit VB nicht gebraucht... naja... danke.
Falo hat geschrieben:mittlerweile glaub ich fast es ist besser du strickst dir selbst ne lösung
Ich hab's ja versucht... Aber wie gesagt, hat halt nicht hingehauen...
Falo hat geschrieben:maßgeschneiderte lösung
Sie soll halt nur funktionieren... Das maßgeschneiderte mach ich dann. Ich bräuchte nur ne Basis, und die hab ich jetzt, verstanden?

Verfasst: 04.08.2007 18:33
von rolaf
PureBasic4.0 hat geschrieben:Ich hab's ja versucht... Aber wie gesagt, hat halt nicht hingehauen...
Falscher Ansatz: Mit Kopf in den Sand stecken (oder Sand im Kopf) hat noch niemand Programmieren gelernt.
"Geht nicht gibts nicht" sollte dein Motto werden. Das dauert manchmal, aber bringt dich wirklich Weiter.
> Verstanden?
Step - 1 war auch in VB schon immer nötig, wenn die Schleife rückwärts laufen soll.
Verfasst: 04.08.2007 18:42
von Kaeru Gaman
Falo hat geschrieben:mittlerweile glaub ich fast es ist besser du strickst dir selbst ne lösung, in der ganzen zeit in der du auf eine maßgeschneiderte lösung wartest hätteste das bestimmt schon hinbekommen.
ich hab seit tagen hier nicht mehr rein geschaut, und grad hab ich mich gefragt
"hat das denn alls noch kein Ende?"
...in der zeit hätte man die kombinationen per hand eingeben können...
Verfasst: 04.08.2007 18:54
von PureBasic4.0
[OT]
@Kaeru Gaman: Ich habe damals mal den Editor zur hand genommen und wollte per Hand alle Zeichen von a-ZZZZZZ schreiben
Jetzt weiß ich, dass es viel einfacher gehen kann, wenn man den Computer nur richtig benutzt
[/OT]
@DerProgger: Danke erstmal - ich melde mich dann

Verfasst: 04.08.2007 18:58
von Kaeru Gaman
PureBasic4.0 hat geschrieben:...wenn man den Computer nur richtig benutzt
exakt! dies ist eine unabdingbare voraussetzung...
Verfasst: 04.08.2007 19:22
von Sicro
PureBasic4.0 hat geschrieben:Habe die Zeile
durch
ersetzt.
Der Code zeigt die Zeichenfolge doch bereits in der richtigen Reihenfolge an. Außerdem werkelst du da wieso an der falschen Stelle herum.
PureBasic4.0 hat geschrieben:Ziel ist ja, ALLE Buchstaben aus MyAlphabet$ miteinander zu verknüpfen.
Das macht mein Code ja auch.
PureBasic4.0 hat geschrieben:Und wie schreibe ich den Code um, dass die Länge des zu BruteForcenden Strings variabel ist? Klar - Alles in Variablen umwandeln, aber da funktioniert doch der Trick mit PokeB und PokeC nicht mehr, oder?
Wenn du das Beispiel für das beliebige Setzen der Startzeichen etwas abänderst und in eine ForNext-Schleife packst, funktioniert es.
Mfg DerProgger
Verfasst: 06.08.2007 14:45
von PureBasic4.0
DerProgger hat geschrieben:Außerdem werkelst du da wieso an der falschen Stelle herum.
An welcher Stelle muss ich denn dann rumwerkeln? Das Programm macht ja schon fast was es soll: Es baut die Buchstaben von hinten auf. Habe aber nochmal gedebuggt, und mir ist folgendes aufgefallen:
Code: Alles auswählen
[...]
AA6
AA7
AA8
AA9
BA ;Was soll das hier?
ABB
ABC
ABD
ABE
ABF
[...]
AB6
AB7
AB8
AB9
CA ;Hier auch!
ACB
ACC
ACD
[...]
AV5
AV6
AV7
AV8
AV9
WA ;Was ist mit WA?
AWB
AWC
AWD
AWE
[...]
A97
A98
A99
A ;Ähh?
gAB ;Wieso wird jetzt mit g weitergemacht?
gAC
gAD
gAE
[...]
Hier ist der von mir veränderte Code:
Code: Alles auswählen
PassLength = 4
MyAlphabet$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#FirstChar = 'A'
#LastChar = '9'
Define *PassPointer = AllocateMemory((PassLength + 2) * SizeOf(Character))
Define *CharsPointer = AllocateMemory((Len(MyAlphabet$) + 1) * SizeOf(Character))
Define *CharsPos = AllocateMemory(PassLength)
Define *Pass.Character, *Chars.Character
Define PlacePos.l, i.l, z.l, Output.s, StringLength.l, StartTime.l
If Not *PassPointer Or Not *CharsPointer Or Not *CharsPos
If *PassPointer: FreeMemory(*PassPointer): EndIf
If *CharsPointer: FreeMemory(*CharsPointer): EndIf
If *CharsPos: FreeMemory(*CharsPos): EndIf
End
EndIf
PokeS(*CharsPointer,MyAlphabet$)
; ===================================
; Starte an beliebiger Zeichenfolge
; 1. Stelle: g
PokeB(*CharsPos + 2,32)
PokeC(*PassPointer + 2,'A')
; 2. Stelle: B
PokeB(*CharsPos + 1,1)
PokeC(*PassPointer + 1,'A')
; 3. Stelle: C
PokeB(*CharsPos,0) ; Wieso gibt's hier eigentlich kein PokeC?
; ====================================
StartTime.l = ElapsedMilliseconds()
Repeat
PlacePos = 0
Repeat
*Pass = *PassPointer + PlacePos
If *Pass\c <> #LastChar
PokeB(*CharsPos + PlacePos,PeekB(*CharsPos + PlacePos) + 1)
*Chars = *CharsPointer + PeekB(*CharsPos + PlacePos) - 1
*Pass\c = *Chars\c
Break
Else
For i = PlacePos To 0 Step -1
PokeB(*CharsPos + i,1)
*Pass = *PassPointer + i
*Pass\c = #FirstChar
Next
PlacePos + 1
If PlacePos = PassLength
Break 2
EndIf
EndIf
ForEver
;Debug PeekS(*PassPointer)
Output = ""
StringLength = MemoryStringLength(*Pass)
For z = StringLength - 1 To 0 Step -1
*Pass = *PassPointer + z
Output + Chr(*Pass\c)
Next
Debug Output
ForEver
MessageRequester("RunTime",Str(ElapsedMilliseconds() - StartTime) + " ms")
FreeMemory(*PassPointer)
FreeMemory(*CharsPointer)
FreeMemory(*CharsPos)
Was genau mache ich falsch? Bitte korrigiere einfach den Code.

Verfasst: 07.08.2007 15:36
von Sicro
PureBasic4.0 hat geschrieben:
Das liegt an dem Umdreh-Code:
Code: Alles auswählen
Output = ""
StringLength = MemoryStringLength(*Pass)
For z = StringLength - 1 To 0 Step -1
*Pass = *PassPointer + z
Output + Chr(*Pass\c)
Next
Die MemoryStringLength-Funktion gibt - wegen mir noch unbekannten Gründen - an diesen Stellen die falsche String-Länge zurück.
Ersetze "StringLength" einfach durch "PassLength". Dadurch wird die ForNext-Schleife zwar immer die maximale Passwortlänge durchlaufen, obwohl das bei den kürzeren Passwörtern nicht nötig wäre, aber der Funktionsaufruf von "MemoryStringLength" bleibt erspart. Ich denke, das gibt bezüglich der Geschwindigkeit einen Ausgleich und sollte für eine Notlösung mal genügen.
PureBasic4.0 hat geschrieben:
Im Code hast du die Werte falsch gesetzt.
Kommentierter Code:
Code: Alles auswählen
PassLength = 4
MyAlphabet$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#FirstChar = 'A'
#LastChar = '9'
Define *PassPointer = AllocateMemory((PassLength + 1) * SizeOf(Character)) ; "1" ist korrekter
Define *CharsPointer = AllocateMemory((Len(MyAlphabet$) + 1) * SizeOf(Character))
Define *CharsPos = AllocateMemory(PassLength)
Define *Pass.Character, *Chars.Character
Define PlacePos.l, i.l, z.l, Output.s, StringLength.l, StartTime.l
If Not *PassPointer Or Not *CharsPointer Or Not *CharsPos
If *PassPointer: FreeMemory(*PassPointer): EndIf
If *CharsPointer: FreeMemory(*CharsPointer): EndIf
If *CharsPos: FreeMemory(*CharsPos): EndIf
End
EndIf
PokeS(*CharsPointer,MyAlphabet$)
; ===================================
; Starte an beliebiger Zeichenfolge
; 1. Stelle: g
PokeB(*CharsPos + 2,32) ; Der Wert "32" gibt die Position des unten angegebenen Zeichens in der MyAlphabet$-
; Variable an.
PokeC(*PassPointer + 2,'A') ; Hier hast du das Zeichen von "g" auf "A" abgeändert, deshalb musst du auch oben den
; Wert "32" anpassen. (A=0, B=1, C=2 usw.)
; 2. Stelle: B
PokeB(*CharsPos + 1,1) ; Hier das gleiche, wie oben.
PokeC(*PassPointer + 1,'A')
; 3. Stelle: C
PokeB(*CharsPos,0) ; Wieso gibt's hier eigentlich kein PokeC?
; PokeC wird vom Code ausgeführt. Erst wenn mit PokeB das letzte Zeichen der MyAlphabet$-Variable
; gesetzt wird, muss hier auch PokeC ausgeführt werden, sonst funktioniert die Überprüfung auf das
; letzte Zeichen nicht, weil das Zeichen erst nach der Überprüfung gesetzt wird. Es steht dir also
; frei, ob du das PokeC hier auch bei einem "nicht letztes Zeichen" ausführst.
; ====================================
StartTime.l = ElapsedMilliseconds()
Repeat
PlacePos = 0
Repeat
*Pass = *PassPointer + PlacePos
If *Pass\c <> #LastChar
PokeB(*CharsPos + PlacePos,PeekB(*CharsPos + PlacePos) + 1)
*Chars = *CharsPointer + PeekB(*CharsPos + PlacePos) - 1
*Pass\c = *Chars\c
Break
Else
For i = PlacePos To 0 Step -1
PokeB(*CharsPos + i,1)
*Pass = *PassPointer + i
*Pass\c = #FirstChar
Next
PlacePos + 1
If PlacePos = PassLength
Break 2
EndIf
EndIf
ForEver
;Debug PeekS(*PassPointer)
Output = ""
StringLength = MemoryStringLength(*Pass)
For z = StringLength - 1 To 0 Step -1
*Pass = *PassPointer + z
Output + Chr(*Pass\c)
Next
Debug Output
ForEver
MessageRequester("RunTime",Str(ElapsedMilliseconds() - StartTime) + " ms")
FreeMemory(*PassPointer)
FreeMemory(*CharsPointer)
FreeMemory(*CharsPos)
Mfg DerProgger