[OllyDBG] ¿Mensaje cifrado o codigo hexadecimal no ascii?

Iniciado por GonzaFz, 20 Enero 2015, 06:04 AM

0 Miembros y 1 Visitante están viendo este tema.

GonzaFz

Buenas!
Mi presentacion
¿Que conocimientos tengo? Soy estudiante de Ing. en sistemas de informacion, apenas pasando al 3er año pero con conocimientos basicos -> medios (para no exagerar) de programacion, programé en C# y Python (todo lo hago por hobby, no trabajo), y tuve que analizar un codigo en C. También conozco assembler para el microcontrolador PIC 16x84, asi que entender a grandes rasgos assembler de x86 no es una tarea muy complicada.

Introduccion al problema.
Hace poco se me dio la idea de intentar hacer un emulador de un juego online que me dio muchos vicios años atras (el juego aun sigue funcionando). Estas son las cosas que fui probando:
1- Obtener el source del cliente. Está escrito en C++ v6, y segun lei en internet es imposible decompilar. Descarté esta opcion.
2- Por la anterior, se me ocurrio que seria buena idea interceptar los paquetes y asi comenzar a hacer el emulador, viendo que datos eran enviados y como debia comportarse. ¿El problema? Los paquetes se encuentran cifrados.
3- Googleando me encontre con un pdf que explica bastante bien los caminos que hay que seguir para hacer un emulador http://cellframework.sourceforge.net/uploads/Introduction%20to%20Server%20Side%20Emulation.pdf (lo adjunto para alguien que este en mi misma situacion)
En ese pdf dicen que la mejor manera para comprender los paquetes es viendo como los descifra el cliente. Entonces segui mi camino con el OllyDBG, viendo tutoriales y haciendo pruebas hasta que pude dar con la sección del cliente que cifra el código (y pude obtener el algoritmo, a medias, pero ya lo tengo 'encerrado').

Situacion actual:
Como dije, logre dar con la parte del codigo que cifra el mensaje a ser enviado por el cliente. Por ahora solo probé mientras iniciaba sesión a mi cuenta, y logre ver la parte donde dice mi nombre de usuario y la contraseña, pero el resto del mensaje se ve con simbolos raros (el mensaje antes de cifrar se ve así, y despues obviamente por la encriptacion se ve raro), entonces mi duda es: ¿Puede ser que el mensaje que se envia no este codificado en ASCII y por ello se ve de esa manera? Lo digo porque el juego tengo entendido que esta hecho por taiwaneses, y entonces el codigo ASCII no puede mostrar los caracteres correctamente debido a que no tiene el alfabeto de esos lugares.
En el caso de que sea como lo planteo, ¿Conocen que tipo de codificacion?
Gracias!



MCKSys Argentina

Hola!

Por lo que leo, necesitas analizar más paquetes. Tu user y pass van plain en el login, y quizas es lo unico que va así. Quizás el resto sean parte de una estructura/checksums/etc.

Fijate que otros paquetes puedes interceptar y entender: si gastas X cantidad de dinero (o lo que sea), busca en el paquete el valor(es) y observa la estructura. Compárala con la anterior.

Toma varias muestras de paquetes e intenta ver qué contiene cada uno y comprara las estructuras para hallarle un formato.

Sinó, vas a tener que reversear el EXE para ver cuando arma el paquete y en base a eso, sacar el formato de la estructura (si es que tiene).

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


engel lex

por completar la idea de MCKSys Argentina (porque ya yo había escrito mi mensaje jejeje)

puede ser tan simple como que el paquete está construido optimamente, ej

datos del jugador:
128 bits: nombre jugador, perfectamente lo leerías como 16 ascii
128 bits: contraseña, igual que el anterior
32 bits: id jugador, esto serían 4 falsos ascii
fecha: (por decir cualquier locura de distribución)
13 bits: año (año entre 0 y 4095 es buen rango) leerías esto como 1 ascii y parte del segundo
4 bits: mes (entre 0 y 15) 3 bits de esto sería parte del falso ascii creado anteriormente y 1 bit de otro falso ascii
5 bits: día (entre 0 y 31) te queda un ascii a la mitad aún...


no se si entiendes el concepto que trato de explicar... ascii son forzosamente 8 bits, pero las variables no son siempre en ascii... te toca ver el paquete en binario a ver si te suena algo más e ir armando así... si ya llegaste a descompilar hasta ver el paquete, deberías buscar a ver cuales son las secciones en las que se divide
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

GonzaFz

#3
Cita de: MCKSys Argentina en 20 Enero 2015, 06:13 AM
Hola!

Por lo que leo, necesitas analizar más paquetes. Tu user y pass van plain en el login, y quizas es lo unico que va así. Quizás el resto sean parte de una estructura/checksums/etc.

Fijate que otros paquetes puedes interceptar y entender: si gastas X cantidad de dinero (o lo que sea), busca en el paquete el valor(es) y observa la estructura. Compárala con la anterior.

Toma varias muestras de paquetes e intenta ver qué contiene cada uno y comprara las estructuras para hallarle un formato.

Sinó, vas a tener que reversear el EXE para ver cuando arma el paquete y en base a eso, sacar el formato de la estructura (si es que tiene).

Saludos!

Yo pense en eso (y tambien lo vi en muchos tutoriales en internet) el tema es que no estoy tan seguro de que datos estan cifrados y cuales no (hoy cuando mandé un mensaje por chat, el mensaje se encriptaba).
Recien hice un par de compras por una cantidad y busque ese numero en los paquetes enviados (en hexadecimal) pero no lo encontre, tendria que ver en detalle otras formas en las que se pueden encontrar.
Voy a ver que me conviene mas, terminar de ver como se encriptan los paquetes asi hago mi propio sniffer (no se que tan dificil sera) y tengo toda la informacion en el mismo idioma, revisar el source en mayor profundidad viendo que se puede encontrar o ponerme a adivinar los paquetes..

Cita de: engel lex en 20 Enero 2015, 06:21 AM
por completar la idea de MCKSys Argentina (porque ya yo había escrito mi mensaje jejeje)

puede ser tan simple como que el paquete está construido optimamente, ej

datos del jugador:
128 bits: nombre jugador, perfectamente lo leerías como 16 ascii
128 bits: contraseña, igual que el anterior
32 bits: id jugador, esto serían 4 falsos ascii
fecha: (por decir cualquier locura de distribución)
13 bits: año (año entre 0 y 4095 es buen rango) leerías esto como 1 ascii y parte del segundo
4 bits: mes (entre 0 y 15) 3 bits de esto sería parte del falso ascii creado anteriormente y 1 bit de otro falso ascii
5 bits: día (entre 0 y 31) te queda un ascii a la mitad aún...


no se si entiendes el concepto que trato de explicar... ascii son forzosamente 8 bits, pero las variables no son siempre en ascii... te toca ver el paquete en binario a ver si te suena algo más e ir armando así... si ya llegaste a descompilar hasta ver el paquete, deberías buscar a ver cuales son las secciones en las que se divide

Ah si! Te entiendo, y me di cuenta que fui un tonto al pensar que realmente estarían identificados con palabras de algún idioma  :silbar:

Gracias la ayuda :P!

GonzaFz

Coloque un Breakpoint en un punto donde se decide entrar o no a la "funcion" donde se realiza al encriptacion y vi que la unica vez que saltaba era cuando estaba en la pantalla donde se selecciona el personaje. Luego cuando realizaba una compra o utilizo un poder, se cifra.
Tambien compre varias veces el mismo item en misma cantidad y logre dar con la posicion de memoria donde se almacena la cantidad, vi que esta en hexadecimal, pero cuando la modifico y sigo corriendo el programa (luego viene la encriptacion del mensaje), al parecer, el servidor detecta una anomalia en el paquete y me desconecta del servidor, asi que supongo que sera como dice MCKSys, debe haber un checksum en alguna parte.

Lastimosamente ahora no tengo mucho tiempo pero cuando lo tenga voy a seguir revisando el código para ver en que parte se produce el checksum.