Exemple #1
0
 def get_packet_header(self, length):
     iiv = self.send[3] & 0xFF
     iiv |= (self.send[2] << 8) & 0xFF00
     iiv ^= self.send_mapleversion
     mlength = ((length << 8) & 0xFF00) | (BitUtils.unsigned_right_shift(length, 8))
     xoredIv = iiv ^ mlength
     return [
         BitUtils.unsigned_right_shift(iiv, 8) & 0xFF,
         iiv & 0xFF,
         (BitUtils.unsigned_right_shift(xoredIv, 8) & 0xFF),
         xoredIv & 0xFF,
     ]
Exemple #2
0
 def rotate(self, input_byte, arr):
     elina = arr[1]
     anna = input_byte
     moritz = update_matrix[elina & 0xFF]
     moritz -= input_byte
     arr[0] += moritz
     moritz = arr[2]
     moritz ^= update_matrix[(int(anna) & 0xFF)]
     elina -= int(moritz) & 0xFF
     arr[1] = elina
     elina = arr[3]
     moritz = elina
     elina -= int(arr[0] & 0xFF)
     moritz = update_matrix[int(moritz & 0xFF)]
     moritz += input_byte
     moritz ^= arr[2]
     arr[2] = moritz
     elina += int(update_matrix[int(anna) & 0xFF]) & 0xFF
     arr[3] = elina
     merry = int(arr[0]) & 0xFF
     merry |= (arr[1] << 8) & 0xFF00
     merry |= (arr[2] << 16) & 0xFF0000
     merry |= (arr[3] << 24) & 0xFF000000
     ret_value = merry
     ret_value = BitUtils.unsigned_right_shift(ret_value, 0x1D)
     merry = merry << 3
     ret_value = ret_value | merry
     arr[0] = ret_value & 0xFF
     arr[1] = (ret_value >> 8) & 0xFF
     arr[2] = (ret_value >> 16) & 0xFF
     arr[3] = (ret_value >> 24) & 0xFF
     return True
Exemple #3
0
    def decode(self, data):
        data = self.maple_aes(data, self.receive)
        self.decodeUpdate()

        # Maple Custom Decryption
        for j in range(1, 7):
            remember = 0
            data_length = len(data) & 0xFF
            next_remember = 0
            if j % 2 == 0:
                for i in xrange(len(data)):
                    cur = data[i]
                    cur -= 0x48
                    cur = ~cur & 0xFF
                    cur = BitUtils.roll_left(cur, data_length & 0xFF)
                    next_remember = cur
                    cur ^= remember
                    remember = next_remember
                    cur -= data_length
                    cur = BitUtils.roll_right(cur, 3)
                    data[i] = cur
                    data_length -= 1
            else:
                for i in reversed(xrange(len(data))):
                    cur = data[i]
                    cur = BitUtils.roll_left(cur, 3)
                    cur ^= 0x13
                    next_remember = cur
                    cur ^= remember
                    remember = next_remember
                    cur -= data_length
                    cur = BitUtils.roll_right(cur, 4)
                    data[i] = cur
                    data_length -= 1

        return struct.pack("<%sB" % len(data), data)
Exemple #4
0
    def encode(self, data):
        header = self.get_packet_header(len(data))
        # Maple custom encryption
        for j in xrange(0, 6):
            remember = 0
            data_length = len(data) & 0xFF
            if j % 2 == 0:
                for i in xrange(len(data)):
                    cur = data[i]
                    cur = BitUtils.roll_left(cur, 3)
                    cur += data_length
                    cur ^= remember
                    remember = cur
                    cur = BitUtils.roll_right(cur, data_length & 0xFF)
                    cur = ~cur & 0xFF
                    cur += 0x48
                    data_length -= 1
                    data[i] = cur
            else:
                for i in reversed(xrange(len(data))):
                    cur = data[i]
                    cur = BitUtils.roll_left(cur, 4)
                    cur += data_length
                    cur ^= remember
                    remember = cur
                    cur ^= 0x13
                    cur = BitUtils.roll_right(cur, 3)
                    data_length -= 1
                    data[i] = cur

        print "After custom ", data

        data = self.maple_aes(data, self.send)
        print "After aes ", data
        self.encodeUpdate()
        return header + data