domingo, 30 de enero de 2011

Añadiendo el Wiimote a los scripts de PyGame

Pues eso, veamos como podemos hacer para añadir de forma fácil la posibilidad de usar el Wiimote en los scripts que usan PyGame modificando mínimamente el código.

La idea es muy simple, el sistema de eventos de PyGame permite añadir eventos desde fuera, mezclando eso con el sistema de callbacks de cwiid ( la librería para manejar el Wiimote ) podemos hacer como si se pulsasen teclas del teclado desde el Wiimote, los eventos se pueden crear así:


ev = pygame.event.Event( <tipo de evento>, { "key": <tecla> } )


Y después solo hay que añadirlos con:

pygame.event.post( ev )


Entonces el script quedaría algo como esto [ wii4pygame.py ], solo hay que hacer bind_wiimote(), opcionalmente mandando el número del led a activar ( 1 por defecto ), por ejemplo:

viernes, 28 de enero de 2011

Controlando el reproductor Totem desde el Wiimote

Al principio la idea no era exactamente esa, de hecho era sobre rhythmbox... pero empecemos desde el principio.

Hablando con un colega sobre nosequé salió la idea de controlar el Rhythmbox ( reproductor de música de gnome bastante usado ). Al volver sobre la idea días ¿ semanas ? más tarde, leyendo la documentación sobre como hacer un plugin llegue a esta web: http://redjunasun.blogspot.com/2010/11/wiimote-for-controlling-rhythmbox.html a ver... compila perfectamente con "gcc archivo.c -o loquesea -lcwiid" y funciona bien.

Y no es un plugin, hmmm... parece ser que lo que usa para controlarlo es el DBus y uno pensando que solo servía para cosas de bajo nivel, mola controlar el reproductor así, enfin, eso ya está hecho, habrá que buscar otra cosa, probemos con el Totem.

Actualización: corregidos botones que no deberían hacer nada pero hacían play/pause

miércoles, 26 de enero de 2011

Montando un sistema de descargas oculto ( 2 ): cifrando y pensando a lo grande

[ Montando un sistema de descargas oculto ( 1 ): las bases ]

Seguimos avanzando, está claro que aunque los datos se ocultan dentro de una imágen, si tiras de esteganografía para esto, dejar los datos simplement así es casi como que vayan en *****, si alguien busca datos ocultos en una imágen LSB es lo primero que se probaría, hay  que reforzarlo con un cifrado, con un simple ARC4 con una clave segura y suficiente padding basta para darle en los morros a los cotillas y para desalentar a algun bot que analice la red en busca de algo sospechoso, este cifrado ya se explico anteriormente, así que vamos con lo siguiente.

Una sola imágen está bien para cosas pequeñas, pero hasta una relativamente grande no puede soportar más de 1 mega, hay que buscar una forma de dividir el archivo y mantener una lista de las ubicaciones de las partes, digamos por ejemplo que queremos dividir el archivo cifrado entre las imágenes y subir estas a un hosting de imágenes como Imageshack.us, habría que guardar las URL donde quedan las imágenes, ya puestos la clave se podría sacar de "/dev/urandom" para que sea lo suficientemente cerca y de paso guardar el tamaño del archivo original, en esta implementación, el formato usado es este:

Actualización: corregido un error muy tonto que podía ocurrir al guardar la clave en el gzip :P

lunes, 24 de enero de 2011

Cambiando seriesyonkis por Twitter

Después de ver cosas como este post en Freesoftwareando uno no puede menos que intentar estirar un poco más la goma, si ellos consiguieron subir tantos enlaces a twitter, aquí presento un programa que permite acceder a ellos directamente... vaaale, solo una excusa para probar el twitter4j.

Por partes, si quieres compilar tu mismo el programa, vas a necesitar el mentado twitter4j, aquí ya se explicó como hacerlo ( y sin compilarlo tampoco estoy seguro que se pueda prescindir de el, así que va también en el paquete ) .

Instalando twitter4j en Gnu/Linux

Twitter4j es un envoltorio (wrapper) del API de twitter para Java, veamos como instalarlo rápidamente:

Lo primero es instalar maven, esto se puede hacer con

sudo apt-get install maven2


Descargamos la última versión desde Twitter4j - GitHub



Ahora hay que descomprimirlo y ejecutar el package.sh

bash package.sh


Y por último copiar los .jar que se generaron en el directorio "twitter4j-core/target/" al directorio de librerías de java, en mi caso ( openjdk-6 ) sería:

sudo cp *.jar  /usr/lib/jvm/java-6-openjdk/jre/lib/ext/


Y dar permisos de lectura ( no vaya a ser )

sudo chmod +r /usr/lib/jvm/java-6-openjdk/jre/lib/ext/twitter4j*.jar


Ya podemos usar esta librería tan completa en nuestro código.

domingo, 23 de enero de 2011

Montando un sistema de descargas oculto ( 1 ): las bases

La idea era mostrar primero un posible escenario de control total de internet, pero se volvió demasiado post-apocalíptico. Na' , imaginaos simplemente que queremos distribuir eh...código fuente, pero sin que nadie se dé cuenta de que su servidor lo aloja.
Una opción es utilizar algo conocido como esteganografía, como dice en la Wikipedia:

La esteganografía es la disciplina en la que se estudian y aplican técnicas que permiten el ocultamiento de mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Es una mezcla de artes y técnicas que se combinan para conformar la práctica de ocultar y enviar información sensible en un portador que pueda pasar desapercibido.

Vamos, que así como la criptografía intenta que los datos no sean recuperables sin una contraseña, la esteganografía apunta a pasar mensajes sin que se interpreten como tales.

Por ejemplo, hay imágenes en casi cualquier página de Internet, podemos introducir nuestros datos en una imágen y después subirla a un foro, un host de imágenes o donde nos de la gana.


jueves, 20 de enero de 2011

Resolviendo dominios .42 en un servidor BIND9 casero (DNS)

Pues nada, veamos como hacer que nuestro DNS casero resuelva direcciones con el TLD .42, si no sabes que es esto, mejor hechale un vistazo al proyecto https://www.42registry.org/faq-es.php

"42 Registry es, principalmente, una experiencia como otras tantas de las que abundan en Internet hoy en día. Es una organización sin ánimo de lucro, orientada a proponer un TLD (Dominio de Primer Nivel) para agrupar a una comunidad concreta."

Voy a suponer una distro basada en Debian ( Ubuntu, Trisquel ... Debian... ), pero la idea es la misma para todos, solo hay que cambiar un par de cosas (que avisaré cuando se tercie).


jueves, 13 de enero de 2011

GUI's en python con [ GTK | QT4 ] y [XML | HTML... ]

Hoy traigo una librería que aún no está acabada, pero puede que interese a la gente que no le guste complicarse lo más mínimo con las interfaces, pero que aún así le interese hacer unas GUI para los script [ guiml.zip ].

La idea es simple, le pasas un pedazo de HTML a la "librería" y esta selecciona el Toolkit disponible (por ahora solo soporta Gtk y Qt4, cuando le heche el guante a algo que tenga tk instalado lo añado ) hace una GUI basandose en eso, por ejemplo, para

<title>Simple test</title>
<form action="test">
Decide <br>
<input type="submit" value="SI" name="Si"><input type="submit" value="NO" name="No">

Con Gtk:

Con Qt4:

martes, 11 de enero de 2011

La curva del dragón con Logo

Nada, que después de encontrarse uno con que alguien se las arreglo para hacer este fractal con redcode [ http://impomatic.blogspot.com/2011/01/dragon-curve-in-redcode.html ] (para quitarse el sombrero, vaya :P !) no se puede menos que intentarlo en otro lenguaje, y a falta de poder tirar de los gráficos de tortuga el python por cosas de la vida, la siguiente opción es logo.


domingo, 9 de enero de 2011

Historias desde los confines de random()

Pues eso, hoy toca un script al estilo de cierto juego analógico, ese en el que hay que escribir una frase en un trozo de papel sabiendo sólo con que palabra empezar (última palabra que escribió la persona anterior) y pasarsela a la siguiente hasta que vuelva a la primera.

Lo que hace el script [ randomstories.zip ] es tomar un número cualquiera de palabras de una página de wikipedia, y repetir el proceso haciendo que la primera palabra encaje con la última hasta alcanzar el tamaño máximo del mensaje. El archivo que hay que ejecutar es randomstories.py .


viernes, 7 de enero de 2011

Rompiendo captchas

Por cosas de la vida, últimamente ando trasteando con las arañas, crawleando cosas varias... y al final era inevitable toparse con los CAPTCHAs, así que se me ha presentado la ocasión de intentar vencerlos, por ahora esto es lo poco que he conseguido [ captcha_baker.py ], lo poco que hace el propio script es leer los pixels de la primera línea y pasar a blanco los que estén cerca de estos, y a negro el resto. Después corta las letras por las columnas en blanco.

El valor de la "cercanía" es modificable (de hecho la idea viene del parámetro "umbral" de la selección de color de GIMP).

Depende de Image Magick para convertir las imágenes a BMP, Python Image Library para recortar las letras y tesseract-ocr para reconocer las letras.

No funciona demasiado bien, pero estoy bastante contento con el resultado para ser una primera prueba.

Los parámetros son:


./captcha_baker.py <imágen> <número de letras> [<umbral>]


El número de letras no es realmente necesario, se puede poner a 0 para no considerarlo. El umbral por defecto es 15. Por último unas muestras.

martes, 4 de enero de 2011

Acelerenado `route`, `netstat` y parecidos [tip]

Los comandos de red como `route`, `netstat`, e incluso programas como `nmap` tienen la constumbre de intentar convertir las IP's en nombres de red después de realizar su función principal. Por muy útil que sea a veces, en otros momentos es excesivamente pesado, por ejemplo si utilizamos:

netstat

Para descubrir las conexiones activas, después de obtenerlas intentará convertir las IP en nombres de red, y en muchos normales no resultará en nada útil (seguramente acabe mostrando las IP o nombres genéricos).

Estos mismos comandos suelen aceptar el flag -n que evita esa resolución, el cambio salta a la vista:

Hasta otra

lunes, 3 de enero de 2011

Escaneando un servidor FTP

Para hacer una araña que explore un servidor FTP se puede aprovechar el ftplib de python... solo tiene un impedimento, que cuando se pide la lista de archivos en un directorio se devuelve por stdout, lo que es bastante molesto para algo como esto.

La solución más sencilla es substituir la salida estándar ( sys.stdout ) por un objeto que almacene los datos, el único método que hace falta en el objeto es objeto.write(string) , el que se usa para mostrar strings por la pantalla, esto puede servir: