import socket from struct import * from random import random from select import select def get_hex(data): return "".join([hex(ord(c))[2:].zfill(2) for c in data]) host = "localhost" port = 2222 def gen_auth(username, password): length = 4 + 1 + len(username) + 1 + len(password) + 1 data = pack("!LB", length, 0x00) data += username data += "\0" data += password data += "\0" return data def gen_update_location(token, username, lat, lng): length = 4 + 1 + 32 + 8 + 8 + len(username) + 1 data = pack("!LB32s", length, 0x01, token) data += username data += chr(0) data += pack("!dd", lat, lng) return data def gen_request_location(token, username, gid): length = 4 + 1 + 32 + 4 + len(username) + 1 data = pack("!LB32s", length, 0x02, token) data += username data += chr(0) data += pack("!L", gid) return data def gen_request_user_info(token, username, uid): length = 4 + 1 + 32 + len(username) + 1 + 4 data = pack("!LB32s", length, 0x03, token) data += username data += chr(0) data += pack("!L", uid) return data def send(data): received = bytes() try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) #print len(data) sock.sendall(data) while True: rd, wr, err = select([sock], [], [], 10) if rd: buff = sock.recv(4096) if len(buff) == 0: break received += buff else: break finally: sock.close() return received from sys import argv username = "hello" password = "world" #username = "1234567890123456789012" #password = "world12345678901234567890" gid = 1 failed_cnt = 0 if len(argv) == 2: host = argv[1] if len(argv) == 3: username = argv[1] password = argv[2] for i in xrange(10): resp = send(gen_auth(username, password)) try: pl, optcode, status, uid, token = unpack("!LBBL32s", resp) except: print "fuck1" failed_cnt += 1 continue if pl != len(resp): print "God!" # print "size: " + str((pl, len(resp))) # print "opt: " + str(optcode) # print "status: " + str(status) # print "uid: " + str(uid) # print "token: " + get_hex(token) resp = send(gen_update_location(token, username, random(), random())) try: pl, optcode, status = unpack("!LBB", resp) except: print "fuck2" if pl != len(resp): print "God!" # print "size: " + str((pl, len(resp))) # print "opt: " + str(optcode) # print "status: " + str(status) resp = send(gen_request_location(token, username, gid)) try: pl, optcode, status = unpack("!LBB", resp[:6]) except: print "fuck3" if pl != len(resp): print "God!" # print "size: " + str((pl, len(resp))) idx = 6 # print "length: " + str(len(resp[6:])) try: while idx < pl: # print len(resp[idx:idx + 20]) uid, lat, lng = unpack("!Ldd", resp[idx:idx + 20]) idx += 20 except: print "fuck4" # print (uid, lat, lng) resp = send(gen_request_user_info(token, username, uid)) try: pl, optcode, status = unpack("!LBB", resp[:6]) except: print "fuck5" if pl != len(resp): print "God!" # print "size: " + str((pl, len(resp))) idx = 6 try: while idx < pl: info_key, = unpack("!B", resp[idx:idx + 1]) idx += 1 # print info_key if info_key == 0x00: info_value, = unpack("!L", resp[idx:idx + 4]) idx += 4 elif info_key == 0x01: info_value, = unpack("!B", resp[idx:idx + 1]) idx += 1 # print (info_key, info_value) except: print "fuck6" from time import sleep sleep(10) print failed_cnt