def block_list_packet(context, data): data = bytearray(data) print("[BlockList] Got block list! Updating local cache and rewriting packet...") # Jump to 0x28, 0x88 sep pos = 0x1C while pos < len(data) and data[pos] != 0: name = data[pos:pos + 0x40].decode('utf-16le') o1, o2, o3, o4, port = struct.unpack_from('BBBBH', buffer(data), pos + 0x40) ip_string = "%i.%i.%i.%i" % (o1, o2, o3, o4) if context.peer.transport.getHost().port > 12999: port += 1000 if port not in blocks.blockList: if verbose: print("[BlockList] Discovered new block %s at address %s:%i! Recording..." % (name, ip_string, port)) blocks.blockList[port] = (ip_string, name) if bNameMode == 0: block_string = ("%s%s:%i" % (name[:6], ip_string, port)).encode('utf-16le') struct.pack_into('%is' % len(block_string), data, pos, block_string) if len(block_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(block_string)), data, pos + len(block_string)) elif bNameMode == 1: enname = replace_with_table(name, config.blockNames.items()) block_string = enname.encode('utf-16le') struct.pack_into('%is' % len(block_string), data, pos, block_string) if len(block_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(block_string)), data, pos + len(block_string)) struct.pack_into('BBBB', data, pos + 0x40, int(i0), int(i1), int(i2), int(i3)) pos += 0xE8 return str(data)
def login_confirmation_packet(context, data): data = bytearray(data) return str(data) string_length = (struct.unpack_from('<I', buffer(data), 0xC)[0] ^ 0x8BA4) - 0xB6 if string_length > 0: return str(data) block_port = context.peer.transport.getHost().port if block_port in blocks.blockList: block_info = blocks.blockList[block_port] if bNameMode == 0: address_string = ('%s%s:%i' % ((block_info[1])[:6], block_info[0], block_port)).encode('utf-16le') struct.pack_into('%is' % len(address_string), data, 0x1C, address_string) if len(address_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(address_string)), data, 0x1C + len(address_string)) elif bNameMode == 1: enname = replace_with_table((block_info[1]), config.blockNames.items()) address_string = enname.encode('utf-16le') struct.pack_into('%is' % len(address_string), data, 0x1C, address_string) if len(address_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(address_string)), data, 0x1C + len(address_string)) player_id = struct.unpack_from( "<I", buffer(data), 0x10)[0] # Should be at the same place as long as the string is empty. context.playerId = player_id return str(data)
def block_list_packet(context, data): data = bytearray(data) print("[BlockList] Got block list! Updating local cache and rewriting packet...") # Jump to 0x28, 0x88 sep pos = 0x1C while pos < len(data) and data[pos] != 0: name = data[pos:pos + 0x40].decode('utf-16le') o1, o2, o3, o4, port = struct.unpack_from('BBBBH', buffer(data), pos + 0x40) ip_string = "%i.%i.%i.%i" % (o1, o2, o3, o4) if context.peer.transport.getHost().port > 12999: port += 1000 if port not in blocks.blockList: if verbose: print("[BlockList] Discovered new block %s at address %s:%i! Recording..." % (name, ip_string, port)) blocks.blockList[port] = (ip_string, name) if bNameMode == 0: block_string = ("%s%s:%i" % (name[:6], ip_string, port)).encode('utf-16le') struct.pack_into('%is' % len(block_string), data, pos, block_string) if len(block_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(block_string)), data, pos + len(block_string)) elif bNameMode == 1: enname = replace_with_table(name, config.blockNames.items()) block_string = enname.encode('utf-16le') struct.pack_into('%is' % len(block_string), data, pos, block_string) if len(block_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(block_string)), data, pos + len(block_string)) struct.pack_into('BBBB', data, pos + 0x40, int(i0), int(i1), int(i2), int(i3)) pos += 0x68 return str(data)
def login_confirmation_packet(context, data): data = bytearray(data) return str(data) string_length = (struct.unpack_from('<I', buffer(data), 0xC)[0] ^ 0x8BA4) - 0xB6 if string_length > 0: return str(data) block_port = context.peer.transport.getHost().port if block_port in blocks.blockList: block_info = blocks.blockList[block_port] if bNameMode == 0: address_string = ('%s%s:%i' % ((block_info[1])[:6], block_info[0], block_port)).encode('utf-16le') struct.pack_into('%is' % len(address_string), data, 0x1C, address_string) if len(address_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(address_string)), data, 0x1C + len(address_string)) elif bNameMode == 1: enname = replace_with_table((block_info[1]), config.blockNames.items()) address_string = enname.encode('utf-16le') struct.pack_into('%is' % len(address_string), data, 0x1C, address_string) if len(address_string) < 0x40: struct.pack_into('%ix' % (0x40 - len(address_string)), data, 0x1C + len(address_string)) player_id = struct.unpack_from("<I", buffer(data), 0x10)[0] # Should be at the same place as long as the string is empty. context.playerId = player_id return str(data)