miércoles, 16 de diciembre de 2015

Decodificador de imagenes JPG para Gameboy Advance

Descarga aquí.
Bueno, pues como sabreis la GBA no fue muy conocida por la calidad y cantidad de imagenes usadas en juegos. Esto es porque una unica imagen que ocupe toda la pantalla (240x160) sin comprimir ocupa  37 KB en modo 256 colores (baja calidad) o 74 KB a 32.768 colores (alta calidad, apenas usado). Por esto se me ocurrió crear el primer decodificador de ficheros JPG que permiten mostrar estos ficheros de imagen de alta calidad que no ocuparían mas de 15 KB en este formato a resolución nativa en una GameBoy.


Este ROM habría sido un gran adelanto para la consola. Lastima que en 2001 solo era un crio :')

Tenia pensado crear un programa que pudiera adjuntar vuestras propias imagenes al ROM, pero dudo que mas de 1 o 2 personas lo utilizasen, asi que lo abandoné.
En el zip teneis un ROM de 104 KB con 9 imagenes "random" en alta calidad que muestra la presentacion de imagenes junto a los *.jpg utilizados. Si mirais dentro del ROM con un editor hexadecimal comprobareis que estos *.jpg estan contenidos dentro del ROM. A continuación detalles tecnicos:


Resulta que hace unos días encontré el codigo para un decodificador de imagenes orientado a dispositivos embebidos (Como puede ser un marco de fotos digital) el cual era muy simple, y estaba orientado a procesadores con pocas capacidades como el Z80.
Se trata de TJpgDec y lo primero que se me ocurrio al verlo es que podia adaptarlo para hacerlo funcionar en la GameBoy (Plataforma con la cual ya estaba familiarizado) pero antes de intentarlo siquiera me di cuenta de que en la GBC la escasa paleta de colores, resolución, memoria, y potencia del procesador, iban a hacer del trabajo algo inutil.
Viendo esto, informandome sobre las caracteristicas tecnicas de su sucesora, la Game Boy Advance y sobre los distintos modos graficos que tiene, vi que en GBA todo cuadraba, y podria implementar sin problemas el primer decodificador de archivos JPG para GameBoy de la historia, usando para esto el compilador DevKit Advance r5 beta 3 compilando siempre con el maximo de optimizaciones (-O3).

Puestos al trabajo tuve que retocar el codigo de TJpgDec para que en primer lugar, no trabajase con archivos, sino con array de bytes con el contenido de los archivos JPG que se incluirian dentro del ROM, reemplazanto para esto todas las intrucciones como fopen() o fseek() por un codigo que haria su correspondiente funcionamiento en los arrays de bytes.
Cuando ya habia acabado y el codigo me habia compilado con exito vi que salian colores sin sentido y la imagen apenas se reconocia.

De los distintos modos graficos que tiene la GBA yo utilizo el modo 3.

Como el modo 3 trabajaba con pixeles de 16 bit usé el modo RGB565 del decodificador, pero me di cuenta de que la GBA no usaba RGB565, sino un BGR555 en el que deja sin usar el bit mas significativo de estos 16 bit (Apenas encontré documentación sobre los modos graficos). Por esto, otra vez me toco modificar el codigo de TJpgDec para que convirtiera a el espacio de color de la GBA tal y como se ve en la imagen.

El programa final compilado al maximo de optimizaciones (-O3) le lleva al procesador de la GBA unos 2-3 segundos para decodificar un archivo, es por esto que mi ROM de prueba se trata de una simple presentación de imagenes en la que el procesador trabaja siempre al 100% para cargar lo antes posible la siguiente imagen

jueves, 10 de diciembre de 2015

Bug grave en Lovoo: El like infinito

En esta ocasion y viendo que mi post vulnerabilidades de Badoo tuvo un existo mucho mayor del esperado, decidí crearme un perfil de la red social Lovoo solo para comprobar su seguridad como ya hice con Badoo, no obstante, tras varios test, la unica vulnerabilidad grave que encontré fue la siguiente:

Bug del like infinito (Fallo grave):

Al parecer recientemente cambiaron la interfaz de Lovoo añadiendo la funcion de dar likes a las fotos. Estas fotos guardan la referencia de las personas que dieron like y un contador de likes aparte que hace mucho mas simple las consultas a los perfiles de usuario a los servidores. No obstante, por un descuido de los desarrolladores, cuando pulsas el boton like en una foto el contador incrementa, pero si decides quitar el like, este no decrementa. Como resultado, si haces click repetidamente en el boton del like, puedes dar a esa foto los likes que quieras, incluso si la foto es tuya propia. Este proceso se puede automatizar con programas como Fiddler web debugger. Usando Fiddler, se podría automatizar el proceso durante horas si se quisiera (obteniendo miles y miles de likes), no esta del todo comprobado pero yo lo hice funcionar durante 10 minutos obteniendo mas de 1000 likes y no hay captchas ni nada que te detenga.

Captchas poderosos muy mal utilizados:
La version web de Lovoo utiliza un metodo de captcha muy poderoso de "reCaptcha" en el que el usuario debe seleccionar 2 o 3 fotos con muy mala calidad y a veces manipuladas que contengan lo que se le pide (Se permite seleccionar una imagen incorrecta como maximo). Este captcha solo se usa en las nuevas solicitudes de chat, los cuales tienen limite diario, lo cual convierte a este capcha en algo inutil.

A continuación os comento rápidamente otras vulnerabilidades menos importantes relacionadas con las fechas y horas, las cuales deberían estar ocultas al usuario:

Revelación fecha de creación de los usuarios:
Igual que ocurria con Badoo, en Lovoo el ID de usuario consiste en 24 cifras hexadecimales, de las cuales solo las primeras son la ID de usuario, siendo las ultimas una verificación para que la gente no vaya curioseando quien se creó la cuenta de Lovoo 5 segundos despues como si se podia hacer en Badoo. Estas IDs de usuario se crean secuencialmente permitiendo estimar cuanto tiempo lleva creada una cuenta.

Fechas y horas precisas:
Pero... La cosa no acaba aquí: Cuando la aplicación accede a un usuario, sus fotos tienen una fecha de subida y el usuario una fecha de ultima conexion entre otras fechas. Estas se muestra en la web con mensajes que dan muy poco detalle como "Hace un par de semanas" o "Hace una hora", pero si vemos la respuesta que ha mandado el servidor, dentro de la respuesta encontraremos parametros como "CreatedAt" en el caso de las fotos o "LastOnlineTime" en el caso de la fecha de ultima conexión, que contienen un numero.
Este numero es equivalente al entero de 32 bits que transformado en time_t es la fecha y hora GMT con precisión de un segundo.


martes, 8 de diciembre de 2015

Superresolution: Conseguir fotos de 20 MP con una camara de 5 MP ¿Merece la pena?

En este post, tras hablaros de los nuevos formatos de compresion de imagenes os voy a hablar de una forma para conseguir fotos de una resolución mayor a la que os permita vuestra camara mediante interpolacion cubica y mediante superresolution. Para ello yo usaré el programa GIMP.
Os muestro un detalle de la siguiente imagen sacada con la camara de un Iphone 4 (5 MP) aumentadas tras aplicarle los dos metodos.

Estos metodos, no obstante, no permiten obtener la misma calidad que si usamos una camara de mayor resolución, pero si dan una mejor impresion. En mi opinion estos metodos (y sobre todo el primero) no deberian usarse con frecuencia ya que suponen un desperdicio de memoria, ya que se obtienen fotos con mas megapixeles pero con una calidad inferior a una imagen obtenida a esos mismos megapixeles. No obstante, si por ejemplo se quiere obtener un fondo de pantalla con mayor calidad si que podria resultar util el metodo superresolution.


-Interpolación cubica: 
Como ya sabreis algunos, mediante la interpolación cubica es posible aumentar la resolución de una imagen prediciendo cuales serian los pixeles intermedios. Estos pixeles son "inventados" pero al añadirlos pueden dar una sensacion de mayor calidad de imagen.

En Gimp, cuando cambias el tamaño de una imagen, se hace por interpolación cubica por defecto.

-Superresolution:
Consiste en realizar varias fotos iguales (en los ejemplos uso 4 fotos), aumentarlas mediante interpolación cubica y superponerlas unas con otras, obteniendo mayor calidad que si solo aplicamos interpolacion cubica a una imagen.

Para aplicar superresolution en Gimp, se deben abrir las imagenes como capas, aumentarlas con interpolacion cubica, añadirles transparencia, y alinearlas manualmente.

-Conclusiones:
Vosotros mismos podeis ver y juzgar si existe diferencia entre la foto original y la foto con superresolution. Desde mi punto de vista el hecho de superponer varias fotos (superresolution) la mayor mejora que da a la imagen es reducir los pixeles "defectuosos" que obtenemos cuando una foto es demasiado oscura y la hacemos con una camara de un movil, pero tampoco puede hacer magia, y tal vez en vez de aumentar de 5 MP a 20 MP seria mas viable aumentar a resoluciones mas aceptables como 10 MP.