[Batch] Tutorial de Polimetria - by Smart

Iniciado por SmartGenius, 16 Noviembre 2008, 00:57 AM

0 Miembros y 1 Visitante están viendo este tema.

SmartGenius

CitarMe he tomado la molestia d emodificar y organizar el Tutorial de Fakher, aparte de añadirle algo d einfo...espero no le importe  ;)

Técnicamente se definiría a la polimétrica como un código capaz de auto manipularse para lograr obtener valores reales de una variable e integrarlos en otras...

La polimétrica consiste en usar variables dentro de variables y obtener  un código que puede ser recursivo y con aplicación al polimorfismo, puede hacerse uso de las expansiones de variables para obtener códigos optimizados de programas que normalmente llevarían muchas líneas de código.

Tomemos como ejemplo un código que nos Genera una Función llamada "Echo Dinámico" o "Efecto Maquina de Escribir".

CitarEj. set a=%a:~0,%f%%

El problema reside en que la Consola de Comandos (CMD) lee lo que se encuentre entre porcentajes como una variable, por lo que en el ejemplo anterior le pedimos al programa que defina una variable que sea igual al valor que tenga la variable %a:~0,%(cuyo valor es 0..."" nulo) que tenga una cadena con el contenido "f" y otra variable que se llame %% (cuyo valor también es "" nulo) por lo tanto el valor de la variable a seria "f".

Entonces la solución  seria definir unas "subvariables" y luego juntarlas en la variable final, o haciendo uso de varias símbolos de porcentajes (%) recurriendo a la redirección a archivos externos temporales o uso de CALL. Tambien tenemos otras formas usando SETLOCAL ENABLEDELAYEDEXPANSION pero eso lo explicaremos mas
adelante...

@echo off
REM Echo Dinamico by Fhaker
copy %0 tempcode.txt
cls
set /p a=Echo Dinamico:
set b=""
goto start
:start
if %a%==%b% type tempcode.txt >%0 && goto control
set /a f=%f%+1
if %f%==1 echo "" >>%0
set h=%a:~0,
set l=%h%%f%%o%
echo :menu%f% >>%0
echo set b=%%%l%%% >>%0
echo goto start >>%0
goto menu%f%
:control
set k=%f%
set /a kk=%f%+2
set f=0
goto menu
:menu
set /a f=%f%+1
if %f%==%kk% pause && type tempcode.txt >%0 && goto fin
set h=%a:~0,
set l=%h%%f%%o%
echo :menu%f% >>%0
echo cls >>%0
echo set b=%%%l%%% >>%0
if not %f%==1 echo echo %b%_ >>%0
echo goto menu >>%0
ping -n 1,5 127.0.0.1 >nul
goto menu%f%
:fin
del /f /q tempcode.txt
exit


Lo que hace esto es definir una variable que contenga la cadena %a:~0, que como podrán ver tiene un porcentaje adelante y por lo cual al no cerrarse la supuesta variable el porcentaje queda en la cadena...

Después lo que se hace es unir en la variable %l% la variable %h% que es la recién creada, la variable %f% que es la que contiene el numero de bucle, de menú y de letra que el programa va a mostrar usando la expansión de la variable %a%, y la variable %o% que no tiene nada.

Entonces el Código realiza lo siguiente:

1.   Se copia así mismo en un Archivo Temporal (Respaldo).
2.   Se pide al Usuario que Introduzca una Dato.
3.   Se hacen las comprobaciones para cuando el Dato ha sido mostrado en su totalidad.
4.   Se definen las Variables antes mencionadas y luego se hace la expansión.
5.   Se genera una nueva parte de código que es introducida al Final del archivo actual.
6.   Se va mostrando el Dato carácter por carácter  y una vez llegado al último finaliza el bucle y termina el código.
7.   Se restablece el archivo original desde el Respaldo creado al Inicio.

Este Código puede optimizarse aun más:

  @echo off
REM Echo Dinamico by Fhaker
REM Optimized by ::SmartGenius::
copy %0 tempcode.txt
cls
set /p a=Echo Dinamico:
set b=
goto start
:start
set /a f=%f%+1
if %f%==1 echo ::Inicio Code Generado >>%0
set h=%a:~0,
set l=%h%%f%%o%
echo :menu%f% >>%0
echo cls >>%0
echo set b=%%%l%%% >>%0
echo echo %b%_ >>%0
echo if "%b%"=="%a% " goto fin >>%0
echo goto start >>%0
ping -n 2 0.0.0.0 >nul
goto menu%f%

:fin
pause
exit


Este último realiza la misma acción pero se eliminaron unas estructuras de control innecesarias y mejora el código.

Haciendo la prueba al código, lo guardamos como DYNECHO.BAT, lo ejecutamos e introducimos como dato "Hola", se muestra el efecto de escritura “carácter por carácter" o "Maquina de Escribir", una vez que finaliza el código se procede a mirar el código fuente de DYNECHO.BAT y veremos el cambio.

continua....


SmartGenius

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
: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.

    @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:
@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.

@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.

@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:

@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