Luego lo que se logro después de todo este código es mostrar la expansión de
variable %a:~0,%f%% en la que el valor de %f% aumentando
en cada bucle.
Y a partir de esto generar nuevas líneas de código que se agregan al final del archivo
cambiando su forma, ósea polimórfico.
El código se optimiza aun mas usando CALL, luego el código se vuelve recursivo y no
cambia su contenido por lo que no precisa de un archivo temporal en el cual
respaldarse, y realiza el bucle de manera que en cada iteración aumenta el valor de la
variable y muestra la expansión de manera correcta.
Función: ECHODYN
El cual puede ser guardado como ECHODYN.BAT en system32 y ser usado como un
comando mas el cual se puede llamar desde consola o dentro de un código y al cual se
le debe pasar como parámetro el mensaje a mostrar y luego retornar al flujo del
programa gracias al GOTO :EOF, pero de igual forma puede modificarse un poco para
que sea el usuario quien introduzca una frase y sea mostrada en pantalla.
Con el uso de CALL optimizamos el código al máximo y permitimos realizar funciones
que no eran posibles realizar o que requerirían de muchas líneas de código.
Miremos el Siguiente Ejemplo:
Código para mostrar que numero de letra es la introducida:
Ahora realizaremos la función inversa, encargada de mostrar la letra de acuerdo al
numero introducido, puede hacerse de igual forma usando el FOR, pero usaremos la
polimetría para hacerlo mas corto.
En este último hemos definido una sola Variable llamada %DIC%
cuyo contenido son todas las letras del abecedario y hemos realizado la expansión de
la variable usando el CALL que nos permite introducir la variable %NUM% dentro de la
expansión de la variable %DIC% y nos permite extraer el carácter
correspondiente al numero introducido, en este caso %dic:~10,1%.
Esto que hemos hecho nos da la posibilidad de trabajar con algo que es llamado
ARRAYS o Vectores, el cual es una variable que contiene múltiples variables y cuyo
contenido es extraído mediante el índice, empezando por el índice 0 al igual que la
expansión de cualquier variable normal cuyo primer valor a extraer es también el 0.
Pueden hacerse múltiples expansiones dentro de otras expansiones y hacer el código
mas aleatorio, hacerlo mas difícil de leer usarlo como método de protección o para
codes especiales como los de los Crackmes.
Miremos por ultimo un ejemplo más avanzado en el que se hacen múltiples
extracciones y se hace uso de polimetría con CALL para hacer el código mas corto.
Primero se realizan unas expansiones simples de la variable %DIC% las cuales se
encargan de mostrar el ECHO, luego de preguntar por la Variable la usuario se procede
a definir la Variable %PASS% resultado de la extracción de caracteres de la variable
%DIC% mediante múltiples expansiones de variable dentro de otras expansiones
usando la polimetría.
Ej.
%%%%dic:~%num:~8,1%%num:~0,1%,%num:~8,1%%%%%
%num:~8,1% = 1
%num:~0,1% = 9
%num:~8,1% = 1
%%%%dic:~19,1%%%%
Para luego hacer una sustitución de caracteres en la que se eliminan los %%
sobrantes, pero lo hacemos mediante CALL para que se muestre el valor de la
extracción anterior, de lo contrario no funcionaria.
call set pass=%pass:^%=%
Aunque esto tambien puede realizarse haciendo un doble CALL a la primera polimetrica.
Con lo que deducimos que el primer carácter del password es la letra "S" sin importar
que este en mayúscula o minúscula pues al compararse se usa el modificador /i en el IF
que permite esa flexibilidad.
La otra forma como decia era usando SETLOCAL ENABLDELAYED EXPANSION, tal como
lo hago en este ejemplo:
Espero hayan entendido en concepto y lo tengan lo mas claro posible, pues les
ayudara a mejorar en sus códigos.
Saludos. =D
variable %a:~0,%f%% en la que el valor de %f% aumentando
en cada bucle.
Y a partir de esto generar nuevas líneas de código que se agregan al final del archivo
cambiando su forma, ósea polimórfico.
El código se optimiza aun mas usando CALL, luego el código se vuelve recursivo y no
cambia su contenido por lo que no precisa de un archivo temporal en el cual
respaldarse, y realiza el bucle de manera que en cada iteración aumenta el valor de la
variable y muestra la expansión de manera correcta.
Función: ECHODYN
Código [Seleccionar]
:echodyn
REM Funcion Echo Dinamico
REM Coded by Smart
set texto=%*
set num=1
:dyn2
call set var1=%%texto:~0,%num%%%
if "%var1%"=="%texto%" set num=0
cls
echo %var1%
ping -n 0,3 0.0.0.0 > nul
if %num%==0 (goto :eof)
set /a num=%num%+1
goto dyn2
El cual puede ser guardado como ECHODYN.BAT en system32 y ser usado como un
comando mas el cual se puede llamar desde consola o dentro de un código y al cual se
le debe pasar como parámetro el mensaje a mostrar y luego retornar al flujo del
programa gracias al GOTO :EOF, pero de igual forma puede modificarse un poco para
que sea el usuario quien introduzca una frase y sea mostrada en pantalla.
Código [Seleccionar]
@echo off
Title Echo Dinamico
REM Coded by :: SmartGenius ::
:echodyn
Cls
Echo.
set /p texto="Frase >"
set num=1
:dyn2
call set var1=%%texto:~0,%num%%%
if "%var1%"=="%texto%" set num=0
cls
echo %var1%
ping -n 0,3 0.0.0.0 > nul
if %num%==0 (goto :fin)
set /a num=%num%+1
goto dyn2
:fin
pause
exit
Con el uso de CALL optimizamos el código al máximo y permitimos realizar funciones
que no eran posibles realizar o que requerirían de muchas líneas de código.
Miremos el Siguiente Ejemplo:
Código para mostrar que numero de letra es la introducida:
Código [Seleccionar]
@echo off
mode con cols=28 lines=12
title Abecedario
REM Coded by ::SmartGenius::
color 0a
cls
:ini
REM Inicializamos Variables
set /a num=0
:main
REM Pedimos un Dato al Usuario
echo.
echo Introduzca una Letra
set /p let=">> "
for %%a in (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) do (call :comp %%a)
echo.
echo No ha introducido
echo una letra del
echo Abecedario
echo.
pause
exit
:comp
REM Comparamos los Datos
set /a num=%num%+1
if /i not %1==%let% (goto :eof)
echo.
echo La Letra %let% es
echo la numero %num%
echo.
echo Continuar...
pause >nul
exit
Ahora realizaremos la función inversa, encargada de mostrar la letra de acuerdo al
numero introducido, puede hacerse de igual forma usando el FOR, pero usaremos la
polimetría para hacerlo mas corto.
Código [Seleccionar]
@echo off
mode con cols=28 lines=12
title Abecedario
REM Coded by ::SmartGenius::
color 0a
cls
:ini
REM Definimos una Variable Global
set dic=_ABCDEFGHIJKLMNOPQRSTUVWXYZ
:main
REM Pedimos un Dato al Usuario
echo.
echo Introduzca un Numero
set /p num=">> "
REM Usamos Call para usar la Polimetrica
call set let=%%dic:~%num%,1%%
REM Mostramos el Resultado
echo.
echo La %num% letra del Abecedario
echo corresponde a la letra %let%
echo.
echo Continuar...
pause >nul
exit
En este último hemos definido una sola Variable llamada %DIC%
cuyo contenido son todas las letras del abecedario y hemos realizado la expansión de
la variable usando el CALL que nos permite introducir la variable %NUM% dentro de la
expansión de la variable %DIC% y nos permite extraer el carácter
correspondiente al numero introducido, en este caso %dic:~10,1%.
Esto que hemos hecho nos da la posibilidad de trabajar con algo que es llamado
ARRAYS o Vectores, el cual es una variable que contiene múltiples variables y cuyo
contenido es extraído mediante el índice, empezando por el índice 0 al igual que la
expansión de cualquier variable normal cuyo primer valor a extraer es también el 0.
Pueden hacerse múltiples expansiones dentro de otras expansiones y hacer el código
mas aleatorio, hacerlo mas difícil de leer usarlo como método de protección o para
codes especiales como los de los Crackmes.
Miremos por ultimo un ejemplo más avanzado en el que se hacen múltiples
extracciones y se hace uso de polimetría con CALL para hacer el código mas corto.
Código [Seleccionar]
@echo off
mode con cols=25 lines=10
title CrackMe 6
REM Coded by ::SmartGenius::
color 0a
:ini
REM Definimos unas Variables Globales
set dic= abcdefghijklmnopqrstuvwxyz
set num=9876543210
:main
cls
REM Usamos la Expansion de Variable simple
REM para crear una parte de codigo y mostrar
REM un mensaje...
%dic:~5,1%%dic:~3,1%%dic:~8,1%%dic:~15,1%.
%dic:~5,1%%dic:~3,1%%dic:~8,1%%dic:~15,1%%dic:~0,1%Introduzca el Password
%dic:~19,1%%dic:~5,1%%dic:~20,1%%dic:~0,1%/%dic:~16,1%%dic:~0,1%%dic:~22,1%%dic:~1,1%%dic:~18,1%=">> "
REM Comprobamos que el Usuario no dejo el campo vacio...
if not defined var goto main
REM Usamos la Polimetrica junto con CALL para definir la Pass
call set pass=%%%%dic:~%num:~8,1%%num:~0,1%,%num:~8,1%%%%%%%%%dic:~1%num:~6,1%,%num:~8,1%%%
%%a%%%%dic:~%num:~8,1%%num:~1,1%,1%%%%%%%%dic:~%num:~7,1%0,%num:~8,1%%%%%
REM Volvemos a usar CALL para eliminar los caracteres % sobrantes
REM y asi extraer el caracter deseado....
call set pass=%pass:^%=%
REM Comprobamos que la Pass introducida sea la Correcta
echo.
if /i %var%==%pass% (echo Muy Bien ^^_^^) else (echo No Acertaste o_0)
%dic:~5,1%%dic:~3,1%%dic:~8,1%%dic:~15,1%.
echo Salir
pause >nul
exit
Primero se realizan unas expansiones simples de la variable %DIC% las cuales se
encargan de mostrar el ECHO, luego de preguntar por la Variable la usuario se procede
a definir la Variable %PASS% resultado de la extracción de caracteres de la variable
%DIC% mediante múltiples expansiones de variable dentro de otras expansiones
usando la polimetría.
Ej.
%%%%dic:~%num:~8,1%%num:~0,1%,%num:~8,1%%%%%
%num:~8,1% = 1
%num:~0,1% = 9
%num:~8,1% = 1
%%%%dic:~19,1%%%%
Para luego hacer una sustitución de caracteres en la que se eliminan los %%
sobrantes, pero lo hacemos mediante CALL para que se muestre el valor de la
extracción anterior, de lo contrario no funcionaria.
call set pass=%pass:^%=%
Aunque esto tambien puede realizarse haciendo un doble CALL a la primera polimetrica.
Con lo que deducimos que el primer carácter del password es la letra "S" sin importar
que este en mayúscula o minúscula pues al compararse se usa el modificador /i en el IF
que permite esa flexibilidad.
La otra forma como decia era usando SETLOCAL ENABLDELAYED EXPANSION, tal como
lo hago en este ejemplo:
Código [Seleccionar]
@echo off
title Efecto de Marquesina
REM Coded by :: SmartGenius ::
SETLOCAL ENABLEDELAYEDEXPANSION
:ini
set /p texto="Texto a Mostrar: > "
if not defined texto goto ini
set v=%texto%
call :string %v%
REM Obtenemos el Tamaño de Pantalla
for /f "tokens=2" %%a in ('mode con^|find /i "col"') do (set /a l=%%a-%length%)
REM Creamos una Variable con L espacios vacios
for /l %%b in (1,1,%l%) do (call :new %%b)
REM Mostramos la Cadena andando hacia la derecha
for /l %%c in (1,1,%l%) do (call :show %%c)
REM Mostramos la Cadena andando hacia la izquierda
for /l %%d in (%l%,-1,1) do (call :show %%d)
pause
exit
:new
set r= %r%
goto :eof
:show
cls
set lim=%1
echo !r:~0,%lim%!%texto%
ping -n 1 >nul
goto :eof
:string
set /a length=%length%+1
set v=%v:~1%
if "%v%"=="" goto :eof
goto string
Espero hayan entendido en concepto y lo tengan lo mas claro posible, pues les
ayudara a mejorar en sus códigos.
Saludos. =D