Este tutorial lo arme para explicar como hacer un generador de diccionarios como mi BruteForceDicctionaryCreator o BFDC7913.
Empecemos...
Suponiendo que tenes esta cadena de posibles caracteres:
Código:
"ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789"
Es la mas comun y tiene 26+26+10 osea 62 caracteres correcto?
Eso yo recomendaria guardarlo en un Vector (array).
Para eso yo uso la funcion:
Código
Código
Private Function CharSplit7913(expression As String) As String() Dim lExp As Long Dim ExpB() As Byte Dim AuxArr() As String ExpB = expression lExp = UBound(ExpB) ReDim AuxArr(lExp) For X = 0 To lExp Step 2 AuxArr(X / 2) = ChrW(ExpB(X)) Next ReDim Preserve AuxArr(Int(lExp / 2)) CharSplit7913 = AuxArr End Function
El vector resultante suponete que lo llamamos Chars() queda compuesto asi:
Chars(0 to 61) : "A","B","C",...,"7","8","9".
Espero que hasta ahi me sigas.
En este punto solo tenemos en un Vector (array) guardados todos los caracteres que vamos a usar.
Ahora, solicitamos la longitud en este caso la guardaremos en la variable Tam (de tamaño)
Ahora vamos a crear un vector donde guardaremos la cadena actual, su index maximo sera tam-1.
Suponiendo que tam = 3
hacemos asi:
Código
Dim Palabra() as integer
'dentro del proceso de creacion de diccionario
Redim Palabra(Tam-1)
Aca lo que hicimos es hacer que Palabra quedara (0 to 2) inicializandose asi:
Palabra(0 to 2): 0,0,0
aca empieza el proceso de creacion de strings...
Código
Código
Dim AuxPalabra As String Do AuxPalabra = 0 For X = 0 To tam - 1 AuxPalabra = AuxPalabra & chars(palabra(X)) ' aca concatenamos todas las letras Next Print AuxPalabra ' aca imprimo la palabra resultante. palabra(0) = palabra(0) + 1 ' aca muevo un caracter For X = 0 To UBound(palabra) - 1 If palabra(X) = UBound(chars) + 1 Then 'aca verificamos que ninguna casilla quede con un numero mayor a los 'caracteres que hay y si pasa eso aumenta la siguiente casilla 'y la actual se vuelve a 0 palabra(X + 1) = palabra(X + 1) + 1 palabra(X) = 0 End If 'esto de abajo es para ver cuando se termino el proceso 'osea cuando se han hecho todas las combinaciones. If palabra(UBound(palabra)) = UBound(chars) + 1 Then Exit Do Next Loop
Entonces como te quedaria todo el codigo completo...
Código
Código
Dim Diccionario As String Dim chars() As String Dim Tam As Integer Dim Palabra() As Integer Private Sub Form_Load() 'aca en diccionario pone lo que quieras Diccionario = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789" chars = CharSplit7913(Diccionario) Tam = InputBox("inserte cantidad de caracteres") ReDim Palabra(Tam - 1) End Sub Private Sub InicioDeProceso() Dim AuxPalabra As String Do AuxPalabra = 0 For X = 0 To Tam - 1 AuxPalabra = AuxPalabra & chars(Palabra(X)) ' aca concatenamos todas las letras Next Debug.Print AuxPalabra ' aca imprimo la palabra resultante. Palabra(0) = Palabra(0) + 1 ' aca muevo un caracter For X = 0 To UBound(Palabra) - 1 If Palabra(X) = UBound(chars) + 1 Then 'aca verificamos que ninguna casilla quede con un numero mayor a los 'caracteres que hay y si pasa eso aumenta la siguiente casilla 'y la actual se vuelve a 0 Palabra(X + 1) = Palabra(X + 1) + 1 Palabra(X) = 0 End If 'esto de abajo es para ver cuando se termino el proceso 'osea cuando se han hecho todas las combinaciones. If Palabra(UBound(Palabra)) = UBound(chars) + 1 Then Exit Do Next Loop MsgBox "Proceso Terminado" End Sub Private Function CharSplit7913(expression As String) As String() Dim lExp As Long Dim ExpB() As Byte Dim AuxArr() As String ExpB = expression lExp = UBound(ExpB) ReDim AuxArr(lExp) For X = 0 To lExp Step 2 AuxArr(X / 2) = ChrW(ExpB(X)) Next ReDim Preserve AuxArr(Int(lExp / 2)) CharSplit7913 = AuxArr End Function
GRACIAS POR LEER!!!