Пример #1
0
    def test_sync_word_finding_varying_message_length(self):
        hex_messages = [
            "aaaa9a7d0f1337471100009a44ebdd13517bf9",
            "aaaa9a7d4747111337000134a4473c002b909630b11df37e34728c79c60396176aff2b5384e82f31511581d0cbb4822ad1b6734e2372ad5cf4af4c9d6b067e5f7ec359ec443c3b5ddc7a9e",
            "aaaa9a7d0f13374711000205ee081d26c86b8c",
            "aaaa9a7d474711133700037cae4cda789885f88f5fb29adc9acf954cb2850b9d94e7f3b009347c466790e89f2bcd728987d4670690861bbaa120f71f14d4ef8dc738a6d7c30e7d2143c267",
            "aaaa9a7d0f133747110004c2906142300427f3"
        ]

        messages = [
            Message.from_plain_hex_str(hex_msg) for hex_msg in hex_messages
        ]
        for i in range(1, len(messages)):
            messages[i].message_type = messages[0].message_type

        ff = FormatFinder(messages)
        ff.run()

        self.assertEqual(len(ff.message_types), 1)
        preamble = ff.message_types[0].get_first_label_with_type(
            FieldType.Function.PREAMBLE)
        self.assertEqual(preamble.start, 0)
        self.assertEqual(preamble.length, 16)

        sync = ff.message_types[0].get_first_label_with_type(
            FieldType.Function.SYNC)
        self.assertEqual(sync.start, 16)
        self.assertEqual(sync.length, 16)
Пример #2
0
    def test_multiple_sync_words(self):
        hex_messages = [
            "aaS1234",
            "aaScafe",
            "aaSdead",
            "aaSbeef",
        ]

        for i in range(1, 256):
            messages = []
            sync = "{0:02x}".format(i)
            if sync.startswith("a"):
                continue

            for msg in hex_messages:
                messages.append(
                    Message.from_plain_hex_str(msg.replace("S", sync)))

            for i in range(1, len(messages)):
                messages[i].message_type = messages[0].message_type

            ff = FormatFinder(messages)
            ff.run()

            self.assertEqual(len(ff.message_types), 1, msg=sync)

            preamble = ff.message_types[0].get_first_label_with_type(
                FieldType.Function.PREAMBLE)
            self.assertEqual(preamble.start, 0, msg=sync)
            self.assertEqual(preamble.length, 8, msg=sync)

            sync = ff.message_types[0].get_first_label_with_type(
                FieldType.Function.SYNC)
            self.assertEqual(sync.start, 8, msg=sync)
            self.assertEqual(sync.length, 8, msg=sync)
Пример #3
0
    def test_protocol_with_acks_and_checksum(self):
        proto_file = get_path_for_data_file("ack_frames_with_crc.proto.xml")
        protocol = ProtocolAnalyzer(signal=None, filename=proto_file)
        protocol.from_xml_file(filename=proto_file, read_bits=True)

        self.clear_message_types(protocol.messages)

        ff = FormatFinder(protocol.messages)
        ff.known_participant_addresses.clear()

        ff.run()
        self.assertEqual(
            util.convert_numbers_to_hex_string(
                ff.known_participant_addresses[0]), "1337")
        self.assertEqual(
            util.convert_numbers_to_hex_string(
                ff.known_participant_addresses[1]), "4711")

        for mt in ff.message_types:
            preamble = mt.get_first_label_with_type(
                FieldType.Function.PREAMBLE)
            self.assertEqual(preamble.start, 0)
            self.assertEqual(preamble.length, 16)
            sync = mt.get_first_label_with_type(FieldType.Function.SYNC)
            self.assertEqual(sync.start, 16)
            self.assertEqual(sync.length, 16)
            length = mt.get_first_label_with_type(FieldType.Function.LENGTH)
            self.assertEqual(length.start, 32)
            self.assertEqual(length.length, 8)
Пример #4
0
    def test_find_generated_crc16(self):
        mb = MessageTypeBuilder("data")
        mb.add_label(FieldType.Function.PREAMBLE, 8)
        mb.add_label(FieldType.Function.SYNC, 16)
        mb.add_label(FieldType.Function.LENGTH, 8)
        mb.add_label(FieldType.Function.DATA, 32)
        mb.add_checksum_label(16, GenericCRC.from_standard_checksum("CRC16 CCITT"))

        mb2 = MessageTypeBuilder("data2")
        mb2.add_label(FieldType.Function.PREAMBLE, 8)
        mb2.add_label(FieldType.Function.SYNC, 16)
        mb2.add_label(FieldType.Function.LENGTH, 8)
        mb2.add_label(FieldType.Function.DATA, 16)

        mb2.add_checksum_label(16, GenericCRC.from_standard_checksum("CRC16 CCITT"))

        pg = ProtocolGenerator([mb.message_type, mb2.message_type], syncs_by_mt={mb.message_type: "0x1234", mb2.message_type: "0x1234"})

        num_messages = 5

        for i in range(num_messages):
            pg.generate_message(data="{0:032b}".format(i), message_type=mb.message_type)
            pg.generate_message(data="{0:016b}".format(i), message_type=mb2.message_type)

        #self.save_protocol("crc16_test", pg)
        self.clear_message_types(pg.protocol.messages)

        ff = FormatFinder(pg.protocol.messages)
        ff.run()

        self.assertEqual(len(ff.message_types), 2)
        for mt in ff.message_types:
            checksum_label = mt.get_first_label_with_type(FieldType.Function.CHECKSUM)
            self.assertEqual(checksum_label.length, 16)
            self.assertEqual(checksum_label.checksum.caption, "CRC16 CCITT")
Пример #5
0
    def run_format_finder_for_protocol(protocol: ProtocolAnalyzer):
        ff = FormatFinder(protocol.messages)
        ff.known_participant_addresses.clear()
        ff.run()

        for msg_type, indices in ff.existing_message_types.items():
            for i in indices:
                protocol.messages[i].message_type = msg_type
Пример #6
0
    def auto_assign_labels(self):
        from urh.awre.FormatFinder import FormatFinder
        format_finder = FormatFinder(self.messages)
        format_finder.run(max_iterations=10)

        self.message_types[:] = format_finder.message_types
        for msg_type, indices in format_finder.existing_message_types.items():
            for i in indices:
                self.messages[i].message_type = msg_type
Пример #7
0
    def test_without_preamble(self):
        alice = Participant("Alice", address_hex="24")
        broadcast = Participant("Broadcast", address_hex="ff")

        mb = MessageTypeBuilder("data")
        mb.add_label(FieldType.Function.SYNC, 16)
        mb.add_label(FieldType.Function.LENGTH, 8)
        mb.add_label(FieldType.Function.SRC_ADDRESS, 8)
        mb.add_label(FieldType.Function.SEQUENCE_NUMBER, 8)

        pg = ProtocolGenerator([mb.message_type],
                               syncs_by_mt={mb.message_type: "0x8e88"},
                               preambles_by_mt={mb.message_type: "10" * 8},
                               participants=[alice, broadcast])

        for i in range(20):
            data_bits = 16 if i % 2 == 0 else 32
            source = pg.participants[i % 2]
            destination = pg.participants[(i + 1) % 2]
            pg.generate_message(data="1010" * (data_bits // 4),
                                source=source,
                                destination=destination)

        #self.save_protocol("without_preamble", pg)
        self.clear_message_types(pg.messages)
        ff = FormatFinder(pg.messages)
        ff.known_participant_addresses.clear()

        ff.run()
        self.assertEqual(len(ff.message_types), 1)

        mt = ff.message_types[0]
        sync = mt.get_first_label_with_type(FieldType.Function.SYNC)
        self.assertEqual(sync.start, 0)
        self.assertEqual(sync.length, 16)

        length = mt.get_first_label_with_type(FieldType.Function.LENGTH)
        self.assertEqual(length.start, 16)
        self.assertEqual(length.length, 8)

        dst = mt.get_first_label_with_type(FieldType.Function.SRC_ADDRESS)
        self.assertEqual(dst.start, 24)
        self.assertEqual(dst.length, 8)

        seq = mt.get_first_label_with_type(FieldType.Function.SEQUENCE_NUMBER)
        self.assertEqual(seq.start, 32)
        self.assertEqual(seq.length, 8)
Пример #8
0
    def test_three_participants_with_ack(self):
        alice = Participant("Alice", address_hex="1337")
        bob = Participant("Bob", address_hex="4711")
        carl = Participant("Carl", address_hex="cafe")

        mb = MessageTypeBuilder("data")
        mb.add_label(FieldType.Function.PREAMBLE, 16)
        mb.add_label(FieldType.Function.SYNC, 16)
        mb.add_label(FieldType.Function.LENGTH, 8)
        mb.add_label(FieldType.Function.SRC_ADDRESS, 16)
        mb.add_label(FieldType.Function.DST_ADDRESS, 16)
        mb.add_label(FieldType.Function.SEQUENCE_NUMBER, 16)

        mb_ack = MessageTypeBuilder("ack")
        mb_ack.add_label(FieldType.Function.PREAMBLE, 16)
        mb_ack.add_label(FieldType.Function.SYNC, 16)
        mb_ack.add_label(FieldType.Function.LENGTH, 8)
        mb_ack.add_label(FieldType.Function.DST_ADDRESS, 16)

        pg = ProtocolGenerator([mb.message_type, mb_ack.message_type],
                               syncs_by_mt={
                                   mb.message_type: "0x9a7d",
                                   mb_ack.message_type: "0x9a7d"
                               },
                               preambles_by_mt={
                                   mb.message_type: "10" * 8,
                                   mb_ack.message_type: "10" * 8
                               },
                               participants=[alice, bob, carl])

        i = -1
        while len(pg.protocol.messages) < 20:
            i += 1
            source = pg.participants[i % len(pg.participants)]
            destination = pg.participants[(i + 1) % len(pg.participants)]
            if i % 2 == 0:
                data_bytes = 8
            else:
                data_bytes = 16

            data = "".join(
                random.choice(["0", "1"]) for _ in range(data_bytes * 8))
            pg.generate_message(data=data,
                                source=source,
                                destination=destination)

            if "ack" in (msg_type.name
                         for msg_type in pg.protocol.message_types):
                pg.generate_message(message_type=1,
                                    data="",
                                    source=destination,
                                    destination=source)

        self.clear_message_types(pg.protocol.messages)
        ff = FormatFinder(pg.protocol.messages)
        ff.known_participant_addresses.clear()
        self.assertEqual(len(ff.known_participant_addresses), 0)
        ff.run()

        # Since there are ACKS in this protocol, the engine must be able to assign the correct participant addresses
        # IN CORRECT ORDER!
        self.assertEqual(
            util.convert_numbers_to_hex_string(
                ff.known_participant_addresses[0]), "1337")
        self.assertEqual(
            util.convert_numbers_to_hex_string(
                ff.known_participant_addresses[1]), "4711")
        self.assertEqual(
            util.convert_numbers_to_hex_string(
                ff.known_participant_addresses[2]), "cafe")