30 Octubre FFDroid

0.19: Hoy me dispongo a crear las clases de cada objeto. Hasta ahora habia apelotonado todo en una activity para probar que podia seguir adelante, y puedo 😀 He creado la superclase Personaje con una subclase Archer por ahora. Intentaba pasarle por parametro la referencia tipo R.id.NombreChar1 pero no he podido porque tendria que extender de Activity para poder usar findViewById y de todas formas tampoco funcionaba, asi que al final acabo pasandole una View entera, no solo la referencia, asi: Archer arquero = new Archer((ImageView)findViewById(R.id.Char1)); (ejemplo). Tambien añado funciones «pestaniear» y «atacar» que son para las animaciones estatica y dinamica.

0.20: Sigo limpiando el codigo y creo la clase Mob, parecida a Personaje pero quitando muchas cosas (voy a conservar el valor MP del mob, quizas me sirva). Tambien creo una subclase Cactilio parecida a Archer. Creo una variable statica por si se crean varios Cactilios, a cada uno le asigno el nombre «Cactilio «+numero, por ejemplo «Cactilio 1» :D. He implementado la funcion «pestaniear», que para el cactilio solo alterna entre dos imagenes. No tengo sprites para funcion atacar, ya vere que hago…

0.21: Gracias a Prats me he vuelto a mirar la posibilidad de crear referencias tipo R.drawable.cactilio (int) a partir de strings y tras 10 horas de hacer pruebas he conseguido sacarlo xD. He modificado las superclases Personajes y Mobs para que carguen imagenes con parametro string. Ahora tengo un cargador de imagenes que acepta int (para las referencias) y otro que acepta strings (le puedo pasar que cargue archer01, y equivaldria a cargar R.drawable.archer01), esto me viene muy bien para ahorrar lineas al cargar con un bucle las imagenes de los gifs, que los tengo dividido en imagenes estaticas. Al final se me quedara «deprecated» el cargador con int XD.
La forma para que funcionara ha sido la funcion getIdentifier(«archer», «drawable», «droid.pkg.FFDroid»); que devuelve un int con el identificador correspondiente a R.drawable.archer dentro del paquete droid.pkg.FFDroid. Pero esto tal cual no funcionaba, tenia que llamarse desde getResources().getIdentifier(). Pero el getResources solo funcionaba en el contexto de la activity main, no queria funcionar dentro de un runnable ni en las superclases. Asi que he tenido que volcar el contexto de la activity principal en una variable publica statica que se supone que deberia ser accesible en todo el paquete, pero no lo es… por tanto tengo que pasar esta variable por parametro a todos los objetos al crearlos si quiero que puedan cambiar su imagen alguna vez. Total la funcion para el arquero en funcion de i queda asi: ((ImageView)findViewById(R.id.Char3)).setImageResource(appContext.getResources().getIdentifier(«archer0″+String.valueOf(i), «drawable», «droid.pkg.FFDroid»)) obviamente en el codigo esta mejor presentada ^^U

0.22: Finalizo la implementacion de las funciones «pestaniear» de los mobs y pestaniear y atacar del arquero. El arquero parpadea 1 de cada 5 periodos comprendidos aleatoriamente entre 500 y 1500ms.

FFDroid 29 Octubre

0.16: Por fin me funcionan los sliders… He definido 3 estados runnables que se gestionan con un solo metodo «listener» de eventos. El primer estado se activara cuando alguna barra de tiempo llegue a max, pasa de 27, 80, 53 a 27, 53, 80. El segundo estado se activara cuando se acabe de seleccionar en el menuAtacar(aun por determinar como se notificara que se ha acabado de seleccionar) y pasa de 27, 53, 80 a 0, 80, 80. El tercer estado es volver al estado 1, pasa de 0, 80, 80 a 27, 80, 53 y se activara cuando haya acabado la animacion, la cual se activara solo cuando el estado anterior acabe y este en 0, 80, 80.

0.17: Ya que funcionan los sliders paso a hacer el layout del menu Atacar que sale automaticamente al completar la barra de tiempo de cualquiera de los 3 chars. Este layout tiene abajo un resumen de los nombres y barras de tiempo, hp y mp. No me cabia tambien los valores numericos de hp y mp. Arriba sale la lista de acciones que se pueden hacer. Por ahora solo implementare Atacar, y Defensa supongo que tambien. No consigo alinear el texto del textview, no existe textAlign y layout gravity no me hace caso. Queda feo un textview, quizas lo cambio a otro componente. PD: Sigo sin saber como cambiar el color de los progress bar

0.18: He acabado de editar la animacion del arquero y la he implementado.

FFDroid 28 Octubre

0.8: Las animaciones van a ser un problema, me tocara editar todas las imagenes para ajustar la altura y anchura xD. Nuevo prototipo orientao a k funcionen las animaciones:

0.9: Nueva relacion de pesos 1-4 para mobs-char y 1-3 para info-mobchar. Probado en HTCHero con QVGA

0.10: Nueva relacion de pesos 1-4 para mobs-char y 1-4 para info-mobchar. Probado en NexusOne 800×480

0.11: No me acaba de convencer la distribucion xD, lo dejare en 4:3 (53-27) para info-mobchar. Cuando se elija opcion del menu se desplazara info con un timer cambiando el peso… con ((LinearLayout)findViewById(R.id.MobChar)).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, b)); donde b es el nuevo peso.

0.12: Retocando imagenes para adaptar las animaciones. Las imagenes staticas son de 32×48

0.13: Por fin me aclaro a sacar las capas de un gif en gimp. He sacado las 8 imagenes del gif de tomberi y las cargo con un timer (mi gif player personalizado xD)

0.14: Ajustando las animaciones a 175×48 pixels (archer10.gif)

0.15: Me aburria de editar imagenes y me he puesto a hacer sliders. uno para ocultar el layout de info y mostrar el de atacar, otro para mostrar en pantalla completa el layout de mobchar y ocultar el de atacar, y el otro para volver a mostrar info como al principio. Estoy teniendo problemas en los dos ultimos ya que se activan por click. Solo se ejecutan una vez…

FFDroid 27 Octubre

0.5: Ya parece funcionar todo, asi que hago prototipos de como quiero que quede mas o menos. Puesto que la pantalla es 16:9 y es diminuta tengo que optimizar el espacio, asi que cambio la distribucion de los menus. Es solo una imagen ajustada pixel a pixel, no creo que me quede tan bonito al final xD

0.6: Creando layout de batalla para adaptarse lo maximo posible al prototipo. Aun no he conseguido cambiar el color de la progress bar (el gris y amarillo). Solo me deja el background, que ni se ve. He probado con una imagen en drawable y cargarla en indeterminate, que no se lo que es, y no parece que sea la solucion xD. Tambien he quitado el titulito de arriba que ponia el nombre de la aplicacion, quiero conservar la barra de notificaciones y hora.

0.7: Ya me he atrevido a toquetear el timer… NO FUNCIONA el timer de java asi que he tenido que crear uno a mano con handler y runnable. No adjunto foto porque es como la de arriba, con 4 cactilios alternando sus patas cada 800ms y los arqueros pestañeando cada 3000 xD

FFDroid 26 Octubre

0.2: Pantalla de seleccion, pero no me cabe el fondo y he tenido que cambiarlo. Ademas me salen estirados los pjs porque uso fitXY ya que fitCenter no parece funcionar….

0.3: Pantalla de seleccion, EL PUTO WYSIWYG DE ECLIPSE ME SACABA LAS IMAGENES FUERA DEL LAYOUT VISIBLE, pero al emularlo en el AVD funciona bien, asi que al final arreglo los iconos y dejo fitCenter

0.4: Arreglo el layout de seleccion para que las imagenes y la info tenga el mismo peso, cambio colores, etc, etc. Empiezo el layout de batalla con imagenes aleatorias y un mensajito pa ver si los intents se pasan bien.

FFDroid 25 Octubre

25 Octubre empiezo el FFDroid. Un port del FFVB que hice hace 8 años sin conocimientos de informatica

0.1: Conseguir poner fondo a un layout xD. Cuando intente portarlo a c++ con las liberias gtkmm no pude hacer esto y tuve que abandonar

Manual de ingenieria inversa (74/75)

Manual que cree hace 7 años, antes de entrar en la uni. No sabia muchas cosas que hoy en dia ya se, pero he querido mantener el mismo lenguaje «inocente» que usaba por aquel entonces xD.

MANUAL DE INGENIERIA INVERSA (TECNICA 74/75)

Hoy es dia 1 de octubre del año 2003, empiezo un manual sobre la técnica del 74/75 para crackear, soy Cerb.

Requisitos mínimos:

– Ordenador con monitor y teclado

– Programa desensamblador (W32dasm)

– Programa editor hexadecimal (HexWorkshop)

– Programa visor de llamadas de registro (Regmon) —–> Normalmente no hace falta

– El paciente que será operado (programa a crackear)

– Un dedo y un ojo, a ser posible el cuerpo entero

0==========0

0. Introducción

0==========0

La técnica del 74/75 sólo nos servirá para juegos/programas que pidan serial o que introduzcamos el cd. La teoría es la siguiente: en el momento en que nos piden algun dato y lo introducimos correctamente (introducir serial correcto o introducir el cd) nos aparecerá una ventana de agradecimiento por haber registrado el producto, si el dato que nos piden no es correcto nos aparecerá otra ventana diciendo que el dato introducido no es correcto. Con la técnica del 74/75 lo que se hace es buscar el momento en que se abre la ventana de error y cambiar el programa para que salga la ventana de agradecimiento. Esto se hace cambiando el 74 (je) por el 75 (jne) o viceversa en la linea de codigo donde compruebe si el dato introducido es el correcto o no; asi si introducimos el serial incorrecto o no metemos el cd nos dara los agradecimientos, si introducimos el serial correcto o metemos el cd nos dara error.

0============================0

1. Búsqueda del ejecutable a crackear

0============================0

Buscamos el ejecutable que queremos crackear, debemos mirar que a veces lo que tenemos que modificar no es el «.exe» que arranca el juego, sino que es algun otro «.exe», «.dll» u otro archivo de apoyo. Para saber cuál es el archivo que necesitamos abriremos el REGMON. Con este programa veremos las llamadas al registro que hacen todos los programas abiertos en un momento determinado en nuestro ordenador, asi veremos que al pedir el serial o al pedir el cd llama al «.exe» del juego o a otro archivo de apoyo.

0=================0

2. Copia de seguridad

0=================0

Cuando tengamos el archivo que debemos modificar, le hacemos una copia de seguridad en la misma carpeta, a este le cambiamos el nombre añadiendole una «coletilla» y dejandolo como el archivo original. Ejemplo: «Copia de WinZip.exe», la coletilla es un grupo de caracteres que se ponen al final del archivo (antes de la extension) para diferenciarlo de otro que se llame igual «WinZip().exe».

Con la coletilla conseguiremos dos archivos iguales pero con diferente nombre para no haber confusion.

0========0

3. W32Dasm

0========0

El W32Dasm es un programa desensamblador (saca el código del programa y lo muestra en lenguaje ensamblador/»asm»).

Arriba a la izquierda en la barra de Disassembler pinchamos en «Open file to disassemble» y buscamos el archivo que teniamos que crackear «WinZip().exe» (el que tiene la coletilla). Se nos mostrará el código del exe en asm. Arriba en la barra de herramientas a la derecha pone «Strn Ref», pinchamos ahi para ver las variables que contiene el código, si este botón no está activado olvidaos de hacer el crack con la técnica 74/75 :(. En el «String Data Reference» buscamos el mensaje de error que se nos dio al introducir el serial incorrecto o al no meter el cd, (si no está el mensaje olvidaos también de poder crackearlo con esta técnica :P). Cuando tengamos la variable detectada pinchamos doble click sobre ella para que nos direccione hasta donde se encuentra, cerramos la ventana del string data reference y nos fijamos en la variable de error.

El asm es un lenguaje antiguo muy difícil de programar, el código de sus programas está ordenado por números en hexadecimal «0123456789ABCDEF».

Teniendo la variable miramos un poco más arriba hasta que veamos un «Referenced by a (U)nconditional or (C)onditional Jump at Address:», esto significa que las direcciones que hay debajo de esto es desde donde ha saltado, al lado de la dirección habrá una C o una U, si es C es un salto condicional (se puede hacer algo por cambiar el salto), si es una U es un salto incondicional (no hay condiciones no hay posibilidades). Por tanto apuntaos en un papel todas las direcciones que tengan la C. Cuando tengamos una dirección con C la buscamos (más arriba) y vemos si tiene la letra je o jne y si en la linea de arriba se produce una comparacion, ahi es donde se compara el dato introducido y el correcto, tendremos que poner que si el dato introducido es igual al correcto no vaya a los agradecimientos…

Las comparaciones se pueden hacer con «cmp» o «test», se compararan dos registros «eax, ebx, ecx…»

Colocándose en la línea del salto je/jne (74/75) miramos en la barra de estado y apuntamos los números que hay a continuación de «Offset» sin contar la «h». Esta es la posición de esa línea si estuviese el archivo «deshexadecimalizado». La apuntamos y pasamos al siguiente punto.

0===========0

4. HexWorkshop

0===========0

HexWorkshop es un programa editor hexadecimal, hace lo mismo que el W32Dasm pero no pasa a asm, sino que pasa a hexadecimal.

Con este programa hacemos lo mismo, buscamos el archivo pero esta vez el que no tiene coletilla y lo «deshexadecimalizamos». Se nos mostrará el archivo en hexadecimal :S

En la barra de menú buscamos donde ponga «goto» y pinchamos, se nos abrirá una ventana, introducimos el número del offset que teníamos de antes y seleccionamos «hexadecimal», pinchamos en aceptar y nos llevará al punto donde nos preguntaban el serial.

Alli veremos un 74 o un 75, si es 74 cambiamos a 75 y viceversa, guardamos cambios y probamos el «WinZip.exe», si funciona bien, borramos el «WinZip().exe» y está crackeado, pero si no funciona tendremos que mirar otra dirección diferente de la que habiamos escogido en el salto condicional y repetir los pasos. Si con ninguna de estas direcciones funciona, buscad el mensaje de agradecimiento en vez del de error y repetid los pasos.

0===================0

5. Tabla de equivalencias

0===================0

En asm el 74 se escribe je y el 75 jne. 74 y 75 son letras de hexadecimal que significan que debe saltar (74) o no (75).

Existen otras formas de expresar eso, en vez de 74/75 pueden ser otros numeros. En esta tabla se muestran todas las posibilidades que pueden haber.

Hexadecimal Assembler Significa

75 o 0F85 jne Salta si no es equivalente

74 o 0F84 je Salta si es equivalente

EB jmp Salta directamente a

90 nop ( No OPeration ) Sin operación

77 o 0F87 ja Salta si esta sobre

OF86 jna Salta si no esta sobre

0F83 jae Salta si esta sobre o igual

0F82 jnae Salta si no esta sobre o igual

0F82 jb Salta si es inferior

0F83 jnb Salta si no es inferior

0F86 jbe Salta si esta debajo o igual

0F87 jnbe Salta si no esta debajo o igual

0F8F jg Salta si es mayor

0F8E jng Salta si no es mayor

0F8D jge Salta si es mayor o igual

0F8C jnge Salta si no es mayor o igual

0F8C jl Salta si es menor

0F8D jnl Salta si no es menor

0F8E jle Salta si es menor o igual

0F8F jnle Salta si no es menor o igual

Scripts de iptables para enrutar conexion

Scripts de iptables y puente para el caso concreto de mi casa xD
Un modem-router se conecta por USB a mi pc y le da internet. Mi pc tiene dos tarjetas de red y crea un puente entre las dos interfaces. Luego enruta la conexion del modem al puente. Asi tengo internet en este pc y en 2 mas que se conecten por red.
@Ubuntu 9.04 y bash

Script para crear el puente:

#Creando bridge
brctl addbr CASA
brctl addif CASA eth0
brctl addif CASA eth1
ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0
ifconfig CASA 192.168.0.10

Script de configuracion iptables para enrutar la conexion:

#### SCRIPT DE CONFIGURACION DE IPTABLES ####
#!/bin/bash

# Dispositivo de red de internet
EXIF="eth3"
# Dispositivo de red local
INIF="CASA"

fail=0

[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/lsb/init-functions

log_begin_msg "Aplicando Reglas de Firewall..."

## Borrado de reglas anteriores
iptables -F || fail=1
iptables -X || fail=1
iptables -Z || fail=1
iptables -t nat -F || fail=1

## Establecemos politica por defecto
iptables -P INPUT ACCEPT || fail=1
iptables -P OUTPUT ACCEPT || fail=1
iptables -P FORWARD DROP || fail=1
iptables -t nat -P PREROUTING ACCEPT || fail=1
iptables -t nat -P POSTROUTING ACCEPT || fail=1

# Marcar paquetes salientes con su ip de origen
iptables -t nat -A POSTROUTING -o $EXIF -j MASQUERADE || fail=1
# Reenvio de IP
echo 1 > /proc/sys/net/ipv4/ip_forward || fail=1

# Aceptar paquetes para reenviar procedentes de la red local
iptables -A FORWARD -i $INIF -o $EXIF -j ACCEPT || fail=1
# Aceptar paquetes para reenviar procedentes de internet de conexiones ya establecidas
iptables -A FORWARD -i $EXIF -o $INIF -m state --state RELATED,ESTABLISHED -j ACCEPT || fail=1

# Se muestran los resultados
log_end_msg $fail

if [ $fail -eq 0 ]
then
log_success_msg "Verifique que lo que se aplica con: iptables -L -n."
else
log_warning_msg "Se ha producido un error al aplicar alguna de las reglas"
fi

#### FIN SCRIPT DE CONFIGURACION DE IPTABLES ####

Script para codificar todos los archivos de una carpeta en mp4 psp

Script para codificar todos los archivos de una carpeta a mp4 en una subcarpeta llamada po. Se asume que no existen archivos no codificables XD

@Ubuntu 9.04 y bash

En cualquier directorio ejecutar en terminal. 29.97 fps, 320×240 res, 48kbps abitrate, 128kbps vbitrate, codec h264, contenedor mp4. Contenidos en la carpeta ./po/ xD El ffmpeg esta modificado para aceptar el codec x264, supongo que hoy en dia ya tendra soporte oficial.

echo Escribe el directorio
read DIR
cd $DIR
mkdir po
ACUM=0
for i in *; do ffmpeg -i "$i" -f psp -scodec x264 -r 29.97 -s 320x240 -vb 384000 -ar 48000 -ab 128000 po/"$ACUM".MP4 && (( ACUM += 1 )); done

Script para rellenar con 0 un pendrive

@Ubuntu 9.04 y bash

Ejecutar en cualquier directorio fuera del que se quiera rellenar. Se accedera a KINGSTON y se rellenara con 0. Creo que el 487 son los megas del pen, que era de 512.

#!/bin/bash
cd /media/KINGSTON/
for j in `seq 1 487`; do
{
mkdir $j
cd $j
for i in `seq 1 1024`; do echo
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
> $i; done
cd ..
}; done