My kemenworld…

To mock or not to mock…

El misterio del Messenger User ID en MSN 7.x

Posted by kementeus en octubre 4, 2007

Hace un tiempo mi novia me pregunto cómo hacer un backup de los emoticons en el messenger, dispuesto a averiguarlo decidí buscar en mi Windows donde guardaba los emoticons y datos similares.

Dando vueltas encontré la carpeta en cuestión (quizás en otra entrada les diga donde es) y revisé que efectivamente estan todos los datos de usuario en ese lugar. Me topé con la característica que hay un monton de carpetas o directorios con un número en específico. Interesante, como lo sospeche se trataba de un Hash numérico del nombre de passport del usuario, número el cual el Messenger utiliza para varios menesteres, entre esos el crear la carpeta para guardar emoticons, winks, fondos y similares.

Aunque encontre cual era la carpeta en mi computadora para mi usuario passport mi siguiente pregunta y reto era como transformar de un nombre passport a un Hash de usuario de Messenger (digo de esta manera y no al revés ya que quien está familiarizado con los Hashes como md5 sabran que se puede de una via, no de ambas; bueno, en realidad se puede con análisis numérico pero esos son otros veinte pesos).

Luego de mucho tiempo de estar buscando en internet y evitar las típicas páginas de idioteces como “baja tu emoticon” y foros de usuarios sin sentido llegue a un lugar donde explicaban en VC++ code como crear el hash, con editor en mano y mi Python 2.5 decidí crear la clase que se encargara de eso. Me topo con el primer inconveniente y la primera idiotes a mi parecer que tiene el algoritmo del que llamaré el “Hash de Messenger”, el algoritmo usa y depende de overflow de los números. Para quien no está acostumbrado a cosas como estas es cuando por ejemplo trato de meter un número de punto flotante en un entero, como recordaran un entero usa menos espacio que un número de punto flotante por lo tanto en el entero solo entraran ciertos bits del número de punto flotante. En lenguajes como C/C++/C# es relativamente sencillo ya que se pueden hacer overflows de números de forma sencilla y el compilador se encarga de todo, el problema es q en lenguajes de scripting donde no son tipificados la variable automáticamente se adapta a la nueva longitud del valor.

Bueno, con esto en mano decidí crear una mi solución sencilla que quizás a alguien más le pueda servir en el caso de emular overflows de números en Python, Ruby o inclusive PHP y Java (en este último a pesar de ser fuertemente tipificado si se trata de hacer el overflow obtendremos una excepción).

def overflow(number) :

if number > 4294967296 : return number % 4294967296 return long(number) class UserID : __passport = None def __init__(self, passport) : self.__passport = passport.lower() def getHash(self) : sum = long(0) for item in self.__passport : buffer = sum * 101 buffer += ord(item) sum = overflow(buffer) return sum if __name__ == '__main__' : passport = UserID('someuser@hotmail.com') print passport.getHash()

En realidad este post tenía ya su tiempo, así que dije “hey, publiquemos un clásico”.😛 espero les guste

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: