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

Script para avisar de tareas URL y Review del trabajo

@Ubuntu 9.04, Firefox plugin (iMacro) y bash

Firefox abierto con la web del curro. Script iMacro:

REFRESH
WAIT SECONDS=5
SAVEAS TYPE=HTM FOLDER=* FILE=EWOQ
WAIT SECONDS=60

En la carpeta donde guarde iMacro el archivo EWOQ.htm ejecutar el script:

#!/bin/bash
enviado=0
contador=0

while [ true ]; do
#Hay tareas URL?
cat EWOQ.htm |grep -i «URL Rating» > /dev/null
if [ $? -eq 0 ] && [ $enviado -eq 0 ]; then
touch URL
date +%H:%M
echo «Hay URL!!»
obexftp -b 00:17:E6:9C:F9:30 -B 11 -p ./URL
rm URL
enviado=1
fi

#Hay tareas Review?
cat EWOQ.htm |grep -i «Review» > /dev/null
if [ $? -eq 0 ] && [ $enviado -eq 0 ]; then
touch Review
date +%H:%M
echo «Hay Review!!»
obexftp -b 00:17:E6:9C:F9:30 -B 11 -p ./Review
rm Review
enviado=1
fi

echo «Vaya mierda las side-by-side»

#Si han pasado 30 min poner enviado a 0 (para poder notificar otra vez)
if [ $contador -eq 29 ]; then
enviado=0
contador=0
fi

#Se comprueba el html cada 60 segundos, 60 veces en una hora (0-59)
sleep 60

#Incremento contadores
let contador=$contador+1
done