[Tutorial] Tecnica para reconstruir archivos en Batch - by xassiz

Tecnica para reconstruir archivos en Batch

Creditos a el usuario 0x0309 que gracias a el aprendi esto Giñar



Primero, para hacer esto de esta forma necesitamos debug.

Entonces saber que no funcionará en Windows de 64 bits ni en Windows seven, ya que debug es un programa para 16 bits. Lengua


Bien, el primer ejemplo que voy a poner es reconstruir un archivo bat, al que le llamaremos hola.bat y su código será:

@echo off
echo hola
pause
exit


Es decir un "Hola Mundo".


Una vez creado hola.bat abrimos el cmd y ponemos "debug hola.bat":

C:\Users\xassiz\Desktop> debug hola.bat
-


Nos va a aparecer un guión. Ahí escribiremos "d", y nos aparecerá algo así:

C:\Users\xassiz\Desktop> debug hola.bat
-d

17B6:0100 40 65 63 68 6F 20 6F 66-66 0D 0A 65 63 68 6F 20 @echo off..echo
17B6:0110 68 6F 6C 61 0D 0A 70 61-75 73 65 0D 0A 65 78 69 hola..pause..exi
17B6:0120 74 0D 0A 00 00 00 00 00-00 00 00 00 00 00 00 00 t...............
17B6:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17B6:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17B6:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17B6:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17B6:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-


Ahí nos sale otro guión, en este escribimos una "q" para salir.

Son intrucciones y datos en hexadecimal.

Bien, ahora si nos fijamos en el peso de "hola.bat" vemos que ocupa 35 bytes.

Pues cogemos los primeros 35 bytes en hexadecimal y los copiamos (de 40 a 0A).

Luego abrimos el notepad y escribimos:


e 0100 40 65 63 68 6F 20 6F 66 66 0D 0A 65 63 68 6F 20
e 0110 68 6F 6C 61 0D 0A 70 61 75 73 65 0D 0A 65 78 69
e 0120 74 0D 0A


Así colocamos los bytes en hexa. Las e indican ENTER para introducir informacion.

Seguimos escribiendo:

r cx
23
n nuevo.bat
w
q
:xassiz


En total nos quedaría así:

e 0100 40 65 63 68 6F 20 6F 66 66 0D 0A 65 63 68 6F 20
e 0110 68 6F 6C 61 0D 0A 70 61 75 73 65 0D 0A 65 78 69
e 0120 74 0D 0A
r cx
23
n nuevo.bat
w
q
:xassiz


Bien, la r cx indica que escribimos en el registro CX (si sabeis ASM es muy facil).

el 23 que puse es el peso (35 bytes) en hexadecimal.

el n es el nombre con la extension (8.3)

el w viene de WRITE, de escribir.

el q como ya dije antes es para salir.

la etiqueta :xassiz es para dejar algo escrito luego de q (salir) y asegurar de que salió (se le puede poner cualquier nombre).

Bueno, esto lo guardamos como codigo.src por ejemplo.


Entonces vamos al cmd y ponemos "debug<codigo.src":

C:\Users\xassiz\Desktop> debug<codigo.src

-e 0100 40 65 63 68 6F 20 6F 66 66 0D 0A 65 63 68 6F 20
-e 0110 68 6F 6C 61 0D 0A 70 61 75 73 65 0D 0A 65 78 69
-e 0120 74 0D 0A
-r cx
CX 0000
:23
-n nuevo.bat
-w
Writing 00023 bytes
-q


Si nos fijamos, vemos que se creó el archivo "NUEVO.bat", que al ejecutarlo vemos que tiene el mismo código que hola.bat, es decir, reconstruímos "hola.bat" con debug.



Bien, ahora mostraré algunos tips para hacer el proceso pronto y enteramente desde un .bat

Que conste que esta técnica a partir de ahora no se la vi a nadie, la desarollé yo (lo cual no quiere decir que lo hiciera otra persona antes).

Bueno, comencemos.


Una vez conseguimos el código:

e 0100 40 65 63 68 6F 20 6F 66 66 0D 0A 65 63 68 6F 20
e 0110 68 6F 6C 61 0D 0A 70 61 75 73 65 0D 0A 65 78 69
e 0120 74 0D 0A
r cx
23
n nuevo.bat
w
q
:xassiz


Podemos crear nuevo.bat sin necesidad de crear ningún otro archivo aparte como codigo.src.

Pero primero mostraré como copiar todo el codigo con facilidad.


Vamos a la cmd y ponemos "echo d|debug hola.bat>codigo.txt". Y vemos que se nos genera el archivo "codigo.bat" con la salida del cmd dentro.

¿Como funciona? Pues usando pipes ("|") envío una "d" a la salida de debug (para cuando nos pide que pongamos algo con el guion) y envio la salida a codigo.txt.


Bueno, una vez con el código preparado, podemos hacer algo.

En vez de crear un archivo y hacerle un debug<archivo podemos imprimir el contenido en el cmd y mediante pipes hacerle un debug sin necesidar de crear mas nada!


Veamos el ejemplo:

(
echo:e 0100 40 65 63 68 6F 20 6F 66 66 0D 0A 65 63 68 6F 20
echo:e 0110 68 6F 6C 61 0D 0A 70 61 75 73 65 0D 0A 65 78 69
echo:e 0120 74 0D 0A
echo:r cx
echo:23
echo:n nuevo.bat
echo:w
echo:q
echo::xassiz
)|debug


Y se nos reconstruye directamente nuevo.bat.







Bueno, espero que os haya gustado, la pega de esto es que el limite es de 65280 bytes.


Saludos,
xassiz Giñar

[Batch] Agenda - by xassiz

Bueno!

Pues hace mucho que no posteaba nada, espero volver a hacerlo más a menudo xD


Os presento mi "agenda" en Batch, la acabo de programar para tener apuntados los examenes que voy a tener xDD

A diferencia de otras agendas que vi, la mía tiene menos líneas de código y "creé un sistema" que permite almacenar la información añadida sin crear archivos adicionales.


Espero que os guste, aquí teneis el código:

@echo off
title Agenda - by xassiz
setlocal enabledelayedexpansion

:menu
cls
echo:
echo: ^| MENU ^|
echo:
echo: 1. Ver Agenda
echo: 2. Agregar Tarea
echo: 3. Salir
echo:
set "op="
set/p "op=>> "
if not defined op (goto:menu)
if ["%op%"]==["1"] (goto:Show)
if ["%op%"]==["2"] (goto:Add)
if ["%op%"]==["3"] (exit)
goto:menu

:Show
cls
for /f "tokens=*" %%x in (%~0) do (
set "line=
%%x"
if ["!line:~0,10!"]==["::AGENDA::"] (
set "line=!line:~10!"
echo:
echo:!line!
)
)
echo:
pause
goto:menu

:Add
cls
set "fecha="
set/p "fecha=- Fecha (dd/mm/aaaa): "
if not defined fecha (goto:Add)
echo:
set "tarea="
set/p "tarea=- Tarea: "
if not defined tarea (goto:Add)
for
%%y in ("fecha","tarea") do (
for
%%z in ("^","&","<",">","|") do (set "%%~y=!%%~y:%%~z=^%%~z!")
)
echo:::AGENDA::
%fecha% - %tarea% >> %~0
goto:menu


Saludos! ::) ;)