Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - GonzaFz

#21
Olvide de decir que tipo de juego es  ;D
Es un MMORPG (se llama Angels online, o Angels Love Online en la version de taiwan)

Dije 10.000 por tirar un numero, hacer un servidor que solo soporte hasta 100 conexiones y lanzarlo como un "estable" no tiene mucho sentido, no tendra futuro..
Con 10.000 plazas creo que está mas que hecho.. (el juego tiene un sistema donde un servidor se divide nuevamente en X sub-servidores, siendo que podes conectarte a otra ip manteniendo tu cuenta)

Te mando un MP para hablar sobre los emuladores  ;-)

¿Por que tendria que modificar el juego?
La ip de conexion estan en un archivo .xml en la carpeta raiz, muy facil de modificar, y la clave de encriptacion la tengo, me falta determinar de donde sale la de desencriptación (que la tengo en la mira) y comenzar a trabajar en el emulador.

#22
Temía por eso, entonces creo que tendré que usar a python para hacer el prototipo y luego cuando ya este todo bien formado pasar a C/C++.

Muchas gracias
#23
Buenas a todos. Estoy en el proceso de armar un emulador del servidor de un juego (aclaro que no existe ninguno de dicho juego, estoy con la ingenieria inversa). El progreso recién es casi del 2%, lo único que tengo por ahora son datos mínimos que si los uso bien, podre hacer el resto.
Entonces quería comenzar a desarrollar el servidor para ir armando una estructura base e ir probando los paquetes que ya los conozco.

Mi duda es si Python funcionara como lenguaje para emular el servidor o tendré que mirar para otro lado (Pense en C# pero no me gusta la sintaxis).

Yo creo que el servidor, con soportar hasta 10.000 personajes, es susficiente (y estoy exagerando).

No es que elija Python por que es multiplataforma, solo lo hago porque me gusta la sintaxis.

¿Creen que funcionará?

#24
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.
#25
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!
#26
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!


#27
La DB es MySQL.
Si, obviamente la voy a cifrar con algun codigo que traiga el .NET.

Muchas gracias por la información, supuse que no seria tan dificil entrar a la base de datos porque encima estara en localhost asi que todos los datos los tendras a mano...
Pero bueno la voy a cifrar para que no quede demasiado facil..

Y en el caso de hacer un único usuario de ingreso al programa pero que se pueda llegar a cambiar algun dia la contraseña (asi que no puedo ponerla en el codigo del programa) sería lo mismo, no?
Gracias ;)
#28
Estoy por desarrollar una aplicación que debe conectarse a una bases de datos, por cuestiones de que algún día se quiera hacer un cambio quiero hacer que desde dentro del programa uno pueda cambiar la conexión. Mi duda es donde puedo almacenar los datos de dicha conexión..
El problema es que no se donde almacenar los datos de la conexion, puesto que si los guardo en un .txt cualquiera podria leerlos y ver la contraseña.
Pensé en encriptarlos pero ponerlos a la vista en un archivo también seria algo suicida, entonces me gustaría si me pudiesen dar recomendaciones..

Esto tambien aplica a otra duda que tengo que es tener una unica cuenta para ingresar al programa, si fuesen muchas sería facil y solo utilizaria una base de datos, pero usar una db para una cuenta no tiene sentido.. Si tienen algunas ideas ?
#29
Quizas si me convenga utilizar clases para algunas cosas como la verificacion del usuario asi me ahorro bastante..

Mira pero no entiendo como hacer eso de la session =/!
Mi login es:
Código (php) [Seleccionar]
<?php
require_once('config.php');

$username $_POST['username'];
$password $_POST['password'];

if(isset(
$_POST['ingresar'])) {
$query mysql_query("SELECT * FROM usuarios WHERE nick='".$username."' and pass='".$password."'");
if(
mysql_num_rows($query) > 0){
     echo 
"Bienvenido $username";
   
}else{
     echo 
"Error";
}
}
?>


Y quiero que una vez logueado entonces su rango se guarde en el config o de alguna otra forma para que sea mas facil verificar y comprobar su nivel..

Muchas gracias por tu ayuda =).


EDITO:

Logre hacer que la session funcionara.. Coloco session_start() al inicio de cada pagina donde la necesito y luego llamo a las sesiones..
Ahora tengo un problema, cuando quiero obtener el "rango" de mi usuario, en vez de devolverme 4 que es el que tengo (en la bd cree un int llamado nivel) me devuelve 0.. Lo hago de esta forma:
Código (php) [Seleccionar]
<?php
session_start
();
require_once(
'config.php');

// Iniciamos
$username $_POST['username'];
$password $_POST['password'];

if(isset(
$_POST['ingresar'])) {
$query mysql_query("SELECT * FROM usuarios WHERE nick='".$username."' and pass='".$password."'");
if(
mysql_num_rows($query) > 0){
     
$rango mysql_query("SELECT nivel FROM usuarios WHERE nick='".$username."'");
     
$_SESSION['usuario'] = $username;
     
$_SESSION['nivel'] = $rango;
     


echo 
'<script language="javascript">window.location.href = "index.php";</script>';
   
}else{
     echo 
'<script language="javascript">window.location.href = "index.php";</script>';
}
 }

?>


Lo raro de todo esto es que username si me devuelve mi nick (varchar) pero rango solo me devuelve 0 (en la bd nivel es un int)..

Ahora encima me di cuenta que si debajo de las asignaciones a los $_SESSION hago mostrar $rango en un echo me devuelve :
tu rango es Resource id #6 ... No entiendo que esta mal en el llamado a la base de datos..


VUELVO A EDITAR:
Segun lei era porque estaba haciendo nuevamente un llamado por un dato que ya lo tengo..
Bueno la solucion es esta:
Código (php) [Seleccionar]
$query = mysql_query("SELECT * FROM usuarios WHERE nick='".$username."' and pass='".$password."'");
$datos = mysql_fetch_assoc($query);
$rango = $datos['nivel'];
$usuario = $datos['nick'];
        $_SESSION['nivel'] = $rango;
        $_SESSION['usuario'] = $usuario;

Ahora me queda otra duda.. Esta bien esta comprobacion de que el usuario y contraseña es correcto?
Código (php) [Seleccionar]
$query = mysql_query("SELECT * FROM usuarios WHERE nick='".$username."' and pass='".$password."'");

if(mysql_num_rows($query) > 0){

o es algo primitiva?

#30
Estoy haciendo un proyecto en el que necesito un sistema de registro de usuarios y estoy elaborando el mio...
Tengo dos cositas que me hacen dudar mucho, la primera es que al tener rangos debo comprobarlos antes de mostrar cada sitio web pero seria molesto tener que agregar en cada pagina el llamado a la base de datos, la comprobacion y la devolucion del resultado.
Siguiendo esta guia:
http://www.phperos.net/foro/index.php?topic=2129.0
Veo que el que la hizo agrego la comprobacion en el config.php, pero cuando yo lo utilizo no me funciona..
Código (php) [Seleccionar]
<?php
// Config.php es la página que nos va a conectar al Servidor y luego a la Base de Datos
$hostname 'TU_HOST'// Host (generalmente es localhost)
$user 'TU_USER'// Usuario de la base de datos (por defecto en MySQL es root)
$pass 'PASSWORD'// Contraseña de la base de datos (por defecto en MySQL se deja en blanco)
$dbnombre 'BASEDEDATOS'// Nombre de la Base de Datos en la que vas a trabajar  devuelve atrás
$rango $_SESSION["nivel"];

 
mysql_connect($hostname$user$pass);
 
mysql_select_db($dbnombre);

// Aqui comenzamos la sesión
session_start();
// Funciones
if($rango == 2) {

$rango 'Moderador Global';
}

elseif(
$rango == 1) {

$rango 'Administrador';
}

elseif(
$rango == 3) {

$rango 'Moderador';
}

elseif(
$rango == 4) {

$rango 'Usuario';
}

?>


Si lo utilizo asi me dice: Notice: Undefined index: nivel in C:\xampp\.... Es tipo que no reconoce lo que esta dentro de $_SESSION['nivel']; lo que me hace pensar que no estoy utilizando correctamente...
O si tienen alguna forma que sea mas facil agradeceria.
Se que debo comprobar en cada pagina pero quiero ahorrarme tener que poner muchas lineas de codigo..

Y otra cosa, que tipo de seguridad puedo implementar al sistema para que no lo jodan? Es decir que recomiendan ustedes.