Bueno, tras el éxito del tutorial sobre edición de memoria local usando
Cheat Engine, os traigo una nueva herramienta que nos permitirá interceptar (
sniffer) modificar y enviar packetes TCP entre un
cliente y un
servidor externo. El programa se llama
WPE Pro y en éste tutorial usaremos la versión
0.9a mod.
Para hacerlo todo más fácil, os enseñaré a trabajar con WPE mostrando un
caso real (programado por mí), para que podáis tocar, editar y probar con vuestras manos. Empecemos...
Primero de todo os dejo un link donde encontraréis el
WPE Pro 0.9a mod y mi ejemplo práctico que usaremos para enseñar éste sistema:
https://www.mediafire.com/?32rr2shrq9tyywg
En su interior encontraremos lo siguiente:
(http://i.imgur.com/1ilsetF.png)
wpepro09mod = Carpeta que contiene el WPE
CLIENTE.exe = Mi ejemplo para poner en practica éste tutorial
SERVIDOR.exe = Mi ejemplo para poner en practica éste tutorial
En la carpeta de wpepro hay una carpeta filtros con mi ejemplo ya resuelto. Por si lo quieres ver o por si te atascas.
TEORÍA Y EXPLICACIÓN DE LAS PARTESAbrimos el
WPE, estaréis en la ventana principal, a continuación os dejo un esquema y os explicaré las partes importantes. Por favor, anotad los nombres de los botones ya que me referiré a ellos durante todo el tutorial:
(http://i.imgur.com/pvjcspb.png)
1)
Target Program: Nos permite seleccionar el proceso (cliente) que queremos monitorizar.
2)
Trace Controls: Nos permite iniciar, pausar y detener la captura (sniffer) de paquetes. Abajo en los contadores sale el número de paquetes capturados
3)
Action Console: Nos permite crear filtros y enviar paquetes modificados.
A continuación os muestro una ventana con 4 paquetes capturados. Aún no he explicado como se captura, pero primero quiero que veáis que datos nos muestra y que significa cada cosa:
(http://i.imgur.com/UMeZLmE.png)
1)
Contador: Muestra el número de paquetes capturados en una sesión
2)
Paquetes: Indicador numérico de los paquetes recibidos
3)
Source / Destination: Aparece la IP y puerto del cliente y del servidor
4)
Tamaño: Indica el tamaño del paquete (número de offsets)
5)
Tipo de paquete: Puede ser Send o Recv. Nos indica si es un paquete de entrada o salida
6)
Datos: Nos muestra en HEX y ASCII los datos del paquete.
A modo de resumen, en la imagen de ejemplo se ven 4 paquetes capturados, 2 de Envío (
send) y 2 de respuesta (
Recv). Fácil, no? Ahora os enseñaré que pinta tiene el editor de paquetes (
filtros), no os asustéis, es más sencillo de lo que parece:
(http://i.imgur.com/0wQ7Gnk.png)
1)
Datos el filtro: Indicamos el patrón de offsets que buscamos y los offsets que modificamos
2)
Tipo de filtro: En el ejemplo; Normal
Éste tipo de filtro (
normal) no me gusta usarlo, a continuación os enseño el
avanzado:
(http://i.imgur.com/9OAjvNO.png)
1)
Datos el filtro: Indicamos el patrón de offsets que buscamos y los offsets que modificamos
2)
Filtrar en: Indicamos que tipo de paquetes serán afectados por éste filtro (en el ejemplo; los de tipo Recv
3)
Tipo de modificación: Indicamos si modificaremos todo el paquete o desde el offset encontrado
Bien, hasta aquí ya conocéis y podéis identificar las principales partes del programa, ahora vamos a practicar con un ejemplo, para ello ejecutamos el
CLIENTE y
SERVIDOR que hay en la carpeta (los he programado yo). Básicamente pretende ser un videojuego muy sencillo que permite
abrir cofres y
comprar objetos (items), aquí os dejo la ventana del
CLIENTE y del
SERVIDOR:
(http://i.imgur.com/gqsIhCQ.png)
(http://i.imgur.com/Uk6eQJ2.png)
EMPEZAMOS CON EL TUTORIAL PRACTICOCAPTURAR PAQUETESEjecutad el
WPE, el
CLIENTE y el
SERVIDOR, seguid los siguientes pasos:
- Pulsar
START SERVER en la ventana
SERVIDOR- Pulsar
CONECTAR en la ventana
CLIENTESi lo habéis hecho bien, os aparecerán los siguientes mensajes:
(http://i.imgur.com/c9X7uLs.png)
Bien, el ejemplo que he programado es sencillo. El
CLIENTE se conecta al
SERVIDOR y envía una serie de paquetes, el
SERVIDOR los comprueba y devuelve una respuesta, así de sencillo. En la ventana del
CLIENTE, pulsa el botón
abrir cofre y
comprar item:
(http://i.imgur.com/pFGrxAi.png)
Podrás observar como el cliente envía la petición de
abrir un cofre y el servidor la procesa (genera entre 1 y 5 monedas) y las envía al cliente.
En el caso de comprar item... tenemos 500 monedas y el item cuesta 2300, así que el servidor
nos deniega la compra :(
Bien, ya tenemos nuestro juego ejecutándose y ya sabes como funciona, ahora vamos a empezar con lo bueno:
capturar paquetes y engañar al servidor jeje. Pulsamos en
WPE el botón de
TARGET y seleccionamos el proceso del CLIENTE:
(http://i.imgur.com/GJUeMjg.png)
Una vez hecho ésto, pulsamos el botón de
PLAY del
TRACE CONTROL, así iniciaremos la captura de paquetes. Mientras esté el botón de
PLAY pulsado,
WPE irá capturando todos los paquetes que se envíen y reciban.
Nos situamos en el
CLIENTE y pulsamos
1 vez en abrir cofre y
1 vez en comprar item, debería ocurrir lo siguiente:
(http://i.imgur.com/cyH5OiU.png)
Si lo has hecho bien, habrás
capturado 4 paquetes (fíjate en el contador de paquetes). Ahora pulsa en el botón
STOP para detener el sniffer y automáticamente veremos la ventana de paquetes capturados:
(http://i.imgur.com/OoOciZn.png)
Bieeeeen!! acabas de capturar tus primeros
4 paquetes!! Tómate tu tiempo para ver que has capturado, intenta entender el formato de los paquetes. Para éste tutorial lo he hecho MUY sencillo. Si te fijas, se trata de una comunicación entre el
CLIENTE y el
SERVIDOR; cuando has pulsado en abrir cofre, el cliente ha mandado (
send) un paquete cuyo mensaje es OpenChest#1 y automáticamente el servidor ha devuelto un paquete cuyo mensaje es GetCoins#3 (en mi caso he obtenido 3, tu puedes obtener entre 1 y 5, en un número random).
Se entiende? Creo que es bastante sencillo.
ENVIAR PAQUETES CAPTURADOSAhora que tenemos capturado el paquete que indica la acción de abrir un cofre, lo añadiremos a
WPE para poder enviarlo de forma abusiva jeje, hacemos lo siguiente:
Pulsamos botón derecho sobre el primer paquete (
send) y seleccionamos
Add to Send List:
(http://i.imgur.com/rP8tmHs.png)
Ahora vuelve a hacer click derecho y selecciona la última opción
Set Send List with this socket ID:
(http://i.imgur.com/z5IeLD1.png)
Éste paso es importante, ya que le estaremos indicando a
WPE que utilice el mismo
ID de socket para mandar el paquete. Si lo hemos hecho bien, en nuestra
Action Console aparecerá el paquete. Recuerda marcar la pestaña
Send en la
Action Console:
(http://i.imgur.com/4JSZgRT.png)
Marcamos el paquete tal y como se ve en la foto y pulsamos en el
lápiz para editar el paquete:
(http://i.imgur.com/0VNMMk3.png)
Ésta ventana nos muestra el paquete, aparece el tamaño (
11) y el contenido en
HEX y
ASCII. Pulsamos QUIT ya que no queremos modificar el paquete (solo os quería enseñar como ver el contenido de un paquete antes de ser enviado). Ahora indicaremos a
WPE que envíe ese paquete como si lo estuviera haciendo el propio cliente de forma legítima.
Pulsamos el boton
PLAY en la
ACTION CONSOLE (el botón de abajo que hay lado del
lápiz) y aparece la siguiente ventana:
(http://i.imgur.com/ZKBs96W.png)
Debería estar configurada tal y como se ve en la foto, es decir:
- Enviar
1 vez
- Utilizar el socket
abierto- Open Socket
ID: Éste es el ID del socket, debería tener un número ya escrito.
Pulsamos
PLAY en ésta ventana para enviar nuestro paquete
1 vez, si lo hemos hecho bien el cliente recibirá las monedas como si hubiera abierto el cofre:
(http://i.imgur.com/8vf71sG.png)
Ves que fácil? Ahora vamos a investigar un poco más: Vuelve a enviar el paquete pero ésta vez ponlo en
5 (mira la foto):
(http://i.imgur.com/3VeM9Qh.png)
Pulsa
PLAY y observa que ocurre en el
CLIENTE y en el
SERVIDOR:
(http://i.imgur.com/Pi5aZOI.png)
Puedes observar como
WPE ha enviado
5 veces el paquete de abrir un cofre y el servidor nos ha obsequiado con
5 respuestas (y sus respectivas monedas) jajaja
Ahora, si has sido lo suficientemente curioso... te habrás preguntado porque el paquete que envía el cliente es OpenChest#1, no? Que pasaría si cambio el último número? Para ello pulsa el
lápiz para editar el paquete y cambia el último
offset:
(http://i.imgur.com/pGr6sZO.png)
Pon un nombre al paquete para que recuerdes que lo has modificado y envíalo
1 sola vez, observamos que ocurre:
(http://i.imgur.com/jFUcOVG.png)
(http://i.imgur.com/Tu1Ppcy.png)
CHAN!! Acabas de engañar al servidor haciendo creer que has abierto
5 cofres, el servidor recibe OpenChest#5 y te envía
5 veces el paquete de obtener monedas. GENIAL!!
Bien, acabamos de llegar al final de la explicación sobre como enviar paquetes, es muy sencillo.
FILTAR & MODIFICAR PAQUETESAhora os explicaré como modificar los paquetes entrantes (
recv), capturando los que cumplan un filtro y modificar dichos paquetes antes de que el
CLIENTE los reciba, volvemos a nuestra captura de paquetes y nos fijamos en el primer paquete de tipo
Recv:
(http://i.imgur.com/Jv301W8.png)
Ese paquete es la respuesta que nos devuelve el
SERVER cuando le enviamos el comando OpenChest#1, es decir, lo podemos traducir de la siguiente forma:
CLIENTE dice OpenChest#1
SERVER responde GetCoins#0X (X puede ser cualquier número del 1 al 5)
No hay que ser un superdotado para descubrir que GetCoins es la función de dar monedas y los número de detrás del # son la cantidad de monedas... pues vamos a modificarlo para que el servidor nos
devuelva SIEMPRE 99 monedas. Para ello seleccionamos el contenido Hexadecimal del paquete tal y como se ve en la foto anterior y hacemos click derecho y seleccionamos
Copy.
Nos vamos a nuestra
Action Console (pestaña
Filters), seleccionamos el primer filtro y lo editamos con el botón del
lápiz:
(http://i.imgur.com/OQTdppB.png)
- En la ventana del filtro, cambiamos el modo a ADVANCED
- En la parte superior, en los offsets de
SEARCH hacemos click derecho y seleccionamos
PASTE para pegar los datos de nuestro paquete
- Hacemos lo mismo en los offsets de
MODIFY (click derecho y
PASTE)
En la foto veréis que he cambiado los
offsets 10 y 11. Ahora os explicaré el motivo, de momento modificarlo también (igual que la foto). Ponerle un nombre al filtro y seleccionar el tipo
Recv. Pulsamos
ApplyUna vez hecho ésto, marcamos el filtro y pulsamos el botón
ON:
(http://i.imgur.com/b8aOJ7F.png)
En éste estado,
WPE capturará todos los paquetes de tipo Recv y los comparará con los offsets que hemos puesto en
SEARCH, es decir:
47 65 74 43 6F 69 6E 73 23 = GetCoins#
Si esa comparación se cumple, modificará el paquete por los offsets de MODIFY:
47 65 74 43 6F 69 6E 73 23 39 39 = GetCoins#99
Pulsamos varias veces sobre el botón de abrir cofre en el
CLIENTE y observamos que ocurre:
(http://i.imgur.com/j4QkmDe.png)
Como puedes observar, el servidor recibe nuestro OpenChest#1, el servidor devuelve unas cuantas monedas (1, 2, 5, 3, etc...) pero en nuestro cliente obtenemos
99 monedas todo el rato jejeje
Bien, así de sencillo es aplicar filtros. Solo tenemos que tener muy claro que
offsets buscamos y que
offsets hay que modificar, luego
WPE trabajará solo. Para desactivar el filtro hay que quitar el botón
ON.
ENVIAR PAQUETES MODIFICADOSAhora explicaré como solventar el tema de comprar items. (Enviar un paquete modificado)
Ya has visto que el cliente envía BuyItem#500 y el servidor responde BuyDennied#0 (es decir, que no nos permite comprar porque nos falta dinero), vamos a engañar al servidor, jeje.
Nos vamos a nuestra captura y seleccionamos el paquete de comprar BuyItem#500, hacemos click derecho y lo enviamos a nuestro
Send List:
(http://i.imgur.com/2F9iJu1.png)
Marcamos el nuevo paquete y lo
editamos:
(http://i.imgur.com/GpFqcB4.png)
Vamos a cambiar el
número 500 por el número 2800, verás que no lo puedes cambiar de golpe. Primero tienes que
aumentar el tamaño a 12 y luego escribir el nuevo valor:
(http://i.imgur.com/kTEUqXA.png)
Guarda el paquete modificado y envíalo
1 vez usando el botón
PLAY (ya deberías saber hacerlo), si lo has hecho bien obtendrás lo siguiente:
(http://i.imgur.com/x1zVKwb.png)
Ya tienes tu item gratis!! :)
RESUMEN FINALBueno, por hoy me detengo ya. Espero que os animéis con
WPE ya que es un programa muy divertido. Ésta teoría se puede aplicar en
juegos multiplayer actuales para
dupear items, recibir dinero/monedas/gold, hacer tradehacks y un sinfín de cosas más. Se puede utilizar para juegos tipo
Starbound, Diablo II o para juegos
Flash de navegador como PokerStar o cualquier juego tipo Ogame, etc...
La dificultad reside en que
no hay una forma fija para capturar y modificar un paquete. Cada juego utiliza su protocolo y su sintaxis. Lo complicado es capturar el paquete deseado y saber modificarlo. Algunos paquetes estarán cifrados o con comprobaciones de CRC, pero eso ya lo veremos más adelante...
Saludos!! :D
TUTO By ||MadAntrax||