Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)