Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - 0x0309

#1
Nivel Web / Evitar cookie nula en php
18 Octubre 2009, 04:42 AM
Hola, me gustaría preguntar de qué manera se puede evitar una cookie nula.

Por ejemplo, en un sitio existía un mecanismo de autenticación algo así (los nombres los he cambiado):

/adm/control.php

<?php
session_start
();
if (
$_SESSION['auth'] != 'YES') {
    
header('Location: index.php');
}
echo 
'Panel de admin';
?>



/adm/index.php

<?php
echo 'No logeado';
?>



y al acceder a /adm/control.php se va a index.php porque no está registrada la variable de sesión.
Pero si modifico el contenido de la Cookie con tamper data así:


PHPSESSID=


Se produce lo siguiente:


Warning: session_start() [function.session-start]: The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in C:\sitio\adm\control.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\sitio\adm\control.php:3) in C:\sitio\adm\control.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\sitio\adm\control.php:3) in C:\sitio\adm\control.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at C:\sitio\adm\control.php:3) in C:\sitio\adm\control.php on line 5
Panel de admin


Entonces, mi pregunta es cómo evitar que session_start() se caiga ante un ataque así.

#2
PHP / Ayuda con sistema de login
13 Octubre 2009, 22:14 PM
Hola, estoy intentando desarrollar un sistema de login en php, al parecer todo funciona bien, pero lo que no me funciona es el sistema anti session hijacking.
Quisiera saber si alguien me puede ayudar a encontrar el problema.

Para probar el csrf, una vez logueado con tamper data trato de enviar logout pero eliminando el t= Entonces dice csrf attempt.

Pero para probar session hijacking, no me funciona el tema del $fingerprint, una vez logueado, abro otra pestaña con firefox, y accedo a la url viendo el contenido exlusivo, si abro otra pestaña y accedo a la url, pero modificando el user agent, no se cae, diciendo session hijacking attempt, como que no cambia la cadena $fingerprint, y ese es el problema que tengo.

Si alguien por favor también pudiera darme sugerencias para hacer un buen sistema de login, se lo agradecería también.

Código (php) [Seleccionar]

//editado porque no estaba bueno. Abajo encuentran un código más decente.
#3
PHP / Filtro SQL Injection y Filtro XSS
13 Octubre 2009, 06:20 AM
Aquí comparto dos funciones que hice para prevenir sql injection y xss.

El código está en base64, una vez que lo decodifican, pueden guardarlo como Filtros.php y requerirlo en su script.



PD9waHANCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEZpbHRybyBw
YXJhIGV2aXRhciBTUUwgSW5qZWN0aW9uICMNCiMgdmVyc2lvbjogMC4xICAgICAgICAgICAgICAg
ICAgICAgIw0KIyBBdXRvcjogMHgwMzA5ICAgICAgICAgICAgICAgICAgICAjDQojIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmZ1bmN0aW9uIGFudGlTUUxJbmplY3Rpb24oJHN0
cikNCnsNCiAgICBpZiAoaXNfc3RyaW5nKCRzdHIpKSB7DQogICAgICAgICAvL2VuIHBocCA2IG1h
Z2ljIHF1b3RlcyB5YSBubyB2YW4NCiAgICAgICAgaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkp
IHsNCiAgICAgICAgICAgICRzdHIgPSBzdHJpcHNsYXNoZXMoJHN0cik7DQogICAgICAgIH0NCiAg
ICAgICAgJHN0ciA9IG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkc3RyKTsNCiAgICAgICAgJHN0
ciA9IGFkZGNzbGFzaGVzKCRzdHIsICclXycpOw0KICAgIH0NCiAgICByZXR1cm4gJHN0cjsNCn0N
Cg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBGaWx0cm8g
cGFyYSBldml0YXIgQ3Jvc3MtU2l0ZSBTY3JpcHRpbmcgIw0KIyB2ZXJzaW9uOiAwLjEgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIw0KIyBBdXRvcjogMHgwMzA5ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0K
ZnVuY3Rpb24gYW50aUNyb3NzU2l0ZVNjcmlwdGluZygkc3RyKQ0Kew0KICAgIGlmIChpc19zdHJp
bmcoJHN0cikpIHsNCiAgICAgICAkc3RyID0gaHRtbGVudGl0aWVzKCRzdHIsIEVOVF9RVU9URVMs
ICdVVEYtOCcpOw0KICAgIH0NCiAgICByZXR1cm4gJHN0cjsNCn0NCg0KPz4=


y pueden usarlo así:


//Para consultas a base de datos:
//Si el campo id de la base de datos es string :
$id = antiSQLInjection( $_POST['id'] );
//Sino si el campo id de la base de datos es entero:
$id = (int) $_POST['id'];

$query = "select nombre from usuario where id='{$id}'";
mysql_query($query);


//Para imprimir:
echo antiCrossSiteScripting($_POST['texto']);



#4
PHP / Pegar imagenes en php
12 Octubre 2009, 22:04 PM
Hola, tengo un pequeño problema, estoy generando imagenes de niveles de sokoban dinámicamente.

El problema es que para que en pantalla se muestre algo así:



Este es el código que genero con php:

Código (html) [Seleccionar]

<img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/player.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/goal_box.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/goal_box.gif" width="16" height="16"  /><img src="http://midominio/images/goal.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/box.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><br/>
<img src="http://midominio/images/floor.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/wall.gif" width="16" height="16"  /><img src="http://midominio/images/floor.gif" width="16" height="16"  /><br/>
<br/>


Y obviamente, el htm generado pesa mucho, por lo que tendré problemas de ancho de banda, por ejemplo, para unos 100 niveles, el htm pesa más de un mega.

Tengo pensado evitar:

width="16" height="16

y poner class="algo" y especificar el tamaño con css.

Sin embargo de todas formas, es mucho código, así es que me gustaría poder pegar todas las imagenes, ¿se puede hacer con php dinámicamente? y así generar una sola imagen para que el htm quede:

<img src="http://midominio/images/imagenGenerada.gif"  />

Si se puede, podría generar todas las imágenes, y subirlas a otro hosting, por ejemplo imageshack, así me ahorro un montón de ancho de banda.


Nota: cada cuadro de 16*16 de la imagen que muestro es una imagen, por ejemplo: wall.gif es el bloque de muralla, floor.gif es el bloque negro, etc.
#5
PHP / Sugerencia login
7 Octubre 2009, 07:44 AM
Hola, estoy recién comenzando a jugar con las sesiones, quisiera recibir por favor sugerencias sobre este script para comprender bien la lógica.
Edito: tenía un problema, pero edito, ahora me gustaría recibir sugerencias sobre cómo mejorar el script.


Le he añadido protección básica contra fijación de sesiones y cross site request forgeries.

Código (php) [Seleccionar]

<?php

session_start
();


if (!isset(
$_SESSION['logeado']))
{
if ($_POST['user'] == 'carlos' && $_POST['password'] == 'entrar')
{
session_regenerate_id();
$_SESSION['logeado'] = true;
$_SESSION['token'] = md5(uniqid(rand(), TRUE));
}
} else if (
$_POST['logout'])
{
if (isset($_SESSION['token']) &&
        
$_POST['token'] == $_SESSION['token'])
    
{
      
$_SESSION = array();
   
session_destroy();
    
}

}

if (
$_SESSION['logeado'] == true)
{
   
echo 'Contenido exlusivo' '<br />';
}


?>



<html>

<body>

<?php

if ($_SESSION['logeado'] == false)
{
?>

   <form method='POST' action='login.php'>
   User:
    <input name="user" type="text" maxlength="50" size="20" />
   Password:
    <input name="password" type="text" maxlength="50" size="20" />
    <input name="login" type="submit" value="Login" />
   </form>
   
<?php 
} else
{
?>

   
   <form method='POST' action='login.php'>
    <input name="token" type="hidden" value="<?php echo $_SESSION['token']; ?>" />
    <input name="logout" type="submit" value="Logout" />
   </form>

<?php
}
?>

   
</body>
   
</html>

#6
Tengo esa duda:
¿Se puede tener una configuración personalizada de php en un servidor compartido?

Me gustaría contratar un hosting barato (compartido), pero me gustaría tener mi configuración personal de php, por ejemplo, deshabilitar las magic quotes, y establecer la conexión por defecto a la bd dentro de la configuración de php, así me evito exponer los datos de la bd innecesariamente.

Mi pregunta es si se puede.
#7
Scripting / Bug batch.
1 Octubre 2009, 08:33 AM
Yo había leído en un sitio que para asignar con el comando set es lo mismo:

set "variable=valor"

que

(set variable=valor)

Sin embargo, he encontrado un bug de cmd.exe.

Cuando cmd.exe reconoce una sola comilla dentro de paréntesis termina el archivo por lotes.

Por eso si se hace:

(")
el archivo por lotes termina.

Por eso si tenemos el siguiene código:

test.cmd
@echo off
(set var=%1)
echo.El texto se muestra.


y ejecutamos:

test.cmd "
el texto no se muestra porque el archivo por lotes concluyó antes por el bug.

Pero si hacemos:

test.cmd

@echo off
set "var=%1"
echo.El texto se muestra.


el texto si es mostrado.

Entonces no es lo mismo:
(set variable=valor)
que contiene el bug.

que:

set "variable=valor"

#8
Scripting / Error reply [batch]
30 Septiembre 2009, 22:28 PM
Hola sin querer creo haber encontrado un problema del comando reply alias keyboard.

keyboard.com
14 bytes
:reply
(
echo.N REPLY.COM;O KEYBOARD.COM
echo.E 0000 B4 08 CD 21 3C 00 75 02 CD 21 B4 4C CD 21
echo.R CX
echo.000E
echo.W0
echo.Q
echo.
) | debug


Cuando lo ejecutan con tabla de códigos 1252 sale un mensaje:

chcp 1252
reply.com
3íÆž è®ôè&s       ítè ë Æ"œè sÚëøëù^_ZY[XÃSQRWVœèf ƒ>ð @

        - 1252,


Solución, llamar a reply.com redirigiendo salida a nul:

reply.com > nul

Creo que será necesario siempre redirigir la salida a nul para evitar posibles mensajes. :)

También, si le dan como entrada a reply nul se queda "colgado".


reply.com < nul


Alternativa a reply.com:

getkey.com de Herbert Kleebauer
137 bytes
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>getkey.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>>getkey.com
echo L?p{KsUWK`LR0x>>getkey.com



#9
Scripting / Respaldo towel.blinkenlights.nl
27 Septiembre 2009, 23:57 PM
Hace tiempo quise hacer esto, y pensé que no se podía, hacer un respaldo de la animación de star wars de towel.blinkenlights.nl

Para verla:
telnet.exe towel.blinkenlights.nl

Yo intentaba hacer:

telnet.exe towel.blinkenlights.nl > respaldo.txt

y no funcionó.

Al final, desistí, pero hoy, leyendo la ayuda del comando telnet.exe me acordé de esto y ya conseguí hacer el respaldo.

Es así:

Código (dos) [Seleccionar]
telnet.exe -f respaldo.txt towel.blinkenlights.nl

De esa forma, todo lo que se ve va quedando en el archivo de texto.

Más o menos queda así:


                                          /~\
                                         |oo )
                                         _\=/_
                         ___            /  _  \
                        / ()\          //|/.\|\\
                      _|_____|_        \\ \_/  ||
                     | | === | |        \|\ /| ||
                     |_|  O  |_|        # _ _/  #
                      ||  O  ||          | | |
                      ||__*__||          | | |
                     |~ \___/ ~|         []|[]
                     /=\ /=\ /=\         | | |
     ________________[_]_[_]_[_]________/_]_[_\_________________________
                                          /~\
                                         |oo )    Did you hear that?
                                         _\=/_
                         ___            /  _  \
                        / ()\          //|/.\|\\
                      _|_____|_        \\ \_/  ||
                     | | === | |        \|\ /| ||
                     |_|  O  |_|        # _ _/ #
                      ||  O  ||          | | |
                      ||__*__||          | | |
                     |~ \___/ ~|         []|[]
                     /=\ /=\ /=\         | | |
     ________________[_]_[_]_[_]________/_]_[_\_________________________
                                          /~\
                                         |oo )
                                         _\=/_
                         ___            /  _  \
                        / ()\          //|/.\|\\
                      _|_____|_        \\ \_/  ||
                     | | === | |        \|\ /| ||
                     |_|  O  |_|        # _ _/ #
                      ||  O  ||          | | |
                      ||__*__||          | | |
                     |~ \___/ ~|         []|[]
                     /=\ /=\ /=\         | | |
     ________________[_]_[_]_[_]________/_]_[_\_________________________
                                          /~\
                                         |oo )
                                         _\=/_
                         ___         #  /  _  \
                        / ()\        \\//|/.\|\\
                      _|_____|_       \/  \_/  ||
                     | | === | |         |\ /| ||
                     |_|  O  |_|         \_ _/ #
                      ||  O  ||          | | |
                      ||__*__||          | | |
                     |~ \___/ ~|         []|[]
                     /=\ /=\ /=\         | | |
     ________________[_]_[_]_[_]________/_]_[_\_________________________
                                          /~\
                                         ( oo|    They've shut down
                                         _\=/_    the main reactor.
                         ___         #  /  _  \
                        / ()\        \\//|/.\|\\
                      _|_____|_       \/  \_/  ||
                     | | === | |         |\ /| ||
                     |_|  O  |_|         \_ _/  #
                      ||  O  ||          | | |
                      ||__*__||          | | |
                     |~ \___/ ~|         []|[]
                     /=\ /=\ /=\         | | |
     ________________[_]_[_]_[_]________/_]_[_\_________________________
                                          /~\
                                         ( oo|    They've shut down
                                         _\=/_    the main reactor.
                         ___         #  /  _  \
                        / ()\        \\//|/.\|\\
                      _|_____|_       \/  \_/  ||
                     | | === | |         |\ /| ||
                     |_|  O  |_|         \_ _/   #
                      ||  O  ||          | | |
                      ||__*__||          | | |
                     |~ \___/ ~|         []|[]
                     /=\ /=\ /=\         | | |
     ________________[_]_[_]_[_]________/_]_[_\_________________________


Sin embargo, esto genera una salida imprimible, para un verdadero respaldo se puede usar el putty y activar en Session -> Logging: All session output.
De esa forma tienen el texto con las secuencias de escape.
Por ejemplo:


                                           /~\                           
                                          |oo )         At last!         
                                          _\=/_                         
                          ___            /  _  \                         
                         / ()\          //|/.\|\\                       
                       _|_____|_       ||  \_/  ||                       
                      | | === | |      || |\ /| ||                       
                      |_|  O  |_|       # \_ _/ #                       
                       ||  O  ||          | | |                         
                       ||__*__||          | | |                         
                      |~ \___/ ~|         []|[]                         
                      /=\ /=\ /=\         | | |                         
      ________________[_]_[_]_[_]________/_]_[_\_________________________

#10
PHP / Ayuda con header [solucionado]
25 Septiembre 2009, 06:49 AM
Hola, tengo un pequeño problema y quisiera pedirles ayuda por favor para solucionarlo.

[ya lo solucioné]

Estoy escribiendo un conversor de archivos en php, para ello ya tengo listo y probado el upload y funciona bien, pero quiero que una vez comprobé que el archivo subido es correcto, proceder a la conversión y que aparezca para descargarlo, de lo contrario que muestre el mensaje de error.

este es un código con la idea, y con el problema.

Código (php) [Seleccionar]

<?php

header
('Content-Type: text/plain');
header('Content-Disposition: attachment; filename=' '"' 'convertido.txt' '"');

?>


<?

$archivoValido = 0;

if ($archivoValido == 1)
{
echo "Esto va dentro del archivo: convertido.txt";
}
else
{
// Que debo hacer para el mensaje de error en la página.?
echo "Error. que esto se muestre en la pagina";
}



?>


edito: al final la solución era usar un solo bloque de código php, y especificar los headers solo en la sección correspondiente. Al final queda así:

Código (php) [Seleccionar]

<?

$archivoValido = 0;

if ($archivoValido == 1)
{
      header('Content-Type: text/plain');
       header('Content-Disposition: attachment; filename=' . '"' . 'convertido.txt' . '"');
echo "Esto va dentro del archivo: convertido.txt";
}
else
{
// Que debo hacer para el mensaje de error en la página.?
echo "Error. que esto se muestre en la pagina";
}



?>


#11
Java / Ayuda con proyecto personal.
10 Septiembre 2009, 21:15 PM
Hola a todos, tengo una idea para hacer un programa en java, que consiste en lo siguiente:

Tener una imagen con elementos cuadrados dentro, y quiero poder seleccionar los elementos, (esto no sé como hacerlo, algo si como cuando en photoshop se coloca la herramienta recortar. Una vez tenga identificados todos los elementos, proceder a analizar toda la imagen para así poder hacer algo.


Dejo un ejemplo de mi idea.

Origen:


Cargo en el JFrame la imagen, se debe poder hacerle zoom y seleccionar un elemento dentro de ella, y luego asignar a ese trozo un nombre.

Por ejemplo en la imagen siguiente selecciono un trozo, y lo llamo : Torre negra.



Torre negra.
y así con todos los elementos.

Dama blanca.

Finalmente, cuando tengo todos los elementos reconocidos, es decir, tengo en memoria, una imagen de cada elemento, recorro en cuadrados la imagen, (la imagen quiero que sea en formato png, para que no haya errores de comparación, es decir sean todos los cuadrados iguales), y hago una comprobación de a qué elemento corresponde ese cuadrado, y luego genero otra imagen con otros elementos existentes.

Resultado:


En resumen, el usuario hace el reconocimiento visual de cada elemento y cuando están todos identificados, se procede a generar otra imagen con los mismos elementos pero con otra vista.

¿Qué clases me podrían ayudar a hacer esto?
Necesito:
-Cargar la imagen en formato png.
-Poder hacerle zoom.
-Seleccionar una parte dentro de ella, y a partir de esa seleción generar esa selección como imagen.
-Ir recorriendo la imagen en trozos y así hacer la comprobación (Comparar dos imagenes en memoria) y generar otra imagen.

Agradecería mucho la ayuda, pues quiero hacer un proyecto personal similar a este, pero basado en la misma idea.
#12
Scripting / [Batch] Calendario
29 Agosto 2009, 07:38 AM
Hola, he realizado un calendario en batch. La idea es que se ejecute desde la línea de comandos, por ello si lo abren haciendo doble clic se abrirá y se cerrará.
#13
Hola quiero saber si se puede, y si así es: cómo.
¿Se puede enviar mensajes a una ventana?

Sucede que tengo un código hecho en batch, usando nircmdc.exe envío mensajes directamente a una ventana, para resolver puzzles, pero quiero hacerlo con vbscript.

En este caso envío las notificaciones: WM_KEYDOWN y WM_KEYUP
Quiero convertir este código de batch + nircmdc a vbscript:


@echo off
setlocal enabledelayedexpansion enableextensions

:in
cls
(set lurd=)
set /p lurd=Lurd:
if not defined lurd (goto :in)

:loop_in
set mov=!lurd:~0,1!
set lurd=!lurd:~1!
cls
echo.!mov!
(set kc=0x0)
if /i "!mov!"=="L" (set kc=0x25)
if /i "!mov!"=="U" (set kc=0x26)
if /i "!mov!"=="R" (set kc=0x27)
if /i "!mov!"=="D" (set kc=0x28)
nircmdc win sendmsg ititle " for WINDOWS" 0x100 !kc! 0
nircmdc wait 360
nircmdc win sendmsg ititle " for WINDOWS" 0x101 !kc! 0

if defined lurd (goto :loop_in)
goto :in

#14
Scripting / colores2
13 Agosto 2009, 10:11 AM
Bueno, aquí les dejo a colores2, basado en ese script que escribía en colores, pero que mostraba ':'
Bien, me acordé de printf, entonces busqué información sobre cómo modificar un archivo binario con vbscript, y simplemente reemplacé un byte en findstr.exe y creé findstr2.exe
Aquí está la dirección dónde subí el código. No quise "echoear" el código vbs.

http://sites.google.com/site/cmdscripts/home/colores.zip?attredirects=0
#15
Hola quiero hacer algo, pero no sé nada de vbs, así es que pido un poco de ayuda por favor.

Lo que quiero es leer un archivo binario y reemplazar 3 bytes, y luego escribir en el mismo archivo

estaba haciendo esto:

set unFileSystemObject = CreateObject("Scripting.FileSystemObject")
set archivo = unFileSystemObject.OpenTextFile("c:\f.bin", ForReading)
dim contenidoArchivo = archivo.ReadAll
contenidoArchivo = contenidoArchivo.Replace("")


y quiero reemplazar tres bytes, pero en modo binario, es decir supongamos que tengo los bytes:
1 2 3

y quiero reemplazarlos por:

1 2 0

Necesito que sea en binario porque el byte 0 es el ascii 0, y no es imprimible, por eso digo que debe ser binario.

Edito: ya encontré la solución.
#16
Scripting / Inyecciones Batch
8 Agosto 2009, 14:57 PM
@echo off

Inyecciones batch

Las inyecciones batch son variables que contienen carácteres especiales y/o texto con significado para cmd.exe y que al ser expandidas de manera simple transforma la línea de comandos.

Por qué les interesa a algunas personas
Porque creen que esto es una materia del "lenguaje archivos por lotes".

Valor práctico de evitarlas
Se trata el contenido de las variables como texto, y se obtienen los resultados esperados.

Problema de seguridad
Pueden ser un problema de seguridad si no se las conoce, y se utiliza un archivo por lotes como autenticador de usuarios en una conexión remota en modo terminal, aunque esto es poco común que se realice, y en mi opinión alejado de la realidad.

Tipos de expansiones de variables
En cmd.exe existen dos tipos de expansiones de variables oficiales, existe una tercera, la del comando set /a:
-Expansión simple: es la más común y utilizada. Se utiliza el carácter de porcentaje a cada lado del nombre de la variable para obtener su contenido. Esta expansión es realizada cuando se lee un comando. Por ejemplo, si dentro de un bloque if creamos una variable que no existía antes, asignándole un valor, y la expandimos de manera simple dentro del mismo bloque, la expansión expandirá vacío porque la expansión se realizó cuando se leyó el bloque del comando if y la variable no contenía nada. Con esta expansión el texto del contenido de la variable puede considerarse como parte de la línea de comandos, y no como solamente texto.

-Expansión retardada: no es tan utilizada. Se utiliza el carácter exclamación final. Con esta expansión el texto del contenido de la variable es considerado en la mayoría de los casos como solamente texto por lo que en salvo casos especiales no modifica la línea de comandos. Esta expansión es realizada cuando se ejecuta el comando por lo que se obtiene el valor actual de una variable en todo momento. Puede utilizarse en conjunto con la expansión simple para obtener el contenido del contenido de una variable. Ejemplo, si tengo una variable llamada valorUno que contiene valorDos, y quiero obtener el valor de valorDos a través de valorUno se puede hacer: !%valorUno%!

Casos improbables, rídiculos, quizás realizados alguna vez.

--------------------------------------------------------------
Caso 1.
conexión con netcat

Equipo servidor:
ip:192.168.0.103
comando para escuchar conexiones:
nc.exe -L -d -e seguridad.bat -p 123

Equipo cliente:
comando para conectarse:
nc.exe -vv 192.168.0.103 123

seguridad.bat:
@echo off
set /p password=Ingrese password:
if not "%password%"=="mouse" (exit)
cmd


Si presionamos enter, el archivo por lotes finaliza, y la conexión también.
computador [192.168.0.103] 123 (?) open
Ingrese password:
sent 1, rcvd 17: NOTSOCK


Si nos volvemos a conectar, y escribimos cualquier palabra por ejemplo:12345 como esta no es la palabra mouse que se asignó como password el archivo por lotes finaliza.

computador [192.168.0.103] 123 (?) open
Ingrese password:12345
sent 6, rcvd 17: NOTSOCK


Ahora, veremos una inyección para este caso:

"=="" rem
computador [192.168.0.103] 123 (?) open
Ingrese password:"=="" rem
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Usuario>


¿Qué sucedió?
Como se realizó una expansión simple el texto se mezcló con la línea de comandos y la alteró de esta forma:
if not ""=="" rem"=="mouse" (exit)
cmd


En la primera línea se forma una valor lógico verdadero con not ""=="" y por ello se comenta el resto de la línea con el comando rem, y se continúa hacia abajo, y se ejecuta cmd.

De esta forma se obtiene acceso a la shell remota sin conocer la password.

--------------------------------------------------------------

Caso 2:
Chat de dos administradores de una escuela mediante servidor telnet.
Este caso tan imaginativo lo expongo simplemente para mostrar el código del chat que se me ocurrió xD, y para dejar claro que las batch injections son un riesgo de seguridad en casos inimaginables.

Se encuentra configurado el servidor telnet de windows, y existen dos cuentas en el sistema con privilegios de administrador.
cuenta 1: rockox
password de cuenta 1: batch

cuenta 2: smart
password de cuenta 2 : qwerty

Bien, el servidor telnet de windows ejecuta luego de autenticar a los usuarios:
%SYSTEMROOT%\System32\cmd.exe /q /k C:\WINDOWS\system32\login.cmd
(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0\)

Y se ha modificado login.cmd con el siguiente contenido:

@echo off
cls
echo.Bienvenido al chat.
echo.Usuarios conectados:
for /f "skip=4 tokens=3" %%a in ('tlntadmn -s') do echo.-%%a
echo.
echo.Presione cualquier tecla para limpiar la pantalla y comenzar a comunicarse.
pause >nul
cls
:ini
(set msg=)
set /p msg=
if defined msg (
set /a nroUsuarios=0
for /f "skip=4 tokens=1,3" %%a in (
'tlntadmn -s ^| findstr /v "\<-"') do (
if /i "%%b" neq "%username%" (
tlntadmn -m %%a "%msg%" > nul
)
)
)
goto ini



Luego se conectan a la hora de costumbre:

telnet.exe -l rockox 192.168.0.103
telnet.exe -l smart 192.168.0.103

Cliente Telnet de Microsoft

El carácter de escape es "CTRL+}"

Va a enviar información sobre su contraseña a un equipo remoto en la zona Inter
et. Es posible que esto no sea seguro. Desea enviarla de todas maneras(s/n): s

Welcome to Microsoft Telnet Service

password:



Cada uno escribe su password y se conectan.

Al primero se le muestra:

Bienvenido al chat.
Usuarios conectados:
-rockox

Presione cualquier tecla para limpiar la pantalla y comenzar a comunicarse.


Y al segundo se le muestra:

Bienvenido al chat.
Usuarios conectados:
-rockox
-smart

Presione cualquier tecla para limpiar la pantalla y comenzar a comunicarse.


el primero escribe:
hola

y al segundo se le muestra:
mensaje del rockox desde SERVIDOR el 08-08-2009 6:45:43
hola


y la conversación funciona bien, sin embargo, un alumno estuvo escaneando la red y obtuvo la password de ambos.
Cuando nadie estaba conectado, ingresó al chat, como solo había un usuario conectado, los mensajes no llegaban a ninguna parte porque:
esta línea:
if /i "%%b" neq "%username%" (
indica que solo se envié el mensaje cuando haya otro usuario conectado. Así es que se conectó con el otro usuario también.
Ahora escribió lo siguiente:
")


y obtuvo:

")
No se esperaba " > nul en este momento.

C:\WINDOWS\system32>



En realidad en esta parte:
tlntadmn -m %%a "%msg%" > nul

lo que hizo fue lo siguiente:
tlntadmn -m %%a "")" > nul

Se puso un cierre de paréntesis, sin haber puesto uno inicial antes, por lo que ante el error de sintaxis, el archivo por lotes finalizó, y se quedó en modo interactivo, debido a que windows ejecuta con el servidor telnet cmd con el parámetro /K.
Esto muestra que un error de sintaxis también puede considerarse batch injection. En este caso, la conexión no se pierde, por el parámetro /K.

--------------------------------------------------------------

Cómo evitar las batch injections

Usando expansión retardada. Los códigos quedan sin batch injections de la siguiente manera. Simplemente reemplazo los signos de porcentajes por los signos de exclamación, y añado al comienzo setlocal enableextensions enabledelayedexpansion.
enableextensions se agrega de todas maneras, pues hay comandos que solo se ejecutan con esta opción activada, como por ejemplo: goto :eof set /p exit /b
y si se ejecuta cmd /e:off se produce error de sintaxis.


seguridad.bat:
@echo off
setlocal enableextensions enabledelayedexpansion
set /p password=Ingrese password:
if not "!password!"=="mouse" (exit)
cmd


login.cmd:
@echo off
setlocal enableextensions enabledelayedexpansion
cls
echo.Bienvenido al chat.
echo.Usuarios conectados:
for /f "skip=4 tokens=3" %%a in ('tlntadmn -s') do echo.-%%a
echo.
echo.Presione cualquier tecla para limpiar la pantalla y comenzar a comunicarse.
pause >nul
cls
:ini
(set msg=)
set /p msg=
if defined msg (
set /a nroUsuarios=0
for /f "skip=4 tokens=1,3" %%a in (
'tlntadmn -s ^| findstr /v "\<-"') do (
if /i "%%b" neq "!username!" (
tlntadmn -m %%a "!msg!" > nul
)
)
)
goto ini



Casos especiales dónde se produce batch injection con expansión retardada.

comando echo on
set var=on
echo !var!
rem este comando activará el eco.

Para evitar esto utilice como primer separador del comando echo el carácter punto (.) dejándolo así:
echo.!var!


expansión del comando set /a
el comando set /a con las extensions habilitadas expande el contenido de una variable solo proporcionando el nombre.

@echo off
setlocal enabledelayedexpansion
:ini
(set p=)
(set g=)
set /p p=Password:
set /a "g=!p:~0,6!+123" >nul 2>&1
if not "!p!"=="!g!" (echo Mal.&goto:ini)
if errorlevel 9009 goto ini
echo Bien.
pause
goto :eof



Este código admite como solución (la coma es un separador dentro del comando set /a permitiendo realizar varios cálculos en una sola línea de izquierda a derecha):
123,p=
0,p=g,
0,p=0,
g,p=g,



Ejemplo explicativo
@echo off
setlocal enableextensions enabledelayedexpansion
set numero=-2
set valor=numero
set /a suma=1+2+!valor!
echo.suma=!suma!
pause


Esto produce como resultado en la variable suma:1 porque la expansión retardada expande valor como numero, y set /a realiza otra expansión expandiendo numero con su valor -2

Ahora si el código hubiese sido así:
Ejemplo
@echo off
setlocal enableextensions enabledelayedexpansion
set numero=-2
set valor=numero
set /a suma=1+2+valor
echo.suma=!suma!
pause


El resultado en la variable suma es 3 porque set /a expande la variable valor y esta no contiene ningún número por lo que se interpreta como 0.


Evitar errores de sintaxis
Para evaluar si el contenido de una variable está vacía es a mí gusto mucho más práctico y mejor hacer:
if defined variable
rem este comando requiere las extensiones habilitadas

que:

if "!variable!"==""

Evitar resultados inesperados
En comparaciones númericas con el comando if la única forma de realizarlas correctamente es NO encerrándolas entre comillas, de lo contrario son consideradas como texto, y si se quiere comparar igualdad se debe usar EQU en vez de == porque == es para texto. Tanto equ, neq leq lss geq gtr requieren las extensiones habilitadas.
No hacer:
if "5"=="5" (...)
Si hacer:
if 5 equ 5 (...)
rem esto incluso nos permite prescindir de la base (decimal, octal, hexadecimal). Ejemplo:
if 10 equ 0xA (...)

Hacer un filtro
Para hacer un filtro se requiere ir recorriendo cada carácter, siempre usando expansión retardada, y evalúando si es o no el carácter que queremos.

Ejemplo:
ejemplo de uso la función clean

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

SET /A "I=3"
SET "PWL=ByeWorld"
SET "P=PWL"

:START
@ECHO OFF
CLS
echo.*===============================================================
echo.Bienvenido a Telnet Server de Microsoft.
echo.*===============================================================
IF !I! LEQ 0 EXIT
SET /A "I-=1"
SET "INPUT="
SET /P "INPUT=Password:"
CALL :CLEAN INPUT
@FOR /F %%_ IN ("!P!") DO @IF NOT "!INPUT!"=="!%%_!" (
GOTO :START
)

ECHO.BIENVENIDO.
PAUSE
EXIT /B


:CLEAN
::deja solo caracteres dentro del rango a-z 0-9 y espacio en el contenido de las variables.
::version 2.0
::Recibe un parametro con el nombre de la variable que se quiere filtrar su contenido
::autores: Matt Alvariz , Carlos
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@SET "V=%*"
@SET "S=!%V%!"
@IF NOT DEFINED S EXIT /B 1
@SET "V="
:LOOP
@FOR %%* IN (
" " 0 1 2 3 4 5 6 7 8 9 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 @IF /I "!S:~0,1!" EQU "%%~*" SET "V=!V!!S:~0,1!"
@SET "S=!S:~1!"
@IF DEFINED S GOTO :LOOP
@(ENDLOCAL & SET %*=%V%)
@SETLOCAL ENABLEEXTENSIONS
@EXIT /B 0


Evitar interpretar texto dentro del comando set.

Cuando recibimos argumentos a una función, para expandirlos usamos %1 %2 %3 %* y no podemos hacer: !1 !2 !*
Por eso si queremos hacer esta asignación sin interpretarlo, sino considerarlo como texto, debemos encerrar el set entre paréntesis o entre comillas de esta

forma:

set "valor=%1"
o
(set valor=%1)

o si expandimos de manera simple dentro de una expansión retardada:

set "valor=!%contenido%!"
o
(set valor=!%contenido%!)

Se requiere tener las extensions activadas para usar la forma de las comillas, en cambio para los paréntesis no, pero los paréntesis a veces dan problemas dentro de otros paréntesis, como los bloques de código de un comando for.



Cómo transformar expresiones lógicas con expansiones simples de variables y crear otro comando.

set /p num=Ingrese numero:
if not defined num (set num=0)
if %num%==10 (echo.si) else (
echo .no
)


batch injection:
not a

rem cuando no se puede comentar, pues se llega a una línea hacia abajo de error.
set /p in=Ingrese passw:
if not "mipass"=="%in%" (
echo.mal
) else (
echo.bien
)


batch injection:
_" if "1"=="0

rem al revés:
set /p in=Ingrese passw:
if not "%in%"=="mipass" (
echo.mal
) else (
echo.bien
)

batch injection:
1"=="0" if "_

carácteres usados juntos o separados para provocar error de sintaxis:
(
)
alt+255
espacio
^
una,dos o tres comillas


Otros textos:
&cmd^

Bugs de programación
Esto es una observación de cómo un bug del comando for /f permite ignorar parte de un código.
El bug del comando for /f y qué no está en la documentación oficial es que la opción eol siempre debe tener un valor, y si no se específica se asume por defecto el ';'.
El bug consiste en que no puede decirsele al for /f que no asuma ningún carácter como comentario porque siempre considera el siguiente carácter.
Ejemplo:
for /f "eol=" %%a in ("texto") do rem
aqui considera la comilla del cierre de opciones como carácter de comentario.

for /f "eol= tokens=1" %%a in ("texto") do rem
aqui se considera el espacio que separa la opción tokens como el carácter de comentario.

Por eso, si uno añade cualquier texto que comience con punto y coma, este se asume como comentario y el contenido de "do" no se ejecuta.

Ejemplo:
En este código para evitar hacer antes un if defined, se agrega al texto y a la clave el carácter '.'. Por eso "entrar" queda como "entrar." y esto es para que si la variable no está definida, %%a no esté vacío y se ignore la parte del "do".


@echo off
setlocal enabledelayedexpansion enableextensions
:ini
set /p p=Clave:
for /f %%a in ("!p!.") do if "%%a" neq "entrar." (
echo.Mal
goto ini
)
echo Bien.
pause
goto :eof



Parece funcionar bien, por ejemplo si presionamos enter, sin haber escrito nada, o escribimos un texto distinto de "entrar", se nos dice que está mal.
Pero si ingresamos un texto que comience con ; este se asumirá como comentario por la razón antes explicada.

batch injection para este caso especial:
;

Solución:
No usar for /f o usar el mismo carácter de eol como delimitador y usar todos los tokens. De esta forma se eliminan todos los carácteres iniciales del texto que coinciden con el carácter de la opción eol.


@echo off
setlocal enabledelayedexpansion enableextensions
:ini
set /p p=Clave:
if "!p!" neq "entrar" (
echo.Mal
goto ini
)
echo Bien.
pause
goto :eof



@echo off
setlocal enabledelayedexpansion enableextensions
:ini
set /p p=Clave:
for /f "tokens=* delims=; eol=;" %%a in ("!p!.") do if "%%a" neq "entrar." (
echo.Mal
goto ini
)
echo Bien.
pause
goto :eof


Ejemplo, puede ingresarse como password:
;;;entrar
y como los carácteres iniciales del eol son borrados, funciona, pero si se coloca:
;;;entrar;;
no funciona.


Expansión de !
Cuando tenemos la expansión retardada activada, dentro de un archivo por lotes estos son los resultados de la expansión:

! = vacío
!! = vacío
!algo! = expande el contenido de la variable algo, si no está definida está variable, se expande vacío.


Cómo escapar el carácter ! con expansión retardada.
Cuando tenemos expansión retardada puede ser necesario escapar el carácter ! para que éste no sea expandido como vacío.
Por ejemplo dentro del comando set /a existe el operador: ! que significa que el número que procede al operador, si es 0, es convertido a 1, y si el número es distinto de 0, es convertido a 0.

Ejemplo:

@echo off
setlocal enabledelayedexpansion enableextensions

set /a n=!0
set /a m=!-5
echo.n=%n%
echo.m=%m%

pause
goto :eof


Aquí se nos muestra:

n=0
m=-5


Esto es porque el carácter ! fue expandido a vacío.

Para escapar el carácter ! con expansión retardada activada se debe hacer así:

^^!


Por eso el código para que funcione correctamente se debe escribir así:


@echo off
setlocal enabledelayedexpansion enableextensions

set /a n=^^!0
set /a m=^^!-5
echo.n=%n%
echo.n=%m%

pause
goto :eof


Ahora, nos muestra los resultados correctos:

n=1
m=0


Eso es todo, y espero que ya no se pierda más el tiempo con este tema.
#17
Hola, quiero conseguir emular la función kbhit() de conio.h pero para dos.
Conseguí el siguiente código en este libro (1001 trucos para DOS y PC y 111 Trucos más de DOS 6 - Kris Jamsa)

que se ensambla con el debug.exe así:


N CHECKKEY.COM

A 100
MOV AH,B
INT 21
AND AL,1
MOV AH,4C
INT 21

R CX
A
W
Q




Funciona, pero el problema es que tengo es que no me reconoce las teclas de las flechas. Alguien que sepa de ensamblador podría por favor ayudarme con el código de arriba, qué le falta para que me detecte las teclas de las flechas.


Yo lo construyo así dentro de cmd:

debug.exe < arhivo.txt


y lo pruebo con este batch:


@ECHO OFF
:ini
cls
CHECKKEY.COM
if errorlevel 1 echo.Presiono una tecla&pause
goto ini


Cuando presiono una tecla como las del abecedario, el espacio, cambia el errorlevel, pero cuando presiono las flechas o las teclas insertar, avanzar página no las detecta, y se marea para seguir detectando.
#18
Scripting / [Batch] For dentro de for
25 Junio 2009, 09:58 AM
Hace tiempo que quería hacer un for dentro de otro for, y por fin me resultó, solo tenía que escapar los paréntesis.

Aquí una utilidad:


@echo off
setlocal enabledelayedexpansion

set desordenados=100 008 066 077 000 520
call :ordenar %desordenados%
echo.Desordenados:%desordenados%
echo.Ordenados:%ordenados%
pause
goto :eof

:ordenar
for /f "tokens=*" %%a in (
'
^(for %%_ in ^(%*^) do @echo.%%_^)^|sort
'
) do set ordenados=!ordenados!%%a

goto :eof


De esa forma se evita tener que escribir a un archivo, puede que tenga más utilidades.
#19
He notado que se puede acceder a las distintas versiones de las páginas y los archivos de google sites.
Cuando se hace clic en el enlace de historial de versiones, solicita loguearse.
Pero cuando se agrega la variable revision y el numero, puede accederse igualmente a las distintas versiones:

Ejemplo:

http://sites.google.com/site/nombre_de_sitio/Home?revision=1

#20
Scripting / Comandos desconocidos de cmd
12 Mayo 2009, 01:00 AM
En for /f puede usarse la opción useback, que es nuevo para mí ya que los documentos dicen que es: usebackq.
Bueno, las dos opciones funcionan:


@echo off

for /f "usebackq" %%a in ('texto') do echo.%%a
rem el usebackq de toda la vida.

for /f "useback" %%a in ('texto') do echo.%%a
rem el useback nuevo para mi.
pause


Otro comando nuevo para mí es: keys

#21
Scripting / [Batch] Función Clean 2.0
5 Mayo 2009, 05:50 AM
Con Matt actualizamos la función clean que había realizado yo la otra vez, y ahora ha quedado mucho mejor.

Funcionalidad:
-Limpiar carácteres que no estén dentro del rango [0-9] [a-z] [Espacio] en el contenido de las variables.

Mejoras con respecto a la versión anterior:

-Funciona con las extensiones de comando deshabilitadas. (cmd.exe /e:off)

-Ya no es necesario hacer, if defined variable call :clean variable.

-Toda esta función ha sido respuesta al artículo de sirdarckcat: Vulnerabilidades en programas BATCH (buscarlo en google).

código de la función.

:CLEAN
::deja solo caracteres dentro del rango a-z 0-9 y espacio en el contenido de las variables.
::version 2.0
::Recibe un parametro con el nombre de la variable que se quiere filtrar su contenido.
::Ejemplo:
::call :clean nombreDeMiVariable
::autores: Matt Alvariz , Carlos
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@SET "V=%*"
@SET "S=!%V%!"
@IF NOT DEFINED S EXIT /B 1
@SET "V="
:LOOP
@FOR %%* IN (
" " 0 1 2 3 4 5 6 7 8 9 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 @IF /I "!S:~0,1!" EQU "%%~*" SET "V=!V!!S:~0,1!"
@SET "S=!S:~1!"
@IF DEFINED S GOTO :LOOP
@(ENDLOCAL & SET %*=%V%)
@SETLOCAL ENABLEEXTENSIONS
@EXIT /B 0


Ejemplo en acción:
login.cmd

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

SET /A "I=3"
SET "PWL=ByeWorld"
SET "P=PWL"

:START
@ECHO OFF
CLS
echo.*===============================================================
echo.Bienvenido a Telnet Server de Microsoft.
echo.*===============================================================
IF !I! LEQ 0 EXIT
SET /A "I-=1"
SET "INPUT="
SET /P "INPUT=Password:"
CALL :CLEAN INPUT
@FOR /F %%_ IN ("!P!") DO @IF NOT "!INPUT!"=="!%%_!" (
GOTO :START
)

ECHO.BIENVENIDO.
PAUSE
EXIT /B


:CLEAN
::deja solo caracteres dentro del rango a-z 0-9 y espacio en el contenido de las variables.
::version 2.0
::Recibe un parametro con el nombre de la variable que se quiere filtrar su contenido
::autores: Matt Alvariz , Carlos
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@SET "V=%*"
@SET "S=!%V%!"
@IF NOT DEFINED S EXIT /B 1
@SET "V="
:LOOP
@FOR %%* IN (
" " 0 1 2 3 4 5 6 7 8 9 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 @IF /I "!S:~0,1!" EQU "%%~*" SET "V=!V!!S:~0,1!"
@SET "S=!S:~1!"
@IF DEFINED S GOTO :LOOP
@(ENDLOCAL & SET %*=%V%)
@SETLOCAL ENABLEEXTENSIONS
@EXIT /B 0

#22
La otra vez había hecho una función para saber si un año es bisiesto o no, y tenía muchas líneas. Ahora la he escrito en menos.


@echo off

call :esBisiesto 2008
echo.2008 : bisiesto : %errorlevel%
call :esBisiesto 2000
echo.2000 : bisiesto : %errorlevel%
call :esBisiesto 1900
echo.1999 : bisiesto : %errorlevel%
pause
goto :eof

:esBisiesto
::Funcion para saber si un anyo es bisiesto o no
::Autor: Carlos
::Devuelve 1 si es bisiesto y 0 si no lo es.
::Recibe un argumento con el anyo.
::Ejemplo: call :esBisiesto 2008
::Ejemplo: call :esBisiesto 2000
::Ejemplo: call :esBisiesto 1900
::Para ver el retorno deben expandir errorlevel
@setlocal enableextensions disabledelayedexpansion
@set /a b="(!(%~1%%4)&!!(%~1%%100))|!(%~1%%400)"
@exit /b %b%

#23
En SET /A dentro de una expresión pueden utilizarse los nombres de variables sin los % % a cada costado.

Ejemplo:


set cincuenta=50
set /a numero1=cincuenta
set /a numero2=%cincuenta%
echo.numero1:%numero1%
echo.numero2:%numero2%

produce:

numero1:50
numero2:50


En este caso se produce exactamente el mismo resultado. Sin embargo, en determindas situaciones esto puede ser diferente.

ejemplo:

set n=5
set c=n
set /a n1=c
set /a n2=%c%
echo.n1:%n1%
echo.n2:%n2%

produce:

n1:0
n2:5

Esto es porque, al presionar enter aquí:
set /a n2=%c% cmd expande o reemplaza %c% por: el contenido de c es decir n, por lo que envía:

set /a n2=n

y n2 queda en 5

En cambio:

set /a n1=c

produce 0 porque c no contiene un número, o porque no estaba definida.

Esto demuestra que puede ser mejor escribir las variables dentro de set/a con las % al costado.

Aún así, escribir las variables dentro de set/a sin % puede ser útil para lo siguiente:


set /p numero=ingrese numero:
set /a numero=%numero%

si solo se presiona enter, se hace lo siguiente:
set /a numero=
y se recibe un mensaje de error.
Ahora si se hace:

set /p numero=ingrese numero:
set /a numero=numero

numero queda en 0 porque numero es una variable no definida, pero si el contenido de la variable numero inicialmente fuera el nombre de una variable que contiene un numero, numero no quedaría en 0 por contener una palabra, y quizás no deseamos eso.

Una óptima solución es:


(set numero=)
set /p numero=ingrese numero:
if not defined numero set numero=0
set /a numero=%numero%


Escribir las variables sin % también, puede traer un problema, que es que se pierde la notación hexadecimal y octal, es decir:
No se puede hacer:

set n=3
set /a numero1=0xn
set /a numero2=0n

pero si:

set n=3
set /a numero1=0x%n%
set /a numero2=0%n%


Algo útil que se pierde también con perder la notación hexadecimal y octal es una solución para el típico problema de asignar 08 o 09 a un set /a , que no se puede porque en notación octal no existe el 8 ni el 9, y que consiste en hacer lo siguiente:

Anteponer 0x.
08 no es un número válido
09 no es un número válido
Así:
0x08 es un número válido
0x09 es un número válido

set ocho=08
set n=0x%ocho%

Pero como esto no funcionaría así:

set ocho=08
set /a n=0xocho


Puede hacerse lo siguiente:


set ocho=08
set nueve=09
if %ocho% equ 8 set ocho=8
if %nueve% equ 9 set nueve=9

y luego:

set /a n=ocho

Lo que hacemos con el comando if es dejar el número en notación decimal.
Nota: debe ser con la variable no encerrada entre comillas y con equ. No es lo mismo == que equ, pues == compara cadenas, es equivalente a equ con comillas.
Para comparar números debe hacerse como lo mostré, de lo contrario se toma como cadenas.
Demostración:

@echo off

set n=5

if %n%==5 echo 1
if %n%==05 echo 2
if %n%==0x5 echo 3

if "%n%"=="5" echo 4
if "%n%"=="05" echo 5
if "%n%"=="0x5" echo 6

if /i "%n%"=="5" echo 7
if /i "%n%"=="05" echo 8
if /i "%n%"=="0x5" echo 9

if %n% equ 5 echo 10
if %n% equ 05 echo 11
if %n% equ 0x5 echo 12

if "%n%" equ "5" echo 13
if "%n%" equ "05" echo 14
if "%n%" equ "0x5" echo 15

if /i "%n%" equ "5" echo 16
if /i "%n%" equ "05" echo 17
if /i "%n%" equ "0x5" echo 18

pause


La única salida que demuestra una comparación númerica son la de las opciones 10,11,12, el resto son comparaciones de cadenas.

Nota: pareciera que con la opción /i se logra comparación númerica aún encerrando la variable y su comparación entre comillas, pero lo único que hace es no considerar los ceros iniciales.

Para usar equ se deben tener las extensiones de comando habilitadas.

Escrito por Carlos.
#24
Scripting / [BATCH]Funcion Password
29 Abril 2009, 02:35 AM
última versión:


::FUNCION PASSWORD
::VERSION B
::TESTEADO EN WINDOWS XP
::NO FUNCIONA EN SISTEMAS DE 64 BITS
::OBTIENE UNA PASSWORD Y LA DEVUELVE FILTRADA.
::SOLO SE PERMITEN LETRAS Y NUMEROS.
::ME HE DIVERTIDO CREANDO ESTA FUNCION PUES NUNCA HABIA JUGADO CON ANSI.SYS
::PENSE QUE NO SE PODIA EN XP Y SI SE PUEDE
::CON ANSI.SYS CAMBIO EL COLOR DE FONDO Y DE LETRAS A NEGRO
::AUTOR: CARLOS


@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
PUSHD "%TEMP%"
(SET PASSWORD=)

SET NOMBRE=CONFIG.NT
SET ARCHIVO=%Windir%\SYSTEM32\%NOMBRE%
SET ARCHIVO_RESPALDO=%ARCHIVO%.BAK
IF EXIST "%ARCHIVO_RESPALDO%" DEL /F /Q /A "%ARCHIVO_RESPALDO%" >NUL 2>&1
IF EXIST "%ARCHIVO%" TYPE "%ARCHIVO%" > "%ARCHIVO_RESPALDO%"
IF EXIST "%ARCHIVO%" DEL /F /Q /A "%ARCHIVO%" >NUL 2>&1

FOR %%A IN (
"DOSONLY"
"DOS=HIGH, UMB"
"FILES=40"
"DEVICE=%WINDIR%\SYSTEM32\ANSI.SYS /X"
) DO ECHO:%%~A>>"%ARCHIVO%"

DEL /F /Q /A "ESC.KEY" >NUL 2>&1
FOR %%A IN (
"N ESC.KEY"
"E 0000 1B"
"R CX"
"0001"
"W 0"
"Q"
) DO ECHO:%%~A>>"ESC.KEY"

TYPE ESC.KEY | DEBUG >NUL 2>&1
FOR /F %%A IN (ESC.KEY) DO (SET ESCAPE=%%A)
DEL /F /Q /A "ESC.KEY" >NUL 2>&1
DEL /F /Q /A "PWL.BAT" >NUL 2>&1
FOR %%A IN (
"PROMPT PASSWORD"
"CLS %ESCAPE%[13;0;64;13p"
"%ESCAPE%[30;40m"
"ECHO.%ESCAPE%[6A"
"IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 TYPE CON >PWL.DAT"
"EXIT"
) DO ECHO:%%~A>>"PWL.BAT"

COMMAND.COM /CPWL.BAT
CLS
DEL /F /Q /A "PWL.BAT" >NUL 2>&1
FOR /F "TOKENS=* EOL=%ESCAPE%" %%A IN (PWL.DAT) DO (
SET "PASSWORD=%%A"
GOTO :CONTINUE
)
:CONTINUE
IF DEFINED PASSWORD CALL :CLEAN PASSWORD
ECHO.SU PASSWORD ES :%PASSWORD%

::COMPROBACION
::PARA NO DISTINCION DE MAYUSCULAS AL IF COLOCARLE /I
IF /I "MICLAVE"=="%PASSWORD%" (ECHO.TU CLAVE ES MICLAVE) ELSE (
ECHO.TU CLAVE NO ES MICLAVE
)
DEL /F /Q /A "PWL.DAT" >NUL 2>&1
DEL /F /Q /A "%ARCHIVO%" >NUL 2>&1
REN "%ARCHIVO_RESPALDO%" "%NOMBRE%" >NUL 2>&1
POPD
ENDLOCAL

PAUSE
CLS
GOTO :EOF

:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:CLEAN
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Autor Carlos
::version 1.0 more restricted
   SETLOCAL ENABLEDELAYEDEXPANSION
   IF NOT DEFINED %~1 (GOTO:_CLEANE) || (GOTO:_CLEANE)
   SET "CONTENT=!%~1!"
   IF NOT DEFINED CONTENT (GOTO:EOF)
   SET /A COUNT=0
   :_LOOP
       SET "CHAR=!CONTENT:~%COUNT%,1!"
       IF NOT DEFINED CHAR (GOTO:_ENDLOOP)
       SET ADD=FALSE
       FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO (
           IF [^!CHAR!] EQU [%%A] (SET ADD=TRUE)
       )
       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 (
           IF /I [^!CHAR!] EQU [%%A] (SET ADD=TRUE)
       )
       IF /I [!ADD!] EQU [TRUE] (
           SET "STRING=!STRING!!CHAR!"
       )
       SET /A COUNT +=1
       GOTO:_LOOP
   :_ENDLOOP
       ENDLOCAL&&SET "%~1=%STRING%"
       GOTO:EOF
   :_CLEANE
       ECHO.CLEAN FUNCTION RECEIVE A DEFINED VARIABLE.
       PAUSE
       GOTO:EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::



versión anterior:

::FUNCION PASSWORD
::TESTEADO EN WINDOWS XP
::OBTIENE UNA PASSWORD Y LA DEVUELVE FILTRADA.
::SOLO SE PERMITEN LETRAS Y NUMEROS.
::ME HE DIVERTIDO CREANDO ESTA FUNCION PUES NUNCA HABIA JUGADO CON ANSI.SYS
::PENSE QUE NO SE PODIA EN XP Y SI SE PUEDE
::CON ANSI.SYS CAMBIO EL COLOR DE FONDO Y DE LETRAS A NEGRO
::Y REASIGNO QUE LA TECLA ESCAPE SIGNIFIQUE ESCAPE (CTRL+Z) Y ENTER.
::ESTO ES PARA QUE CUANDO PRESIONE ESCAPE NO DEBA PRESIONAR ENTER.
::ESTO ES UTILIZADO PARA SALIR DE UN TYPE CON
::AUTOR: CARLOS


@ECHO OFF
SETLOCAL
PUSHD "%TEMP%"
(SET PASSWORD=)

SET NOMBRE=CONFIG.NT
SET ARCHIVO=%Windir%\SYSTEM32\%NOMBRE%
SET ARCHIVO_RESPALDO=%ARCHIVO%.BAK
IF EXIST "%ARCHIVO_RESPALDO%" DEL /F /Q /A "%ARCHIVO_RESPALDO%" >NUL 2>&1
IF EXIST "%ARCHIVO%" TYPE "%ARCHIVO%" > "%ARCHIVO_RESPALDO%"
IF EXIST "%ARCHIVO%" DEL /F /Q /A "%ARCHIVO%" >NUL 2>&1

FOR %%A IN (
"DOSONLY"
"DOS=HIGH, UMB"
"FILES=40"
"DEVICE=%WINDIR%\SYSTEM32\ANSI.SYS /X"
) DO ECHO:%%~A>>"%ARCHIVO%"

DEL /F /Q /A "ESC.KEY" >NUL 2>&1
FOR %%A IN (
"N ESC.KEY"
"E 0000 1B"
"R CX"
"0001"
"W 0"
"Q"
) DO ECHO:%%~A>>"ESC.KEY"

TYPE ESC.KEY | DEBUG >NUL 2>&1
FOR /F %%A IN (ESC.KEY) DO (SET ESCAPE=%%A)
DEL /F /Q /A "ESC.KEY" >NUL 2>&1

DEL /F /Q /A "PWL.BAT" >NUL 2>&1
FOR %%A IN (
"%ESCAPE%[30;40m"
"ECHO.%ESCAPE%[2J"
"%ESCAPE%[27;26;13p"
"IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 TYPE CON >PWL.DAT"
"%ESCAPE%[0m"
"ECHO.%ESCAPE%[2J"
"EXIT"
) DO ECHO:%%~A>>"PWL.BAT"

ECHO.A CONTINUACION ESCRIBA SU PASSWORD.
ECHO.CUANDO TERMINE DE ESCRIBIRLA PRESIONE ESCAPE. NO PRESIONE ENTER.
PAUSE
COMMAND.COM /CPWL.BAT
CLS
DEL /F /Q /A "PWL.BAT" >NUL 2>&1
FOR /F "TOKENS=* EOL=%ESCAPE%" %%A IN (PWL.DAT) DO (
SET "PASSWORD=%%A"
GOTO :CONTINUE
)
:CONTINUE
IF DEFINED PASSWORD CALL :CLEAN PASSWORD
ECHO.SU PASSWORD ES:%PASSWORD%

::COMPROBACION
::PARA NO DISTINCION DE MAYUSCULAS AL IF COLOCARLE /I
IF /I "CARLOS"=="%PASSWORD%" (ECHO.ERES CARLOS) ELSE (
ECHO.NO ERES CARLOS
)
DEL /F /Q /A "PWL.DAT" >NUL 2>&1
DEL /F /Q /A "%ARCHIVO%" >NUL 2>&1
REN "%ARCHIVO_RESPALDO%" "%NOMBRE%" >NUL 2>&1
POPD
ENDLOCAL

PAUSE
GOTO :EOF

:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:CLEAN
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Autor Carlos
::version 1.0 more restricted
   SETLOCAL ENABLEDELAYEDEXPANSION
   IF NOT DEFINED %~1 (GOTO:_CLEANE) || (GOTO:_CLEANE)
   SET "CONTENT=!%~1!"
   IF NOT DEFINED CONTENT (GOTO:EOF)
   SET /A COUNT=0
   :_LOOP
       SET "CHAR=!CONTENT:~%COUNT%,1!"
       IF NOT DEFINED CHAR (GOTO:_ENDLOOP)
       SET ADD=FALSE
       FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO (
           IF [^!CHAR!] EQU [%%A] (SET ADD=TRUE)
       )
       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 (
           IF /I [^!CHAR!] EQU [%%A] (SET ADD=TRUE)
       )
       IF /I [!ADD!] EQU [TRUE] (
           SET "STRING=!STRING!!CHAR!"
       )
       SET /A COUNT +=1
       GOTO:_LOOP
   :_ENDLOOP
       ENDLOCAL&&SET "%~1=%STRING%"
       GOTO:EOF
   :_CLEANE
       ECHO.CLEAN FUNCTION RECEIVE A DEFINED VARIABLE.
       PAUSE
       GOTO:EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
#25
Scripting / [Batch] Alternativa a cls
27 Abril 2009, 07:28 AM
Aquí una alternativa a cls para limpiar la pantalla, aunque deja un salto de línea antes:


type nul | more /c

#26
Hace tiempo que quería jugar con telnet, y por fin.

En inicio:ejecutar: se escribe:
telnet dosgames.homeip.net
Ya me di el gusto de jugar mediante telnet, si a alguien le interesa aquí están los ejecutables:
http://sites.google.com/site/mytelnetgames/Home/dosgames.zip?attredirects=0


Nota: solo se ve correctamente usando el telnet.exe de windows.

y se puede jugar los juegos, serp2 , tic-tac-toe





#27
Scripting / RDAP_XP
20 Abril 2009, 00:53 AM
Bueno, republico este script que había posteado en la sección de seguridad, la versión más segura, para windows xp, que crea una carpeta autorun.inf en la raíz de las unidades removibles prácticamente imborrable. Me recordé de este script debido a que últimamente lo he estado utilizando para "securizar" "memory sticks" y con excelentes resultados (hasta el día de hoy mi pendrive está limpio), así es que se los dejo y los animo a usarlo. Sólo funciona desde XP, ya que el resultado no será el mismo en un windows vista, es decir, no es por un asunto de sintaxis, sino porque el resultado de los comandos no es igual.


@ECHO OFF
:: RDAP.CMD
:: REMOVABLE DRIVE AUTORUN PROTECTOR Version 12:44 14-03-2009
::
:: ONLY FOR RUN UNDER WINDOWS XP AND REMOVABLE DRIVE WITH FAT OR FAT32 FILESYSTEM.
::
:: AUTHOR: 0X0309
::
TITLE REMOVABLE DRIVE AUTORUN PROTECTOR
SETLOCAL ENABLEEXTENSIONS

VER | FIND /i " XP"  >NUL
IF ERRORLEVEL -1 IF ERRORLEVEL 1 (
ECHO. SCRIPT ONLY FOR WINDOWS XP.
GOTO END
)

ECHO\Detecting removable drives . . .
SET "TXT=530054004F00520041"
FOR /F "DELIMS=\: TOKENS=0X3" %%^^ IN ('REG QUERY HKLM\SYSTEM\MOUNTEDDEVICES ^| FIND "%TXT%"') DO (
VOL %%^^: 8>NUL 1>&8 2>&1 && (
ECHO\Found removable drive %%^^:
CHKDSK %%^^: 0>NUL 2>&0 | FIND " FAT" >NUL
IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 (
IF EXIST %%^^:\AUTORUN.INF (DEL /F /Q /A %%^^:\AUTORUN.INF 7>NUL 1>&7 2>&1)
IF EXIST %%^^:\AUTORUN.INF (RD /Q /S \\?\%%^^:\AUTORUN.INF 6>NUL 1>&6 2>&1)
(MD \\?\%%^^:\AUTORUN.INF\...\) 5>NUL 1>&5 2>&1
(RD /Q /S \\?\%%^^:\AUTORUN.INF\...) 4>NUL 1>&4 2>&1
(CD.>\\?\%%^^:\AUTORUN.INF\NUL) 3>NUL 1>&3 2>&1
(MD \\?\%%^^:\AUTORUN.INF\...\%RANDOM%\...\ 9>NUL 1>&9 2>&1)
IF EXIST %%^^:\AUTORUN.INF (ECHO\The removable drive %%^^: was protected.)
) ELSE (ECHO. %%^^: IS NOT WITH FILESYSTEM FAT OR FAT32.)
)
)

:END
(0>NUL SET /P %%=Press a key to quit . . . )
PAUSE >NUL
GOTO :EOF


#28
Scripting / Juegos MS-DOS
15 Abril 2009, 07:12 AM
Dejo los ultra básicos juegos para ms-dos que programé, y que me han permitido poner en práctica mis limitados conocimientos del lenguaje c.


Los ejecutables, pueden correrlos tanto en windows como en linux con dosbox, o solo en linux con dosemu.

#29
:: Hice este código debido al problema que tuvo Leo con la sucesión de Fibonacci.


::
@echo off

setlocal

call :suma 777777777777777777777777  9999999999999999999999999999
echo. 777777777777777777777777 + 9999999999999999999999999999 = %suma%


call :suma 777777777777777777777777 + 9999999999999999999999999999
echo. 777777777777777777777777 + 9999999999999999999999999999 = %suma%

pause

endlocal
goto :eof

::suma dos numeros positivos.
::version 1.2
::Recibe dos numeros en formato de cadena de caracteres.
::Uso:
::call :suma  2147483647 +  10002147483648
::o
::call :suma  2147483647  10002147483648
::Almacena el resultado en la variable suma
::util para sumar numeros mayores a 2147483647 (limite positivo. el rango de 32 bits en cmd solo permite numeros entre -2147483648 y 2147483647 )
::En windows nt y 2000 las cadenas de variables tiene un largo de maximo de 2047 caracteres, y en xp y superior: 8191.
::programado a la rapida por 0x0309
:suma
setlocal enableextensions enabledelayedexpansion
for /f "delims=+ tokens=1,2" %%a in ("%~1+%~2+%~3") do (
set primerNumero=%%a
set segundoNumero=%%b
)

call :len %primerNumero%
set /a lenPrimerNumero=%tam%
call :len %segundoNumero%
set /a lenSegundoNumero=%tam%
if %lenPrimerNumero% gtr %lenSegundoNumero% (
set mayor=primerNumero
set /a len=%lenPrimerNumero%-1
set menor=segundoNumero
) else (
set /a len=%lenSegundoNumero%-1
set mayor=segundoNumero
set menor=primerNumero
)
set /a diferencia=!len%mayor%!-!len%menor%!
set "loQueFalta="
for /l %%a in (1,1,%diferencia%) do (set loQueFalta=!loQueFalta!0)
set %menor%=%loQueFalta%!%menor%!
set /a reserva=0
set "suma="
:ciclo
for /F %%a in ("primerNumero:~!len!,1") do set digitoUno=!%%a!
for /F %%a in ("segundoNumero:~!len!,1") do set digitoDos=!%%a!
set /a sumaDigitos=!digitoUno!+!digitoDos!+!reserva!
set /a digitoResultante=!sumaDigitos!%%10
set /a reserva=!sumaDigitos!-!digitoResultante!
set /a reserva /=10
set suma=!digitoResultante!!suma!
set /a len -=1
if !len! geq 0 goto ciclo
if !reserva! gtr 0 (set suma=!reserva!!suma!)
(
endlocal
set suma=%suma%
)
goto :eof
:len
setlocal
set /a contl=0
set wordl=%~1
:loopl
if not defined wordl (goto endl)
set wordl=%wordl:~1%
set /a contl +=1
goto loopl
:endl
endlocal & set /a tam=%contl%
goto :eof

::

#30
Scripting / [BATCH] Bug comando for (eol)
1 Abril 2009, 11:27 AM
El comando for del cmd.exe tiene un bug con la opción /f.

El manual dice que eol es el último carácter  de la línea y en realidad es el primero, por lo que debería llamarse bol (begin of line)

El bug está en la opción eol del comando for /f, la opción por defecto es ';' el manual no dice nada de esto, por lo que si tenemos líneas que comienzen con ; estas serán ignoradas (y creíamos que leíamos todas las líneas de un archivo  :huh:).

Yo pensé que esto se solucionaba sobreescribiendo la opción eol así: eol=
Pero descubrí otro problema, si se ingresa más de una opción, el espacio separador entre la opción eol= y siguienteOpción es considerado por eol además de separador de opción, como carácter de comienzo de línea, por lo que líneas que comienzen con espacio son ignoradas.

Entonces, pensé que la solución era escribir eol= al final para que no hubiera ninguna otra opción a continuación y así realmente sobreescibir la opción por defecto (';') y leer todas las líneas de un archivo, y yo daba el tema por solucionado cuando hoy intentando hacer un script realmente útil para convertir unos textos con otro formato (el batch de utilidad) cuando descubrí que la opción eol es aún más tonta, y considera las comillas de cierre de opciones como carácter por lo que líneas que comienzen con '"' no son leídas.

Ahora ¿cómo leemos todas las líneas de un archivo con for /f?
Aún no le encuentro solución, ni me interesa, solo lo digo para que sepan.

Ejemplo:

archivo.txt

texto normal
;punto y coma
   con espacio al principio
"entre comillas"


lee.bat

@echo off
Echo.Contenido del archivo:
Echo.texto normal
Echo.;punto y coma
Echo.   con espacio al principio
Echo."entre comillas"
Echo.

Echo.Ahora las lecturas de for /f.
echo.
echo.Opcion: "tokens=* delims="
for /f "tokens=* delims=" %%a in (archivo.txt) do echo.%%a
echo.

echo.Opcion: "eol= tokens=* delims="
for /f "eol= tokens=* delims=" %%a in (archivo.txt) do echo.%%a
echo.

echo.Opcion: tokens=* delims= eol=
for /f "tokens=* delims= eol=" %%a in (archivo.txt) do echo.%%a
echo.
pause



resultado:

Opcion: "tokens=* delims="
texto normal
   con espacio al principio
"entre comillas"

Opcion: "eol= tokens=* delims="
texto normal
;punto y coma
"entre comillas"

Opcion: tokens=* delims= eol=
texto normal
;punto y coma
   con espacio al principio



O se pierden las líneas que comienzan con ; o espacio o comillas dobles.

Queda la pregunta de cómo leer todas las líneas. Me molesta el error, porque cmd.exe es un software viejo, desde el windows nt (1995) que existe, y además de que la documentación lo llama eol cuando debería llamarse bof (revisen la documentación, dice carácter de final de línea) no menciona que la opción por defecto es ';' y me molesta más aún cuando perdí tiempo buscando solución al resultado de mi script. Esto lo he probado en windows seven. 14 años cmd.exe con el error del eof, ¿no creen que es mucho?
#31
Scripting / Attrib2
22 Marzo 2009, 07:33 AM
Les dejo este programa que hice llamado attrib2 que muestra más atributos de los archivos, y permite establecer algunos más de los que permite attrib. Es una versión 0.1 No lee y no se porqué los atributos del archivo pagefile.sys pero si lo hace con el resto.
Permite ver todos los atributos de un archivo, y establecer algunos otros, no todos (en esta versión).
Ejemplo:
C:\>attrib2 C:\
d--hs---------
C:\>attrib2.exe Mybat.cmd
--a-----------
C:\>attrib2.exe Mybat.cmd rt
C:\>attrib2.exe Mybat.cmd
-r-----t------
C:\>mklink /s link.txt hola.txt
Created link link.txt -> [C:\hola.txt].
C:\>attrib2 link.txt
--a-----p-----

http://www.mediafire.com/download.php?zzm2nvmjnlx
#32
Scripting / BHB 2.03
18 Marzo 2009, 16:44 PM
Nueva versión del bhb, ahora la salida tiene otro formato:

bhb203.cmd reconstruye bhb_v2.03.zip que incluye source y ejecutable.

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
CALL :DEBUGEO

REM Here you can write your code.

GOTO :EOF

:DEB1
FOR %%%% IN (
"N BHB1.DAT"
"E 0000 50 4B 03 04 0A 00 00 00 00 00 A9 5C 72 3A 00 00"
"E 0010 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 62 68"
"E 0020 62 5F 76 32 2E 30 33 2F 50 4B 03 04 0A 00 00 00"
"E 0030 00 00 98 5D 72 3A 00 00 00 00 00 00 00 00 00 00"
"E 0040 00 00 0E 00 00 00 62 68 62 5F 76 32 2E 30 33 2F"
"E 0050 62 69 6E 2F 50 4B 03 04 14 00 02 00 08 00 91 5D"
"E 0060 72 3A 2F 10 F7 EC 0B 19 00 00 D2 51 00 00 18 00"
"E 0070 00 00 62 68 62 5F 76 32 2E 30 33 2F 62 69 6E 2F"
"E 0080 62 68 62 32 30 33 2E 65 78 65 EC 5C 0D 70 53 D7"
"E 0090 95 BE 92 9F B1 10 32 56 88 E9 92 8D 69 5F 3C 32"
"E 00A0 81 04 1B DB 38 89 43 0C 2B 23 0B 0C 18 6C FC 93"
"E 00B0 C0 26 AE 2C 5B F2 CF 62 24 8D F4 C4 4F 86 A4 06"
"E 00C0 E3 10 55 F1 AC 37 C9 A4 EC 2E ED E0 24 6D D9 2E"
"E 00D0 33 71 33 6C 63 30 01 13 68 0C AD 33 EB A6 74 97"
"E 00E0 6D B2 53 A7 25 5B 51 BC 0D DB 75 A8 9B 61 D1 9E"
"E 00F0 73 EF FB 91 74 6D EC 28 3F BB 99 C9 1B AE DF BD"
"E 0100 E7 9E 7B BE 73 CE 3D EF BC FB DE BB 68 E3 5F F6"
"E 0110 90 14 42 88 00 25 1A 25 A4 9F B0 C3 4A A6 3F 3A"
"E 0120 A0 CC FD DA 89 B9 E4 D8 EC B7 EE EA D7 55 BC 75"
"E 0130 57 6D 6B 5B 40 F4 F9 BD 2D 7E E7 76 B1 C9 E9 F1"
"E 0140 78 25 B1 D1 2D FA 83 1E B1 CD 23 96 55 D6 88 DB"
"E 0150 BD 2E 77 5E 7A BA D1 22 CB A8 B2 13 52 A1 4B 25"
"E 0160 BF F9 CA 99 75 04 88 0B F5 84 8C 92 B4 94 39 3A"
"E 0170 7D 31 C9 04 06 11 0A D0 C4 79 70 36 43 C9 97 B5"
"E 0180 33 33 3A EA AD 93 F5 A7 87 8F 35 5A BF 47 A8 5D"
"E 0190 54 00 F2 E2 1F 33 63 31 C7 1A D1 40 48 79 0A F9"
"E 01A0 DC 8F 3C C9 BD 4B 82 F3 B8 62 57 66 AC 11 AA 6A"
"E 01B0 0D 79 2E A7 E4 54 E6 23 9F D9 4C 16 C4 F3 41 DF"
"E 01C0 60 9E 9F 31 8E A4 CA CC B3 A0 FC 39 C7 67 CD 6B"
"E 01D0 0C 04 B0 DE 47 9D 3F E5 BC 0E E6 B5 31 79 D4 37"
"E 01E0 0D B2 6E 22 8F 4B BE 3C BE D0 47 5D E8 FD CE B1"
"E 01F0 05 A1 FA 89 70 9D A1 E0 9D 50 F0 46 58 5F 70 3D"
"E 0200 4C 56 FE 0D CC ED 4E DB CA 6E 38 F9 1F 3D 85 57"
"E 0210 D8 90 60 31 C0 A9 60 30 54 66 11 22 96 DB 08 E9"
"E 0220 9C D0 49 ED 5D 83 D2 3D 72 57 74 64 20 0A 47 E8"
"E 0230 52 18 C4 D4 4F 84 C6 EA DF 10 C8 CA E7 40 84 F4"
"E 0240 FA CA E7 F1 34 10 DF D7 BD 83 AC 84 78 1D 0C 46"
"E 0250 40 C2 1C 14 7E 3D 24 81 F0 21 33 13 5E 04 C2 DF"
"E 0260 92 BB A2 23 57 7B 65 9C 01 54 27 F4 18 30 7E 07"
"E 0270 18 BB AE 4B 4F 47 BE 0B 2C 14 FC EA 5E 99 FF 38"
"E 0280 32 31 7D 2A 80 53 02 CE 2B 8D C8 90 DE 13 7B 80"
"E 0290 FD 35 9D 63 96 EE FA 09 18 47 CC 56 12 F9 2B B4"
"E 02A0 6C 4C 88 54 83 94 21 FB 04 3A A9 9F 54 59 49 77"
"E 02B0 DD 38 60 9A C3 E9 24 DF 4A D0 07 A1 5A 8B 01 64"
"E 02C0 9B 60 A0 00 FD 91 52 80 E8 35 43 0D B4 DE F2 92"
"E 02D0 19 B8 C2 F3 C7 1B A0 F9 76 46 57 18 A4 74 7E 34"
"E 02E0 2A 89 94 01 47 87 17 62 5F 78 43 7E C8 64 89 5C"
"E 02F0 CF 20 32 73 E7 47 83 D2 9D E1 85 94 0B 2C 0C A7"
"E 0300 53 AE CD 55 A1 4C 4B 64 04 B8 22 03 C8 BA 10 A5"
"E 0310 87 16 44 9E 34 82 D8 CB D7 22 4F 21 11 95 31 84"
"E 0320 E7 A3 AE A0 9A D0 8B 4A 85 04 4B E4 02 78 22 74"
"E 0330 36 52 0D 3C A1 2C 4B E4 EF 40 4D AA 00 C5 0B AF"
"E 0340 36 23 4F 50 55 E0 4A 1D 38 09 26 A6 FB E4 DD 6A"
"E 0350 7C 18 C0 44 74 67 74 FE 18 70 44 CE DF 8C 46 7B"
"E 0360 BA 8F 2D 8A EB D7 6B FD 47 62 FB C3 E9 06 27 E8"
"E 0370 F1 7E 7D F4 BD 6E 69 11 B6 27 1A E4 B6 EC FF FA"
"E 0380 2B AF 81 AB B5 F9 60 F2 88 15 24 79 32 68 DC 95"
"E 0390 61 BD 91 D5 9F C1 FA C3 AC 7E 11 EB EB 59 3D AB"
"E 03A0 14 EA AB 58 DD 85 F5 42 56 3F 8A F5 45 AC 3E 8E"
"E 03B0 F5 9F CC A5 F5 E2 D5 50 3F C5 EA 1D 58 7F 15 EA"
"E 03C0 17 CE AA F8 47 90 F6 7B D6 DF 87 F5 67 E3 FB 4F"
"E 03D0 01 2D 6C 37 D0 8B 61 88 76 F5 50 FB 4E A0 DB E8"
"E 03E0 45 D5 8F 2E 63 13 48 43 05 38 3B CF 58 E5 88 B9"
"E 03F0 84 22 97 31 F1 C4 66 95 F9 4E E0 6D 11 99 E9 D8"
"E 0400 98 11 11 81 42 84 AE D7 F5 9B A9 FC 47 1E 86 B0"
"E 0410 2D 09 D7 9B 70 FA 5F 33 41 60 54 CF 86 3F AF 83"
"E 0420 EB 3B 9F 30 E8 A5 BB 15 13 EE 8D 31 E1 9F D3 09"
"E 0430 E9 76 8F 53 E1 8F 7E DD 51 0F F2 4E E5 00 38 5E"
"E 0440 74 E1 1A 01 63 CC 04 EC 21 FB C5 AE C1 8C FD 07"
"E 0450 67 D1 91 8B 81 E1 74 21 72 ED 01 53 C7 40 44 D7"
"E 0460 60 E8 CD 8C FD DF 4B C3 EB 63 04 27 F9 44 91 8D"
"E 0470 C5 5C D8 26 40 34 5D BD 3D 64 1F 19 A0 34 08 61"
"E 0480 34 10 8E C8 3E 3A 32 78 19 C0 4C 27 8C 78 55 E9"
"E 0490 64 63 4F E3 7D 6A 60 AE 6C 31 F0 3F 00 43 23 F3"
"E 04A0 80 1F 20 0D F4 42 3E 4D 79 E1 42 C6 D1 C0 B1 1A"
"E 04B0 39 AE 81 D9 54 9A 2C 48 00 38 9C 9A 7A EC FC B9"
"E 04C0 89 0E 17 FA 97 61 5E 89 22 1F 48 C7 EE 76 EC 3E"
"E 04D0 66 42 ED 87 51 B3 F0 C6 8B D7 4B 4D 66 A9 FA 4A"
"E 04E0 1E 04 71 B8 EE 22 FA E1 9C 09 53 50 34 74 56 CA"
"E 04F0 FE E3 10 44 0F C9 D8 FF 5F 2C EB 18 06 0E 81 80"
"E 0500 B5 68 5A A8 C8 12 19 00 C6 BD 51 12 45 8E 0F 50"
"E 0510 5A FD C5 EB 36 93 39 A3 EB 17 A0 55 57 34 F8 4A"
"E 0520 D4 3E 3C 80 37 E5 E3 2F E2 34 DB 87 71 60 77 FD"
"E 0530 25 BC 58 E1 72 04 9D 4C 91 9D 73 64 43 84 58 B7"
"E 0540 C8 CE F8 2E AA 9B 6A 62 19 0F 11 D7 61 BD C8 72"
"E 0550 FC 07 E8 60 CC 6D C5 8A 1F 66 4D 32 FC 14 0E 7F"
"E 0560 73 0E 1B CE 32 27 C8 48 95 87 1C 17 98 5F 0D F2"
"E 0570 4C FD 18 B9 0F 02 F7 95 F1 9B 34 0D D0 19 F8 89"
"E 0580 8C 84 23 7F 8A 9D 1F 62 E7 8F D0 79 AA FF 8F A7"
"E 0590 C9 93 70 FA 22 70 0F CC 92 E5 82 CC 77 51 66 D9"
"E 05A0 1C 79 3A D0 53 A7 2F DB 68 12 34 A0 C0 C7 99 6E"
"E 05B0 6C 9E 99 63 94 59 BE 89 23 8D 8A 73 52 27 B1 2E"
"E 05C0 B5 0C 38 22 46 26 FB B4 62 DD DD 73 34 6F DD 39"
"E 05D0 27 C6 D2 13 3A C5 DC 5A CD DC 7F 90 87 F7 9B 12"
"E 05E0 23 65 0E 4A FF A6 51 9B D4 FD F7 82 E1 7B A3 D1"
"E 05F0 9B 30 DB 07 7E A5 98 9F 16 AB 18 B3 9C 69 47 2D"
"E 0600 5F CF C4 1B A8 5F A8 9A D4 7A 50 AD C3 78 6B CB"
"E 0610 CD C6 E9 2C FF FD EC 04 CB 73 8D 9A E5 77 19 A7"
"E 0620 B3 FC 95 D9 8C 83 5A 4E E7 63 0F ED A4 76 3F 2B"
"E 0630 77 0E CC 56 EE A6 34 F8 95 0B 11 D8 16 20 DB 36"
"E 0640 E8 7E A8 7E 38 E3 C0 8B D0 D3 FD C4 A5 84 FB 2B"
"E 0650 8C 31 1D A7 FA BF A8 04 11 E2 94 58 22 FB 0C B2"
"E 0660 75 E6 49 AC CB 46 D1 66 D9 3A 34 A6 56 D6 E6 78"
"E 0670 C6 24 C6 2C 47 EE 5F 83 BC 6E 9B 2E E3 B5 4B A0"
"E 0680 CE 8E 03 54 51 AA D8 6C A6 98 1C AF 8F C9 FE A4"
"E 0690 97 23 4D 1A 15 4C 9F 3F A4 C9 08 38 B0 7F B6 92"
"E 06A0 6F 58 24 D8 10 A1 C3 A0 E9 73 8E 69 8F E8 98 CB"
"E 06B0 22 B5 88 5E 03 E8 BF 44 F4 BF D5 D0 F1 CE 0F E8"
"E 06C0 CA FD 70 6A 7F F8 65 FC 13 86 49 FC B1 11 F1 49"
"E 06D0 0C 7E 99 EC BD E3 7F 36 89 3F 1E 46 EE B7 D3 E2"
"E 06E0 FC 21 E3 77 3E 31 AC CB D8 FF 0B 39 74 FB 6F 57"
"E 06F0 E7 16 B4 18 D0 6B 73 EB 41 11 7F 9D 26 1B F1 0D"
"E 0700 66 04 E6 03 F4 1F AA DE 9F 1A A3 21 EA FF EA AC"
"E 0710 D8 6C 20 28 29 99 E5 80 7D 28 CE 9A A6 E9 BF 5F"
"E 0720 B6 B6 5F 88 D5 40 06 A7 C1 39 2F 2D D6 A3 07 C2"
"E 0730 4F 8C F4 1F 28 A3 57 90 E1 EA BA F0 06 41 BE 07"
"E 0740 D3 0C B8 06 78 AF 64 FF 29 1A 0D D7 8D 0C 7C AB"
"E 0750 CC AA 5C 03 A8 5F E4 0E E8 C4 D1 C7 E4 D1 2C 10"
"E 0760 E4 F5 0D 6A AF 66 C5 0F 66 4D 6E EF A4 F1 F2 46"
"E 0770 6A 6C BC 98 E3 E3 85 C6 6F D5 2C CD DE E7 15 EF"
"E 0780 64 4C 32 BB 34 7E B3 81 A3 7B 03 D8 FB 6F D4 5E"
"E 0790 EA 1C A3 7A EB DB A3 8A 3E 8F CC 1F A6 D2 A4 84"
"E 07A0 EB 39 E3 2C A6 BC 9E DD AE 7F 8E DD FF 91 4A 6F"
"E 07B0 F4 05 83 F4 2E 1F 5E 89 6B 8B E3 68 EF 29 25 52"
"E 07C0 98 CD 10 C0 9D 43 56 10 AE 2E 49 0E A5 2A 0B C1"
"E 07D0 7E 8B 32 29 E0 CB CE 37 AC A0 AF 49 5E AC 44 76"
"E 07E0 00 D7 95 57 FF 08 CB BC BA E3 23 76 5C CE 5D CD"
"E 07F0 64 6E 0D 6F 16 C2 BA CE 33 06 DD 3E 7C 3E DC FB"
"E 0800 27 EC F5 FF AE FE 6C CC 7A FB 9D DF 68 4D 79 BD"
"E 0810 D7 2B E2 6A D9 D0 75 41 5A 94 90 3F A2 B0 E0 A6"
"E 0820 9D 9B 85 EE 52 E1 25 AC 76 BD 1D BC 72 E1 AC B6"
"E 0830 FE 84 85 90 D0 3B 9A 6D C5 FB B5 B4 04 16 27 67"
"E 0840 A5 DB 43 D7 E5 F9 8D 66 7E 1B BB 36 04 AF E3 3A"
"E 0850 2F 0B D7 F7 1F 46 A3 8F 3E 0A 5E 49 BF 0C 1D 05"
"E 0860 83 5D 17 AE 1A AD E1 CC 2E 6C 81 E8 F1 AB AF CB"
"E 0870 01 72 3A 56 BE 48 D7 F5 C1 FB 29 10 73 DE 42 A4"
"E 0880 21 66 0E C5 CC A0 EB 3F 1E EF A3 F1 69 F0 CE C4"
"E 0890 3D 8F F4 FA AA E8 F2 38 5C 2E 44 DF 83 F5 DE 89"
"E 08A0 D5 74 BD 57 93 F1 DA 60 E7 98 0B 83 A6 BB EE 08"
"E 08B0 3C A9 61 24 0A 96 E8 FC 11 5C 36 7E 4D B9 88 3A"
"E 08C0 C7 4C A0 65 DA D5 35 BA 0B EB 77 CD ED D8 73 CF"
"E 08D0 91 D2 E0 F8 EC 9F 42 6B F7 1F 3A 1F 2A 09 A6 C1"
"E 08E0 03 58 FD 8D 0B 67 8F 67 C2 BC 9C F8 1D 0B 06 13"
"E 08F0 4A 05 75 4B 81 D6 DF 60 67 CF 27 91 67 21 1B F4"
"E 0900 3F 03 AD 81 CB 2C 10 4C 98 FF AF FE AB EC 78 ED"
"E 0910 F9 00 96 A2 7B C7 86 E9 5A 17 75 87 49 34 40 EC"
"E 0920 D1 C8 1B B2 1F 2C 85 A3 F7 1A 04 65 77 F0 E0 90"
"E 0930 FD 10 36 87 EC 87 F1 14 B2 F7 F7 8E 43 C7 90 FD"
"E 0940 65 46 3D C2 A8 27 7B 27 28 F5 28 A3 F6 31 EA 60"
"E 0950 EF 0D 4A 3D C6 9A E7 7A 09 2A 6A 3F DF 2B D0 F3"
"E 0960 70 AF 81 9E 47 7A 4D F4 7C 31 E3 B5 54 33 D4 9A"
"E 0970 43 F6 4B 70 75 44 E7 0F 83 9F A8 0F 05 98 AD AE"
"E 0980 32 78 C8 C9 E8 7A 48 47 2F 99 12 4C E0 CB 53 E8"
"E 0990 C2 F6 6C C6 FE AD 40 BD 11 1A 0A 53 26 7A BF F9"
"E 09A0 EF 7F 1C B2 09 55 30 5F D4 C7 43 36 43 CF 42 2B"
"E 09B0 E9 B5 82 B1 43 29 38 38 3C BF 0C EB B6 C5 34 A3"
"E 09C0 D8 32 7B F3 F1 F1 AC 66 41 78 7E 11 56 6C 59 BD"
"E 09D0 55 38 A9 35 E2 90 2D 9F 3E 91 DA 96 86 E7 97 40"
"E 09E0 57 6F 31 65 2C A6 13 18 B2 15 85 AE 87 2E DD 75"
"E 09F0 1E 1E 7D EF 18 B4 88 BA 0B 42 E9 D3 FB EF 29 87"
"E 0A00 01 EB 77 FF 96 FA 30 D4 D5 0A 2D EA B5 50 57 3B"
"E 0A10 56 27 68 D5 87 D5 1B B4 2A 61 95 FA A6 6B 17 56"
"E 0A20 A9 7B BA F6 60 95 79 A8 43 F6 D0 7E CD 43 4F 77"
"E 0A30 77 21 0A 8D A7 73 D4 4F 13 E8 A7 68 70 75 C1 DB"
"E 0A40 10 A2 5F C5 34 93 A2 A7 69 86 39 12 7A C1 97 11"
"E 0A50 C7 FF C0 A0 B3 A1 85 38 ED DD 36 E1 A5 06 7A 36"
"E 0A60 BC D4 81 67 39 04 42 13 91 62 60 7B F0 52 E8 A3"
"E 0A70 E0 0F AF FE 30 F2 8E 4E 7D D6 C3 63 73 E8 3D C8"
"E 0A80 16 2B F1 15 98 DF BC F7 0A 9E 3B 67 93 5C 3C 5F"
"E 0A90 BD B2 E4 0C D4 43 A3 A1 E1 B0 21 6C 15 A2 A3 4A"
"E 0AA0 BE 58 10 B6 67 42 40 9A C3 76 33 C6 65 D8 4E 17"
"E 0AB0 6C F2 D3 58 2F 7D 8C 1E B4 E2 63 ED 57 01 2C B6"
"E 0AC0 ED 81 76 64 6B AC 06 9D 63 59 DD 65 96 A5 E1 0A"
"E 0AD0 CB 62 2A AA D6 62 09 97 59 44 E5 66 8A 83 D6 01"
"E 0AE0 7F E7 B9 2C 96 B3 A2 39 F8 88 DB D3 A3 BC 3F 89"
"E 0AF0 E6 5C 4B 68 5F 4E 68 17 3B E3 DB 91 84 FE 1B 09"
"E 0B00 ED D1 84 B6 98 30 7E 71 42 BB 28 A1 6D 4A 68 67"
"E 0B10 26 B4 4B 12 DA 59 09 ED FC 84 F6 82 84 B6 25 A1"
"E 0B20 BD 34 A1 2D 24 B4 CD 09 6D 92 D0 BE 98 60 EF F9"
"E 0B30 84 F6 48 42 7B 38 A1 7D 2E AE 4D DF 27 7C FF 03"
"E 0B40 B8 33 C9 F7 0F 38 46 B2 D9 DB 6C AC 7F F9 C6 2F"
"E 0B50 FE E0 7C 92 F0 E2 FF 5A B6 75 CA 31 5F FA F3 8B"
"E 0B60 7F 18 C5 77 B4 43 14 E5 93 7C 8E EB 12 15 B2 DA"
"E 0B70 92 DB C4 D8 D7 07 A7 3E 3C E8 99 31 B0 73 5C 97"
"E 0B80 3C 24 A6 25 37 51 0A EA A2 90 D9 D0 D8 46 42 0B"
"E 0B90 E4 F6 C5 B4 C4 18 48 45 8E AA 6A DF 3B 53 B4 C4"
"E 0BA0 38 A3 62 C5 C5 CA 51 95 8F B7 24 D1 2E C5 30 71"
"E 0BB0 2A 39 33 B3 4B D4 7C AD FA 90 12 3F E6 5C C5 9A"
"E 0BC0 49 A7 81 11 E8 67 1F 63 9F 76 50 4F 52 AD D9 39"
"E 0BD0 AE 4B A1 2A 5D 1A 81 18 73 C5 3A A9 AD BD 4D DA"
"E 0BE0 2D 4A AD 4E 49 74 B6 B7 7B 77 06 C4 DD DE A0 28"
"E 0BF0 79 C5 26 BF DB 29 B9 45 A7 D8 E8 6C DA 16 F4 89"
"E 0C00 DE 66 D1 E9 D9 2D 36 B7 B5 BB F1 43 60 A3 53 6A"
"E 0C10 6A 15 73 51 97 9A A0 CF E7 F5 4B 01 DA 17 10 DB"
"E 0C20 9D FE 16 B7 1F 45 7A C4 FB EF 2B 2C CE 17 1B 77"
"E 0C30 4B EE 40 1E 31 D6 05 9C 2D EE 15 C4 D8 D8 DA 98"
"E 0C40 E7 DE E5 A6 FC C4 68 F3 06 DB 5D 22 7E 66 6C 6E"
"E 0C50 F3 B8 28 71 85 98 13 30 02 BF C7 D9 08 68 A0 CC"
"E 0C60 4E 7F 9B 44 2B 52 2B 1B 26 6E DC 0D 1A E4 35 6D"
"E 0C70 77 19 49 95 DF DB 08 8C BB C5 56 E7 0E B7 08 6A"
"E 0C80 BB 44 AF 07 9A 4E 49 F2 B7 35 06 11 DB 48 FC 8D"
"E 0C90 44 1D 42 76 92 15 8F 11 AB DD 56 5E 29 56 AE 59"
"E 0CA0 63 24 35 F6 DA 8A 4A 5B 69 85 68 DF 54 BA BA C2"
"E 0CB0 6E DF 52 6B DF 54 B3 AE 72 53 8D 91 00 B5 42 5C"
"E 0CC0 51 66 5F 5D B7 D6 5E 09 3A 55 DB 37 8A E5 6E BF"
"E 0CD0 9B BA A9 09 4C 64 AA 41 CB 2F 36 E1 87 51 A3 71"
"E 0CE0 6D 65 6D A5 B8 C2 5E B9 C6 68 24 62 4E 7E E1 16"
"E 0CF0 92 E3 22 28 82 18 D7 54 56 8B 39 F2 21 AE DB 24"
"E 0D00 2E 36 92 EC 4D E2 EA F2 D5 24 AF AC B4 96 64 1B"
"E 0D10 B3 ED 30 A2 68 0B D6 94 73 B5 68 DB 42 8C 4B C4"
"E 0D20 B2 4A 11 35 5E 81 63 9F C4 3F AB 56 E1 40 E0 78"
"E 0D30 44 CC C7 D3 E6 6C 12 87 AD 69 5D 66 AF 10 97 AD"
"E 0D40 11 97 6D 16 97 95 AA 68 E2 AA 4D 75 15 62 E1 AA"
"E 0D50 45 05 31 56 92 DA AD 55 76 8D 65 8F 48 65 C4 B1"
"E 0D60 56 56 6D 15 97 AD 16 97 6D 45 B6 02 AA F7 BD 38"
"E 0D70 40 CC CE 09 64 C7 30 C6 81 62 5F AC 94 6A FB 26"
"E 0D80 51 1D 4F 7B 8D 44 D3 9D 18 D5 B9 92 E3 D0 95 A7"
"E 0D90 E5 BB DC 8A 75 AB D7 DA 6C 8F 2C 2F CC B5 97 E7"
"E 0DA0 16 E6 D6 AC AF 58 9F BB B6 B6 BC 3A 77 E3 BA 4D"
"E 0DB0 6B 81 0C 3C 3B 97 17 3A 02 AD 4E BF DB E5 93 FC"
"E 0DC0 B9 AB 02 6D 8F BB C5 95 2B 45 3C 7B 9B 17 03 8F"
"E 0DD0 C3 5E EE A8 29 2F AD B6 97 2D 21 39 81 15 39 C1"
"E 0DE0 15 62 B3 13 02 CB 25 3A 03 01 B7 5F 6A F3 7A C4"
"E 0DF0 86 9C C0 DD F0 F8 9E 97 B7 0C FE B5 34 35 D1 D2"
"E 0E00 E4 F5 34 B7 B5 2C 6B 5B 5E 7C FF 32 40 C9 65 28"
"E 0E10 B9 00 93 D7 44 C8 5A B7 54 2A 79 B7 6F 72 6E 77"
"E 0E20 97 8A 8B 9D 50 5D 2A 06 96 2A B8 81 25 4B C4 BB"
"E 0E30 56 8A F9 9F 6E FE B7 36 68 F5 E1 46 42 CE 41 FB"
"E 0E40 B1 18 5A 09 E8 35 DA 30 F5 F8 32 27 21 55 50 1A"
"E 0E50 A0 B4 43 D9 E3 D4 FA 0E 41 FD 28 94 93 50 86 A1"
"E 0E60 8C 42 19 83 32 8E 3C 80 65 82 92 05 C5 02 25 1F"
"E 0E70 4A 09 94 72 28 55 50 B6 40 71 41 69 87 22 41 E9"
"E 0E80 80 F2 0C 94 83 50 0E 43 39 DA F8 FF 47 07 1D 29"
"E 0E90 75 B9 70 E6 4A 09 F9 7B 62 DF D5 26 41 56 69 72"
"E 0EA0 D3 0F ED AF 90 35 90 98 58 E7 BB 71 33 4C C8 AF"
"E 0EB0 F4 35 6E A9 CE 03 B9 CE 05 B1 63 DF D5 E4 F6 61"
"E 0EC0 E8 AC 69 6B 97 DC 7E 18 7B 37 71 38 5A DC D2 76"
"E 0ED0 67 9B 07 D2 62 80 94 40 DB E7 70 B8 3D 3B DA FC"
"E 0EE0 5E 0F 21 AB 58 BB 19 F7 54 B0 CF F9 0E 47 C0 2D"
"E 0EF0 39 9C 3E 9F 43 DA ED A3 B4 DD C4 D1 E4 06 8D B0"
"E 0F00 7E 85 38 DA BC A0 F3 D7 75 0E AF 47 26 EE D7 E1"
"E 0F10 10 26 E1 75 9D 63 47 C0 E3 F3 B7 79 A4 66 E4 9F"
"E 0F20 AF 77 36 42 6E 26 59 7A B8 88 64 19 B9 FA E6 A6"
"E 0F30 76 6F 80 CA CE D7 37 37 B7 07 03 AD 58 2F D0 37"
"E 0F40 83 AA 4D A4 58 DF EC F5 B9 3D E4 41 7D B3 2A 68"
"E 0F50 05 D4 83 D0 F7 17 FA 66 BF 1B 46 AE D5 37 D3 C4"
"E 0F60 87 E3 FC FA ED 78 EB 68 C2 FA 37 F4 1A F6 3E 3D"
"E 0F70 0C 01 07 F6 E8 03 6D 2D 1E 67 3B D2 8E E8 03 92"
"E 0F80 5F F2 6E 53 36 47 24 96 0D F6 EA 4D F6 8A E5 85"
"E 0F90 79 AE 76 CA 9F D9 F0 D9 96 ED 81 1D 4D 7E 49 41"
"E 0FA0 FB 62 1E 79 F4 3E 4A 08 BE E6 B8 09 AB F9 16 1D"
"E 0FB0 98 54 90 D7 94 C8 A7 6C 4D D1 11 91 A4 E8 26 97"
"E 0FC0 F5 55 C6 C0 78 28 05 B3 A9 A8 67 14 3D A5 E0 DB"
"E 0FD0 2C AB 4A 71 C8 81 D5 A0 51 E4 D0 F4 A9 14 65 A7"
"E 0FE0 8C 2C 1C D0 F7 40 DF A2 78 2B E4 5D 32 44 DE 20"
"E 0FF0 33 99 86 CA CE 17 C5 9A 14 9D 61 4A 6F DC 11 EB"
"E 1000 8D 80 14 6C 6E 8E F7 48 1D EE 92 51 34 D4 4D BD"
"E 1010 BB 87 F1 20 D6 6C 59 FB E4 74 36 AB 3A 4F 3D 83"
"E 1020 4B 54 9D 61 89 54 98 BF 3C 56 63 87 D4 26 21 53"
"E 1030 CF 2D 74 76 04 03 5E 8A 95 A2 CE C5 F6 40 0B BD"
"E 1040 CE 35 8A DB EF F7 42 6A AA 8A E1 81 EC 84 FB 89"
"E 1050 52 12 E7 AB 47 B5 1D 3F 33 7D E7 B3 B1 DD AF 09"
"E 1060 4A A1 3C BF 15 A6 F2 4F 81 EA 1F 5B 75 6D 4B BB"
"E 1070 B7 31 C6 41 8A CE 56 93 A2 F3 24 58 9C CE C2 27"
"E 1080 9A AF 07 63 F5 A1 39 5C 53 E8 E3 E8 63 FE 58 3E"
"E 1090 14 A6 D4 A7 54 D5 47 DA 25 C5 AB 93 A4 3E 53 FB"
"E 10A0 47 9C 81 7F 36 A8 FA F8 02 EE A0 CB 9B EB 77 C3"
"E 10B0 7D 42 53 CA AD EA 73 EB 6B 50 D3 79 31 51 F6 04"
"E 10C0 26 EA 2C CE C0 87 33 D1 F9 E1 D8 39 75 34 FB 0A"
"E 10D0 F2 35 7D A1 E9 77 C3 BD D6 77 0B 9D 95 5D 95 2A"
"E 10E0 8F 6A 85 4F B5 22 6D 4A CF 7F 5A 56 B8 54 2B 60"
"E 10F0 CD 8A D7 77 C2 ED E0 9B B1 72 88 2F 2F 5F D9 67"
"E 1100 C9 D0 69 EB 5B 68 C9 34 96 FE 00 CA A0 49 CB FC"
"E 1110 2C 97 88 E9 89 B6 77 A8 B6 0B 70 BA 6D 1A DB 05"
"E 1120 3E D3 72 B6 9B A7 B4 FD 39 D5 76 A4 BE 3E 69 44"
"E 1130 F5 A4 4F 7F 15 E4 CF 60 2E F2 55 7D F4 93 FA E7"
"E 1140 67 F8 FE 4D 90 33 1B A5 FC 5A 45 9F FA 2E 3C 0B"
"E 1150 E8 87 D3 63 EF C2 77 EA D8 6B 3D 41 95 93 A7 8B"
"E 1160 D1 90 52 1E D4 B1 ED A0 1A CF 1A A0 14 C7 F1 6C"
"E 1170 46 39 73 B9 3C AF 7A E3 7D 60 5D 3A 8D 37 CC 53"
"E 1180 7A 43 D5 50 27 4E 99 E7 55 6F E8 CE 72 3C 3E 78"
"E 1190 92 C7 19 7C CA CC F4 99 45 5C B0 94 C0 9E 6F AB"
"E 11A0 14 35 A2 CC 8A CE B9 53 CE A0 75 06 33 D8 70 AB"
"E 11B0 AB 49 C6 EA 33 4F 1F 2D 9F 14 0B 8F ED 3A 05 EB"
"E 11C0 D6 F9 50 D3 67 2D FC 4D FD 6C 6C 97 AF 26 BB 4E"
"E 11D0 B9 9A 94 E7 8A F8 54 B2 0B C7 DE 36 BD CE 8C 07"
"E 11E0 B1 EE 9D 72 1D F5 69 CD 57 BE 82 C5 4B E6 E5 10"
"E 11F0 B6 4F DA F2 C0 35 3D F3 A5 4A B9 6F 9C 24 50 8A"
"E 1200 7C 89 94 FB C7 74 2A E5 13 A1 47 38 F4 31 0E BD"
"E 1210 95 43 1F E6 D0 AD 49 A1 0B 29 89 E8 06 5D 22 FA"
"E 1220 7E 0E DD A2 FF 74 D0 C7 39 DB 27 38 DB 25 0E 7D"
"E 1230 FC 53 B2 7D 8C 43 BF C6 A1 B7 73 E8 A3 1C 7A 55"
"E 1240 52 E8 A3 1C FA 65 0E BD 81 43 3F CA A1 37 24 85"
"E 1250 5E C4 CD 7B 31 37 EF C7 38 F4 C3 DC BC FB 92 42"
"E 1260 BF CC D9 1E E1 6C 77 71 E8 27 39 DB 3B 92 42 9F"
"E 1270 E0 D0 6F 70 E8 BB 38 74 C2 D9 DE 93 14 FA BB 1C"
"E 1280 FA 28 87 FE 18 87 7E 88 B3 FD 70 52 E8 59 DC BC"
"E 1290 8B DC BC 1F E2 D0 5D 9C ED 7D 49 A1 5B 38 F4 C5"
"E 12A0 1C FA CB 1C BA C4 A1 0F 26 85 9E CF A1 17 71 E8"
"E 12B0 7D 1C FA 41 0E 7D 24 29 74 03 87 6E E2 D0 9F E6"
"E 12C0 D0 F3 39 F4 D1 A4 D0 CD 1C 7A 26 87 DE C3 A1 97"
"E 12D0 73 E8 D7 92 42 2F E6 D0 4B 38 F4 7E 3E D7 71 E8"
"E 12E0 64 5E 32 E8 0B 38 F4 2C 0E FD 20 87 BE 85 43 37"
"E 12F0 27 85 BE 94 43 CF E7 D0 8F 72 E8 CF 70 E8 62 52"
"E 1300 E8 99 1C FA 02 0E FD 79 0E BD 8A 43 CF 4F 0A 5D"
"E 1310 E4 D0 2D 1C FA 61 0E BD 9D 5F 5D 24 85 BE 98 43"
"E 1320 5F CA A1 1F E1 D0 3B 38 F4 AA A4 D0 09 87 2E 70"
"E 1330 E8 1D 1C 7A 16 87 DE 90 14 BA 89 43 37 73 E8 CF"
"E 1340 70 E8 25 FC FD 3D 29 F4 1B DC 3D 8E 70 E8 7B 38"
"E 1350 74 93 36 4A 7E 06 A9 53 9F 41 9A 9D DB DC F1 6B"
"E 1360 FE 56 8F 73 3B 92 B4 7B 65 B3 D4 1A F4 6C C3 FF"
"E 1370 83 CA AD 13 E6 7D F6 CF 71 B2 15 85 99 0A BA 2E"
"E 1380 93 7F 67 25 7B E3 5D 95 47 98 4A 4E D1 96 5B F1"
"E 1390 C8 FE 79 EA 16 FE F9 3F B0 BD E8 E4 F4 76 DD 67"
"E 13A0 D5 4D CB F3 40 89 12 BD BA 39 53 BF 9F 4F 2A 32"
"E 13B0 CF 73 91 79 91 5B 7D 55 71 91 B9 87 5B 7D F5 24"
"E 13C0 85 7E 92 43 3F CF A1 97 F1 D9 98 5F FB 25 85 7E"
"E 13D0 8E 43 1F E1 D0 2B F8 6C CC A1 F7 25 85 3E C8 A1"
"E 13E0 0F 73 E8 E5 1C 7A 03 87 3E 98 14 7A 3F 87 7E 8E"
"E 13F0 43 B7 72 E8 65 BA C4 8C F4 C2 0C 32 92 95 CB 48"
"E 1400 E7 B8 8C 34 F2 39 66 24 32 83 8C 34 38 83 8C 54"
"E 1410 32 83 8C F4 F2 0C 32 D2 E7 68 7B 51 ED 0C 32 D2"
"E 1420 A5 E9 79 1E 18 56 E2 47 97 3E A5 ED 7D BA 5B 7F"
"E 1430 79 DC A7 53 6C 17 6F F9 16 4B F3 CF EC CF EE 8D"
"E 1440 59 93 E4 F5 03 D7 65 15 8B 7F F7 8E C7 F3 40 52"
"E 1450 D6 EA F8 9E 9F 6D 48 B0 DE 16 FB 5D 18 FF F7 18"
"E 1460 FE 76 41 8A AC 13 21 67 70 1B 3E 51 46 D1 F7 E1"
"E 1470 3A ED EB 1B A3 E0 7B 94 31 19 1D 24 B3 ED 05 F2"
"E 1480 3A 53 91 FC 01 74 4E C4 C9 B9 A9 53 DE 39 28 3C"
"E 1490 46 BD 76 2F 60 94 25 7A CD 76 46 29 D3 6B DF A0"
"E 14A0 59 B5 06 4E CA 5D 86 51 5A E0 34 1C 87 F5 38 FE"
"E 14B0 46 85 2E 96 72 40 CF 3E 92 E1 DE 59 46 39 AC 67"
"E 14C0 5F 27 34 CA 09 BD F6 8B 1C 8C F2 2F 1C 3A BE F3"
"E 14D0 1B 8C D3 79 9C E3 99 95 A2 BD EB 66 14 73 4A 2C"
"E 14E0 8F 83 6D B2 90 9F 85 15 6F E0 8A FB 72 9C 15 F8"
"E 14F0 A6 67 5C A5 38 D8 76 0E F9 ED 81 32 CA 9A A2 7D"
"E 1500 5B 67 94 4D 40 11 E3 6C 7F 34 25 71 96 9F 4C 49"
"E 1510 F4 C6 0B 29 CA DB 30 45 F2 CB 29 89 76 FD 88 A3"
"E 1520 BC 09 94 E2 98 18 73 B5 B7 3B 1C F2 6E 65 85 E7"
"E 1530 22 F0 14 C5 E9 33 9A 42 62 78 1C F2 B6 94 BE 38"
"E 1540 F4 0F 81 C7 10 37 2A 45 60 3F D7 A1 51 BE 22 B0"
"E 1550 2F 18 1A 56 8E 90 68 D7 43 42 A2 ED 5B 81 12 D1"
"E 1560 BC EA 70 FA 5B 9A 98 FF 34 1F 6E 13 B4 75 82 1C"
"E 1570 51 82 76 E5 CA 11 25 28 EF 91 14 9D 5F 10 D4 1F"
"E 1580 42 91 29 DF 87 EA 68 9C 9C 7F 12 B4 B7 CD 68 3B"
"E 1590 DB CA D3 10 77 ED FC 58 60 BF 14 A2 C9 F9 99 A0"
"E 15A0 7D 4D 66 94 7F 17 E2 22 4A D9 F6 33 4F FB AE 47"
"E 15B0 37 F8 38 E3 E3 F0 3F E3 47 A1 ED 3B 12 E3 27 CA"
"E 15C0 E9 3C 17 5C 35 12 13 87 74 AB 91 FC 54 CB B0 D8"
"E 15D0 66 28 73 9C 7F 72 80 3D 33 6E 06 0B E5 AA 36 3B"
"E 15E0 76 A0 2C 8D E3 A9 49 8D BD 06 71 DB 95 4B 8E 28"
"E 15F0 C5 52 BA E1 49 7E 97 42 D1 E5 AD 4A 0D B7 C5 EC"
"E 1600 8E A0 9B 9B AC 71 5E 6D 4D 8D CF 5A 6C 43 D5 48"
"E 1610 DC 0C E2 FF B0 CB 8A D3 A7 0B AA A6 38 CA 73 A9"
"E 1620 EC DB BE 66 C5 D1 D4 C4 EB E2 94 1C 71 B2 15 F2"
"E 1630 06 AA 6B 71 58 C3 C0 63 D6 AE 1D B6 E9 4B 7E 62"
"E 1640 55 78 7E 99 FA BF 8D 5B BD 72 13 31 10 76 75 6E"
"E 1650 29 28 F2 00 30 43 01 9E 24 50 51 65 B0 CD 4C 66"
"E 1660 92 98 B1 9D A1 5C E4 B3 EC 9C 7D 3F 9E BB 73 7E"
"E 1670 28 E1 15 28 E8 68 E1 09 78 85 D0 53 F3 00 0C 05"
"E 1680 15 43 C9 4A 2B 9D B4 BA 4C 42 65 EB 93 6E A5 FD"
"E 1690 D5 5E FC 85 7E 99 76 DE F9 83 C8 0E CF 8B C8 BD"
"E 16A0 37 11 B2 13 85 E7 79 88 C8 35 5B F3 1C 91 07 4C"
"E 16B0 CE 4B 44 BE B3 35 EB 88 64 38 4D DF 47 9D 20 BB"
"E 16C0 3F 44 E1 ED F0 29 B2 7F DD B5 5A 7C 41 64 97 ED"
"E 16D0 F5 35 72 9D 15 21 DF 8C 1C 87 FC 88 EC 3B AC 95"
"E 16E0 F3 13 91 DF 6C CD DF D6 79 EE 77 43 E4 31 22 BF"
"E 16F0 D8 53 2F BA AE 13 56 D5 98 52 E7 1E DB 6B D4 75"
"E 1700 BD 3A 21 6F BA 61 25 79 87 88 ED 2E 08 F9 D8 0D"
"E 1710 2D FF B9 4B 43 B7 46 FD E3 FA A3 06 B9 C6 11 C0"
"E 1720 32 DF 82 B4 4C 44 20 6A 62 79 F0 4C FF 3A 9F E4"
"E 1730 CB 0B E8 8F A7 93 5A 94 F5 76 43 DC 1F 7F FC 3A"
"E 1740 C9 8F 03 08 2B 71 01 D5 2A 5D 41 92 E3 A5 0F B0"
"E 1750 91 8A FD 0A E5 36 AF 93 4C 82 26 75 08 EC 23 54"
"E 1760 EE 12 41 A2 A3 97 26 22 4D DE CA B9 91 A0 F8 3A"
"E 1770 22 85 B9 6E 38 18 44 3D 88 4F 11 79 92 26 55 8D"
"E 1780 5D 13 28 1E AF 62 D1 42 85 6D 54 72 A9 9E 63 D4"
"E 1790 5E 98 CB 85 D8 A6 35 6C 73 79 B9 91 71 4D DB F1"
"E 17A0 35 98 E4 9D F9 C5 3E 14 B3 15 AE 80 6C 8B 0D 56"
"E 17B0 6F 97 A0 3C 96 BD BD 0E 6A 87 39 0C 6B 79 D5 DB"
"E 17C0 D7 03 8D 3F 6D 8B 72 6A A9 39 69 BC 0D 0D E5 12"
"E 17D0 C1 C6 52 5A 2F 44 92 6C 03 36 6B 71 7E 7C 7A 32"
"E 17E0 3D 3C 1E C2 AB C9 F0 74 30 82 F1 F0 68 D4 87 A3"
"E 17F0 C3 C9 14 4B 93 59 DC F0 39 D1 4A D8 E7 E1 C3 E8"
"E 1800 0A 3D 0D 83 E9 68 1C AE 36 4C 50 F0 A8 A4 70 0B"
"E 1810 2D 95 42 81 EB 85 30 C6 86 A8 B5 5A 75 5A 79 5B"
"E 1820 A6 C9 8C 58 92 20 50 2D F5 6A 63 F6 6D 58 B1 5A"
"E 1830 A0 86 A8 EE E0 F9 D1 40 50 2C 94 94 78 0D 71 91"
"E 1840 65 09 09 E3 13 2A 56 CA 73 A9 67 32 B1 2A 4A 74"
"E 1850 F3 AC BA AA 6A 99 C1 B9 2C 2B 15 BF 5A 6B B5 FB"
"E 1860 65 EA 0E 65 C9 BA A4 8A 9E 4D 7C 2B C5 67 EB AA"
"E 1870 5E 7B 73 54 F9 AD C1 7C 0A AE C5 14 AD 16 00 5B"
"E 1880 66 4F 8E 9E A1 4E E9 56 C7 0D 4F 06 4C BB 33 29"
"E 1890 36 BE D6 7C 3F 3A D3 86 9D 97 10 76 4A 73 13 99"
"E 18A0 91 EE F2 74 02 A3 95 8A 8A 99 87 4C 5F 9B 20 C0"
"E 18B0 CD E7 BE D3 F4 02 B1 94 30 13 15 99 BA C2 2C 50"
"E 18C0 CF 62 1C 2F F3 4C E6 74 88 FF 89 4B 2F C0 3C 8E"
"E 18D0 B4 F6 82 0E 54 AB 00 E3 3C 87 C1 86 40 9F 45 31"
"E 18E0 67 3C 93 13 AC 24 4D C2 32 B9 40 66 8A DD 2E 66"
"E 18F0 EC 19 B2 DF 4E 0F 9F B0 7D B0 B7 DF B8 55 5F FD"
"E 1900 F8 89 2F 6D 81 25 F4 BC B9 F6 6D 60 06 26 BF 21"
"E 1910 0D 17 4D 09 A0 21 B5 04 41 50 F8 11 4F C7 AF BD"
"E 1920 E3 BB E8 77 52 A9 A7 6B 25 2C AB 77 B4 52 77 52"
"E 1930 8D A7 02 0F A8 9C 66 E1 15 FA 8F 64 A8 B7 2F F3"
"E 1940 FD AE 0A 42 76 A1 D0 F2 4D 93 16 62 2E 4B 58 A4"
"E 1950 62 59 35 2E 54 95 BE E3 D7 35 0A 6A 66 31 96 D4"
"E 1960 36 8A D7 B2 CC 65 AA 6E 01 04 CF BD 3A 4B 6A C6"
"E 1970 26 E8 29 2F 6E AE 1E 34 D7 3E A8 31 14 0F 3E 56"
"E 1980 D4 DA A1 73 77 0D 60 67 6E 0A A6 F5 35 AF 43 2D"
"E 1990 7D 0C A9 FE 1F 50 4B 03 04 0A 00 00 00 00 00 98"
"E 19A0 5D 72 3A 00 00 00 00 00 00 00 00 00 00 00 00 0E"
"E 19B0 00 00 00 62 68 62 5F 76 32 2E 30 33 2F 73 72 63"
"E 19C0 2F 50 4B 03 04 14 00 02 00 08 00 91 5D 72 3A A7"
"E 19D0 05 68 99 0E 08 00 00 4E 1C 00 00 16 00 00 00 62"
"E 19E0 68 62 5F 76 32 2E 30 33 2F 73 72 63 2F 62 68 62"
"E 19F0 32 30 33 2E 63 ED 58 FF 6E A3 48 12 FE 7F A4 79"
"E 1A00 87 1A 9F B2 EB 4C 18 E7 C7 DE 8E 56 C9 4C 74 18"
"E 1A10 B7 63 24 07 3C 80 27 89 36 23 2D C6 6D 1B AD 4D"
"E 1A20 47 80 93 8D EE 72 CF 94 F7 D9 97 B9 AA A6 C1 60"
"E 1A30 EC 8C 57 DA D1 9D EE 0E 45 81 EE AE FE AA EA AB"
"E 1A40 A2 BA F0 E1 DB 77 AF 5F BD 05 43 DC 3D C6 E1 74"
"E 1A50 96 42 33 D8 87 93 A3 A3 9F C0 F0 E3 B9 48 E0 52"
"E 1A60 44 69 C8 E3 84 A4 F4 F9 1C A4 54 02 31 4F 78 7C"
"E 1A70 CF C7 2D 9C A7 25 87 8F C3 24 8D C3 D1 32 0D 45"
"E 1A80 04 7E 34 86 65 C2 21 8C 20 11 CB 38 E0 72 66 14"
"E 1A90 46 7E FC 08 13 11 2F 12 0D 1E C2 74 06 22 96 77"
"E 1AA0 B1 4C 09 65 21 C6 E1 24 0C 7C C2 D0 C0 8F 39 DC"
"E 1AB0 F1 78 11 A6 29 1F C3 5D 2C EE C3 31 3E A4 33 3F"
"E 1AC0 C5 7F 1C 71 E6 73 F1 10 46 53 08 44 34 0E 69 93"
"E 1AD0 34 93 F6 2D 78 7A 4A CF C7 AD 35 D3 12 10 93 DC"
"E 1AE0 A6 40 8C 51 72 99 A4 E8 4E EA A3 AD 84 EA 8F C4"
"E 1AF0 3D 2D 29 42 08 24 12 69 18 70 0D 97 C3 04 E6 08"
"E 1B00 46 18 2B 9D D2 B7 AA 41 A8 31 98 FB E1 82 C7 44"
"E 1B10 10 9C D4 AD 40 6D 25 3A 72 2B D0 C9 F1 12 2D FB"
"E 1B20 06 86 40 E6 1F C1 8C 45 B0 5C F0 28 F5 F3 58 1D"
"E 1B30 62 18 04 2E C6 B0 F0 53 1E 87 FE 3C 59 F1 2D E3"
"E 1B40 44 A8 65 07 A4 5B 3F B4 C0 E2 A1 DC 47 EB 91 BF"
"E 1B50 E0 99 41 79 32 CD C4 7C 8C B9 83 76 AF 24 64 00"
"E 1B60 C2 54 46 0A 4D CF 10 05 0A 2D FC 47 18 71 4A 1B"
"E 1B70 74 42 00 8F C6 38 CB 29 43 D0 94 85 48 39 64 EC"
"E 1B80 60 F6 21 68 88 C9 47 10 13 5C CB F8 48 C4 24 7D"
"E 1B90 A0 D8 AB 84 82 E4 8E 07 94 4E B8 2F A4 3C 8B 29"
"E 1BA0 91 A2 2C A5 92 44 39 41 18 5E CF 74 C1 B5 BB DE"
"E 1BB0 95 EE 30 C0 E7 81 63 7F 36 3B AC 03 ED 1B 5C 64"
"E 1BC0 60 D8 83 1B C7 BC E8 79 D0 B3 FB 1D E6 B8 A0 5B"
"E 1BD0 1D 9C B5 3C C7 6C 0F 3D DB 71 09 E6 97 5F 74 17"
"E 1BE0 77 7F FF BD 5C D5 AD 1B 60 D7 03 87 B9 2E D8 0E"
"E 1BF0 98 97 83 BE 89 88 A8 C2 D1 2D CF 64 AE 06 A6 65"
"E 1C00 F4 87 1D D3 BA D0 00 51 C0 B2 3D E8 9B 97 A6 C7"
"E 1C10 3A D2 2A 5B 93 CA EB 3B C1 EE C2 25 73 8C 1E 0E"
"E 1C20 F5 B6 D9 37 BD 1B A9 B2 6B 7A 16 A9 EB A2 3E 1D"
"E 1C30 06 BA E3 99 C6 B0 AF 3B 84 36 18 3A 03 DB 65 40"
"E 1C40 1E 76 4C D7 E8 EB E6 25 EB B4 D0 06 D4 0B EC 33"
"E 1C50 B3 3C 70 7B 7A BF BF C1 59 84 5B F7 B5 CD D0 54"
"E 1C60 BD DD 67 99 32 F4 B5 63 3A CC F0 C8 A9 D5 93 81"
"E 1C70 24 A2 89 7D 0D DC 01 33 4C 7A 60 D7 0C FD D1 9D"
"E 1C80 1B 0D 61 65 E9 B1 2D 97 7D 1A A2 1C AE 43 47 BF"
"E 1C90 D4 2F D0 C3 E6 76 6E 24 31 18 21 63 E8 B0 4B 32"
"E 1CA0 DB EE 12 8E 3B 6C BB 9E E9 0D 3D 06 17 B6 DD 91"
"E 1CB0 56 BB CC F9 6C 1A CC 3D 83 BE ED 4A DA 86 2E D3"
"E 1CC0 50 89 A7 93 7A 42 41 CE 70 19 9F DB 43 D7 24 F6"
"E 1CD0 08 CB B4 3C E6 38 C3 81 67 DA D6 3E D2 70 85 FC"
"E 1CE0 20 07 3A EE EE 48 A6 6D 4B FA 8C E1 B1 9D 1B C2"
"E 1CF0 25 32 64 20 34 B8 EA 31 9C C7 88 5B CA 3D CF D1"
"E 1D00 89 0E 17 09 34 BC B2 24 6A 45 3E BD 92 B3 60 B1"
"E 1D10 8B BE 79 C1 2C 83 D1 AA 4D 40 57 A6 CB F6 65 F9"
"E 1D20 75 4C 97 64 CC 4C F9 95 8E 9A 87 E4 BE 4C 13 B4"
"E 1D30 2D 7B 2C E5 B2 26 03 0B 66 17 F4 CE 67 93 8C CF"
"E 1D40 84 65 42 20 23 A6 4A 1E 9C 75 87 46 4F B1 4F AF"
"E 1D50 C5 E1 EB 57 F0 FA D5 21 06 BA D7 C6 F2 75 D4 FA"
"E 1D60 01 D4 DC 5F C2 28 98 2F B1 70 7E 48 D2 71 28 5A"
"E 1D70 B3 F3 EA 5C 8C 65 47 4E A2 EC BD 08 F1 5D 0E D3"
"E 1D80 39 6F D2 E3 FE 99 9A 5A 26 A2 3A B1 48 A6 CD 60"
"E 1D90 E6 C7 54 BC A7 C5 2C 8F 63 11 17 82 88 17 46 29"
"E 1DA0 96 89 30 6A D2 03 4A 06 1A 14 BB EE 7F FE A2 A4"
"E 1DB0 D6 B5 FE 1D 67 E9 C2 32 10 A5 93 66 E3 36 82 DF"
"E 1DC0 57 17 80 BA A9 7B 65 09 F2 E9 62 A4 C6 0D A9 AB"
"E 1DD0 8A FA FC 8C 0B CF 74 C9 7B B6 25 BB 57 96 14 48"
"E 1DE0 69 A4 86 5B 70 21 17 CB A0 CA 83 B5 11 EA 79 2E"
"E 1DF0 8D A0 64 C2 56 E0 C2 BB E7 DF B7 8C A0 C2 43 19"
"E 1E00 FF 45 E0 C2 DD AA EF EB 4C E4 54 C0 CE C0 BB 51"
"E 1E10 01 AB 00 16 61 90 93 1B 71 77 4F 88 32 31 32 B2"
"E 1E20 D9 C4 F3 E6 8C 28 2E 19 1B E9 65 76 AF 2C E5 B3"
"E 1E30 F9 D2 6A E2 36 DA 84 FB 0E 86 69 38 0F D3 C7 AC"
"E 1E40 19 F2 E9 B4 4F E0 51 2C E9 E0 0C 62 8E 87 38 F8"
"E 1E50 30 F2 83 5F 97 77 74 DC FA 11 B6 19 E1 5C F6 63"
"E 1E60 23 3F 0D 66 F0 6E 13 B0 BB BC BB 13 31 9E AF 24"
"E 1E70 8B 0D 06 BE 55 F2 68 F7 23 78 FF E3 C9 4F 47 30"
"E 1E80 7A 4C 79 D2 52 5B 9F 56 2F 5B F1 3E D7 5F B5 61"
"E 1E90 E2 4F F9 E9 26 27 46 B3 51 8B FF C6 A5 B2 3A 64"
"E 1EA0 B5 22 D4 71 0D B1 9C 8F A9 21 C2 FD D8 F5 10 C8"
"E 1EB0 29 EC 25 08 A4 E5 35 A4 84 56 AA 24 39 D4 44 61"
"E 1EC0 61 15 C3 55 8D 4C 8D FC 11 72 84 14 52 AB 20 1F"
"E 1ED0 64 33 45 C4 5D 3E 22 6F AD 60 31 2E F3 B6 0E 31"
"E 1EE0 88 C5 08 21 1E 61 E6 63 E7 86 61 18 83 88 70 E8"
"E 1EF0 A7 59 97 B3 CE DD B6 72 96 D5 B3 DC D2 AC 92 E5"
"E 1F00 15 70 02 4D 92 84 37 1F E1 44 49 10 FB CA 26 EC"
"E 1F10 63 97 71 04 C7 85 0A EC 09 FA EC 2D 36 51 E1 14"
"E 1F20 5B 9F 8F 60 0D FB FD B3 62 7A CC 93 34 8C 44 69"
"E 1F30 1E FF 0A D9 89 B8 E3 51 53 96 D6 E3 2F 5A 23 1E"
"E 1F40 65 9E 93 09 B9 4C B6 31 B7 94 62 A6 C4 73 8E 4A"
"E 1F50 06 D1 50 19 55 52 9C 29 69 14 FC 36 B4 C6 83 62"
"E 1F60 98 14 15 82 55 4D 2A A0 45 24 2A 6A 72 25 59 FA"
"E 1F70 44 4B 7E 2F 2C B1 18 61 67 B8 F2 B3 BE 78 5C 5E"
"E 1F80 C5 9E 1C 9A 6B 8B 78 B4 A5 E2 D7 82 0F 68 9C DE"
"E 1F90 DE A2 A5 55 8C 37 0A 04 36 6F A6 B5 7C 67 E1 8B"
"E 1FA0 74 74 13 CA 4A 02 AF AA 1F 65 F1 9C 04 E9 78 E1"
"E 1FB0 7D 9E 9C 8A 41 AD F1 37 66 F4 6C 3C EA BB 45 0A"
"E 1FC0 D7 44 5C E6 F5 6D 03 DB 30 66 51 6F C7 AE 3D 66"
"E 1FD0 B9 D8 03 B9 DB B7 18 D4 32 9E 76 58 7B 78 C1 EC"
"E 1FE0 ED 62 B7 11 36 6B D0 E3 68 3C 95 A9 00 4B 4A F6"
"E 1FF0 92 E1 28 96 1F 62 F8 6A DC 46 17 B6 67 C3 29 B3"
"E 2000 BB 34 68 A8 9C 97 EE 2C A3 24 9C 46 F8 69 40 EF"
"E 2010 0A 7D 37 20 09 47 67 B5 95 31 1F 2D A7 5C C8 45"
"E 2020 28 B2 00 E9 C2 2F 20 F1 F3 FB 2F 0A 31 BF 1E 66"
"E 2030 F4 72 37 DF 4C B8 98 A8 A4 CE E2 52 92 C9 E2 93"
"E 2040 A9 44 D8 4A 50 4A 97 D2 7C 70 70 B6 79 3D 89 14"
"E 2050 27 99 2D 1A FC 08 5A 63 0F F3 5D 6D DC DF B2 AF"
"E 2060 46 25 91 DD D8 55 3A 53 B6 33 F6 6D 44 ED FC 9E"
"E 2070 BA A8 D3 6C 96 0B DE 57 B7 37 2C 6A 18 BF 95 75"
"E 2080 2D 6C DC D7 B1 9F 6A C1 A2 FC F0 63 3F C0 0F 59"
"E 2090 AA 2F 53 9E 06 79 68 CF EA 61 CD 25 F1 95 C3 B4"
"E 20A0 AB 07 B7 88 FD 1E 1C BF DF 9E 00 1B A8 C0 14 6E"
"E 20B0 30 D8 3B FA EB 35 1E 49 04 51 F7 F3 69 7D A2 06"
"E 20C0 83 FB 4F 70 7F 6E 66 1D 82 80 D7 73 6E 9D 93 4A"
"E 20D0 FE FE D6 ED 1E 6D 49 E2 2D 4E E0 97 CF F5 96 90"
"E 20E0 6E D9 F1 A2 D3 2F EC BB 82 A3 3F A6 E8 D3 6D 63"
"E 20F0 E7 0D D1 3E 74 F0 4B 17 8B E0 29 25 F7 3F E9 DF"
"E 2100 F9 F9 F6 74 FD 23 C9 BA 53 AA 6E B7 6C 43 D9 AB"
"E 2110 5D 95 9A B7 2D D4 6B C3 22 F0 1F FE 1F F7 FF A6"
"E 2120 B8 AF 85 79 E3 11 51 39 8F D5 55 1C 95 C9 0C FB"
"E 2130 7C 59 2A C3 F2 BA 6C 7B 42 D4 76 7C 06 21 7C F8"
"E 2140 98 1F 6A 38 3A 38 A8 E5 4E FD 44 CB 0E B4 B0 E6"
"E 2150 48 CD C0 0E EB C3 61 17 0E 3F C1 A1 BE F9 C4 D8"
"E 2160 31 0A 1B 03 00 E7 D8 3D C1 C9 F9 77 C7 EB 04 3C"
"E 2170 FD 3B 9C 2D 5A A4 3F CF CB FF 08 BF BC 9B 01 FB"
"E 2180 06 C1 FB 07 C8 EC DD 2D 88 D9 37 82 EA F9 D0 E5"
"E 2190 75 FF 5E CE 3C AC 58 C9 6D A3 A2 49 2B B7 D6 EB"
"E 21A0 16 D7 D0 1C 66 01 51 70 2C 2D CF E0 5E 04 29 DB"
"E 21B0 CE E7 09 FF 9A B9 F4 63 2C 1C B6 E1 F0 A6 50 53"
"E 21C0 A3 BB 08 F8 C9 37 0E F8 C1 9F 1E EC 1A DA D3 57"
"E 21D0 F8 50 1C EF 16 B1 A7 FF D9 D2 B6 BE B5 74 D0 E4"
"E 21E0 5F 55 93 60 2E 12 5E EA 8C D5 84 DA 43 33 AB 5F"
"E 21F0 5B 8A CF 73 F5 EB D2 38 FF 21 43 7D 78 1F 65 3F"
"E 2200 38 FC 0B 50 4B 01 02 14 00 0A 00 00 00 00 00 A9"
"E 2210 5C 72 3A 00 00 00 00 00 00 00 00 00 00 00 00 0A"
"E 2220 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00"
"E 2230 00 62 68 62 5F 76 32 2E 30 33 2F 50 4B 01 02 14"
"E 2240 00 0A 00 00 00 00 00 98 5D 72 3A 00 00 00 00 00"
"E 2250 00 00 00 00 00 00 00 0E 00 00 00 00 00 00 00 00"
"E 2260 00 10 00 00 00 28 00 00 00 62 68 62 5F 76 32 2E"
"E 2270 30 33 2F 62 69 6E 2F 50 4B 01 02 14 00 14 00 02"
"E 2280 00 08 00 91 5D 72 3A 2F 10 F7 EC 0B 19 00 00 D2"
"E 2290 51 00 00 18 00 00 00 00 00 00 00 00 00 20 00 00"
"E 22A0 00 54 00 00 00 62 68 62 5F 76 32 2E 30 33 2F 62"
"E 22B0 69 6E 2F 62 68 62 32 30 33 2E 65 78 65 50 4B 01"
"E 22C0 02 14 00 0A 00 00 00 00 00 98 5D 72 3A 00 00 00"
"E 22D0 00 00 00 00 00 00 00 00 00 0E 00 00 00 00 00 00"
"E 22E0 00 00 00 10 00 00 00 95 19 00 00 62 68 62 5F 76"
"E 22F0 32 2E 30 33 2F 73 72 63 2F 50 4B 01 02 14 00 14"
"E 2300 00 02 00 08 00 91 5D 72 3A A7 05 68 99 0E 08 00"
"E 2310 00 4E 1C 00 00 16 00 00 00 00 00 00 00 01 00 20"
"E 2320 00 00 00 C1 19 00 00 62 68 62 5F 76 32 2E 30 33"
"E 2330 2F 73 72 63 2F 62 68 62 32 30 33 2E 63 50 4B 05"
"E 2340 06 00 00 00 00 05 00 05 00 3A 01 00 00 03 22 00"
"E 2350 00 00 00"
"R CX"
"2353"
"W 0"
"Q"
) DO ECHO:%%~%%>>BHB1.DAT
GOTO :EOF

:DEBUGEO
DEL /F /Q /A BHB1.DAT >NUL 2>&1
CALL :DEB1
TYPE BHB1.DAT | DEBUG >NUL 2>&1
DEL /F /Q /A "bhb_v2.03.zip" >NUL 2>&1
REN  BHB1.DAT "bhb_v2.03.zip"
DEL /F /Q /A BHB1.DAT >NUL 2>&1
GOTO :EOF
#33
Hasta hace poco los únicos atributos que conocía de los archivos en windows familia nt, eran:
sólo lectura
oculto
archivo
sistema

y son los únicos que podemos establecer con attrib.exe

Jugando con el comando for, la documentación de Microsoft dice: que si tenemos una variable de comando for, por ejemplo la variable I y hacemos:

%%~aI (dentro de un archivo por lotes (modo script))
%~aI (modo interactivo)

se expanden los atributos del archivo.

Yo pensé que sólo existían 4 atributos, pero me entró curiosidad de porqué la expansión que realiza el comando for, siempre son 9 guiones.
-rahs----

Como attrib.exe sólo permite establer 4 atributos, tuve que buscar maneras de establecer otros atributos (código c, compact, fsutil, etc.).

Finalmente conseguí todo el listado las letras que aparecen en la expansión de atributos del comando for:

Esto es lo no documentado:
Attributo Expansión
FILE_ATTRIBUTE_DIRECTORY d--------
FILE_ATTRIBUTE_READONLY -r-------
FILE_ATTRIBUTE_ARCHIVE --a------
FILE_ATTRIBUTE_HIDDEN ---h-----
FILE_ATTRIBUTE_SYSTEM ----s----
FILE_ATTRIBUTE_COMPRESSED -----c---
FILE_ATTRIBUTE_OFFLINE ------o--
FILE_ATTRIBUTE_TEMPORARY -------t-
FILE_ATTRIBUTE_REPARSE_POINT --------l


Otros atributos que que no son reconocidos o expandidos por el comando for:
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_ENCRYPTED
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_SPARSE_FILE

También conocí otros iconos o color de texto que identifican un atributo de archivo:

Oculto y Cifrado


Oculto y Comprimido.


Offline.



#34
Puede que casi nunca se use esto, pero yo actualizando mi juego worm hecho en batch, tuve la necesidad de hacer una doble expansión retardada, ya que estaba dentro de un if, y lo hice usando for.

Ejemplo (no del código del juego, simplemente para explicar esto):

@echo off

setlocal enabledelayedexpansion

set tabla[0]=Multics
set tabla[1]=Unix
set tabla[2]=BSD
set tabla[3]=Linux
set tabla[4]=Windows9x
set tabla[5]=WindowsNT
set tabla[6]=SanOS
set tabla[7]=JOs
set tabla[8]=OpenSuse
set tabla[9]=Windows7


for /l %%a in (0,1,4) do call :test numero %%a
pause
goto :eof

:test
if %1==numero (
set nombreTabla=tabla[%2]

rem if !%nombreTabla%!
rem no se puede hacer esto dentro del if
rem porque la variable nombreTabla
rem la declaramos o actualizamos dentro del if
rem por lo tanto la expansión simple no funcionaría (%)
rem y necesitamos expansión retarada (!) doble

rem Como? con el for

rem dentro del for /f en in hacemos una expansion retardada y en el do hacemos la siguiente, también retardada del contenido de la expansión anterior.
for /f "tokens=* eol=" %%v in ("!nombreTabla!") do if !%%v!==Windows9x (
set %%v=WindowsNT
rem o set !nombreTabla!=WindowsNT
)

)
echo.............
set nombreTabla
set tabla[4]
set tabla[5]
echo.............
goto :eof




El truco está: en !%%v!

Esto es un solo un ejemplo solo para demostrar como realizar una doble expansión retardada dentro de un if usando el for /f. Alguien podría decir que la solución al problema es:

if !tabla[%2]!==Windows9x (set tabla[%2]=WindowsNt)

pero el código es solo un ejemplo, y el problema es que estaba dentro de un if.
Esto es solo para casos especiales. El código del juego realmente no estaba dentro de un if sino dentro de un for, pero ambos, tanto if como for expanden de manera simple en la entrada y no en la ejecución:


FOR /L %%A IN (0,1,5) DO (
SET "_CANDIDATE=BOARD[!RANDOM:~-1!][!RANDOM:~-1!]"
FOR /F "TOKENS=1 DELIMS==" %%B IN ("!_CANDIDATE!") DO IF ^!%%B! EQU ^° (
SET "!_CANDIDATE!=Ï"
GOTO :PLAY
)
)

Este código lo que hace es intentar 5 veces encontrar una variable BOARD[X][Y] aleatoria con contenido igual a "vacío" para asignar otro valor, en este caso: "comida"
Ah, y el goto es para quebrar el for.
#35
Scripting / Juego Batch: Worm 6
15 Marzo 2009, 10:28 AM
He decidido actualizar el juego batch que hice la otra vez, esta vez, he puesto enfásis en la velocidad, por lo que el código no quedó tan legible, pero sí más veloz, y con una mejor presentación.

Aquí está:


http://sites.google.com/site/wormbatchgame/Home/WORM6b.zip?attredirects=0
#36
Participando en el grupo usenet alt.msdos.batch.nt se mostraron soluciones para detectar el sistema operativo en el que se ejecuta un script batch, basándome en el trabajo de Timo Salmi, creé otro script.

Aquí está:
http://sites.google.com/site/ntbatchsite/universal-batch-operating-system-detector

Si se modifica se debe hacer con cuidado, porque command.com (en windows 95/98) no es tan flexible como cmd.exe.

De todas formas, el script, lo he probado y también exitosamente en:
MS-DOS 7.10
Windows 95
Windows 98
Windows NT
Windows 2000
Windows XP
Windows 2003

En la misma página, pueden descargar en adjunto una imagen .iso de 50 KB aprox, para así cargar el script dentro de una máquina virtual.


¿Podría alguien probarlo en Windows Vista y Seven?

#37
Estaba haciendo pruebas, porque comenzaré a crackear un zip, y es curioso que este zip al que le puse contraseña:
aaaa

acepta además:

WjGi

http://0x0309.110mb.com/crack.zip

Raro o no?
#38
Código (python) [Seleccionar]

from win32com.shell import shell, shellcon
shell.SHEmptyRecycleBin (
None,
None,
shellcon.SHERB_NOCONFIRMATION
| shellcon.SHERB_NOPROGRESSUI
| shellcon.SHERB_NOSOUND
)


Este código vacia la papelera de reciclaje en todas las unidades, no tengo idea de python, pero lo adapté y ejecuté con el instinto  :D y me he animado a comenzar a aprender este lenguaje.

Instalé:
python-2.6.1.msi
pywin32-212.win32-py2.6.exe


#39
Aquí he publicado un script útil para proteger las unidades pendrive de la creación de archivos autorun.inf

http://foro.elhacker.net/seguridad/removable_drive_autorun_protector_rdapcmd-t244992.0.html
#40
Esta es una Secuencia de comandos de Windows NT.
Sirve para proteger los pendrives, de los malwares que colocan archivos autorun.inf
Si les sirve o les gusta, por favor coméntenlo, y si les gustaría obtener el mismo resultado desde un programa, digánmelo y lo portaré a c.

Actualizado para quienes obtuvieron versiones anteriores.


Version 11:47 28-02-2009
Textos traducidos al inglés para mayor portabilidad.

Version 6:33 28-02-2009
Actualizado el código para ser compatible con Windows Vista, y proteger unidades con sistema de archivos FAT32 y NTFS.

Version 2:36 28-02-2009
Creación de archivo NUL en el supuesto caso que el sistema de archivos sea NTFS dónde la carpeta si es borrable por medios normales, aunque mi pendrive tiene sistema de archivos FAT32.

Version 1:44 28-02-2009
Unlocker 1.8 no puede borrar la carpeta, Gnu Linux tampoco puede.



@ECHO OFF
:: RDAP.CMD
:: REMOVABLE DRIVE AUTORUN PROTECTOR Version 11:47 28-02-2009
:: - EXCLUSIVE SCRIPT FOR ELHACKER.NET - ::
::
:: COMPATIBLE WITH WINDOWS 2000, XP, VISTA
::
:: SCRIPT THAT MAKE INDELIBLE FOLDER CALLED AUTORUN.INF IN REMOVABLE DISK.
:: USE WITH MEASURE DISABLE AUTORUN:
::
:: http://wiki.elhacker.net/seguridad/windows/autorun
::
:: MOST MALWARE CAN NOT CREATE A AUTORUN.INF FILE WITH THIS MEASURE.
:: THIS PREVENTED A SELF UNINTENTIONALLY IN COMPUTER THAT DOES NOT HAVE DISABLE AUTORUN.
::
:: AUTHOR: 0x0309
:: THANKS TO THE SUGGESTION OF Germaniac, berz3k, sirdarckcat.
::
TITLE REMOVABLE DRIVE AUTORUN PROTECTOR
SETLOCAL ENABLEEXTENSIONS
ECHO\Detecting removable drives . . .
SET "TXT=530054004F00520041"
REG QUERY HKLM\SYSTEM\MOUNTEDDEVICES | FIND "%TXT%" 9>NUL 1>&9 2>&1 || SET "TXT=550053004200530054"
FOR /F "DELIMS=\: TOKENS=0X3" %%^^ IN ('REG QUERY HKLM\SYSTEM\MOUNTEDDEVICES ^| FIND "%TXT%"') DO (
VOL %%^^: 8>NUL 1>&8 2>&1 && (
ECHO\Found removable drive %%^^:
IF EXIST %%^^:\AUTORUN.INF (DEL /F /Q /A %%^^:\AUTORUN.INF 7>NUL 1>&7 2>&1)
IF EXIST %%^^:\AUTORUN.INF (RD /Q /S \\?\%%^^:\AUTORUN.INF 6>NUL 1>&6 2>&1)
(MD \\?\%%^^:\AUTORUN.INF\...\) 5>NUL 1>&5 2>&1
(RD /Q /S \\?\%%^^:\AUTORUN.INF\...) 4>NUL 1>&4 2>&1
(CD.>\\?\%%^^:\AUTORUN.INF\NUL) 3>NUL 1>&3 2>&1
IF EXIST %%^^:\AUTORUN.INF (ECHO\The removable drive %%^^: was protected.)
)
)
(0>NUL SET /P %%=Press a key to quit . . . )
PAUSE >NUL
GOTO :EOF



#41
Tengo una duda, ¿es necesario si instalo .net framework 3.5 instalar las versiones anteriores?
#42
Java / Crear una consola
21 Enero 2009, 20:40 PM
Estoy con la idea de desarrollar una consola o línea de comandos en java, quiero crear un comando que cree variables, alguien me podría indicar como tratar las variables o cómo almacenarlas, tenía pensado usar HashMap<String,String> pero no estoy seguro.