Alle buchstaben miteinander verknüpfen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

@DerProgger: Der Code ist schon so komplex - irgendwie steige ich da nicht mehr ganz durch...

Habe die Zeile

Code: Alles auswählen

      For i = 0 To PlacePos
durch

Code: Alles auswählen

      For i = PlacePos To 0
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?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

PureBasic4.0 hat geschrieben:@Habe die Zeile

Code: Alles auswählen

      For i = 0 To PlacePos
durch

Code: Alles auswählen

      For i = PlacePos To 0
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.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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? :lol:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag 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.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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 :oops:
Jetzt weiß ich, dass es viel einfacher gehen kann, wenn man den Computer nur richtig benutzt
[/OT]

@DerProgger: Danke erstmal - ich melde mich dann :allright:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

PureBasic4.0 hat geschrieben:...wenn man den Computer nur richtig benutzt
exakt! dies ist eine unabdingbare voraussetzung...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

PureBasic4.0 hat geschrieben:Habe die Zeile

Code: Alles auswählen

      For i = 0 To PlacePos
durch

Code: Alles auswählen

      For i = PlacePos To 0
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
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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. :allright:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

PureBasic4.0 hat geschrieben:

Code: Alles auswählen

AA9
BA ;Was soll das hier?
ABB
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:

Code: Alles auswählen

gAB ;Wieso wird jetzt mit g weitergemacht?
gAC
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
Antworten