Kementeus Blog

Bienvenidos a kementulandia!

Wednesday, October 18, 2006

El misterio del Messenger User ID

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()

Lastimosamente no he encontrado aun la forma en que blogger pueda crear bonitas entradas para código fuente con resaltado y similares a las que existe en pasteit (http://www.rafb.net/paste) o bueno, quizas un dia encuentre como hacerlo :P

Otro día les publico o explico como hacer el backup de los emoticons y similares, aun no decido si sigo haciendo mi programita en Python :P

Saludos

Labels: ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home