Пример #1
0
 def test_set_name_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "name_offset"), False)
     sect = sect.prepare(0, 0, 5, 32, "<")
     self.assertEqual(sect.name_offset, 5)
     sect.name_offset = 25
     self.assertEqual(sect.name_offset, 25)
Пример #2
0
 def test_set_name_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "name_offset"), False)
     sect = sect.prepare(0, 0, 5, 32, '<')
     self.assertEqual(sect.name_offset, 5)
     sect.name_offset = 25
     self.assertEqual(sect.name_offset, 25)
Пример #3
0
    def test_remove_nobits(self):
        for file_name in ["data/null_elf",
                          "data/arm_exec",
                          "data/arm_stripped_exec",
                          "data/arm_exec_nosect",
                          "data/arm_object",
                          "data/mips64_exec",
                          "data/mips32_exec",
                          "data/ia32_exec",
                          "data/amd64_exec",
                          "data/ia64_exec",
                          ]:
            ef = PreparedElfFile(filename=file_name)
            if ef.segments:
                seg_sizes = []
                for segment in ef.segments:
                    seg_sizes.append((segment.get_memsz(), segment.get_filesz()))
                ef.remove_nobits()
                for segment, seg_size in zip(ef.segments, seg_sizes):
                    self.assertEqual(segment.get_memsz(), segment.get_filesz())
                    self.assertEqual(segment.get_memsz(), seg_size[0])

        ef = UnpreparedElfFile()
        sec = UnpreparedElfSection(None, section_type=SHT_NOBITS, data=10)
        self.assertEqual(sec.get_size(), 10)
        ef.add_section(sec)
        ef.remove_nobits()
        sec = ef.sections[1]
        self.assertEqual(sec.type, SHT_PROGBITS)
        self.assertEqual(sec.get_size(), 10)
        self.assertEqual(sec.get_file_data(), ByteArray('\0' * 10))
Пример #4
0
    def test_copy(self):
        sect = BaseElfSection("test")
        self.assertRaises(NotImplementedError, sect.copy)

        sect = UnpreparedElfSection("test")
        new_sect = sect.copy()
        self.assertEquals(sect.name, new_sect.name)

        prep_sect = sect.prepare(0, 0, 0, 32, '<')
        new_sect = prep_sect.copy()
        self.assertEquals(prep_sect.name, new_sect.name)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        new_sect = sect.copy()
        self.assertEquals(sect.name, new_sect.name)

        prep_sect = sect.prepare(0, 0, 0, 32, '<')
        new_sect = prep_sect.copy()
        self.assertEquals(prep_sect.name, new_sect.name)

        sect = UnpreparedElfStringTable("string")
        strings = ["foo", "bar", "baz"]
        for string in strings:
            sect.add_string(string)
        new_sect = sect.copy()
        for i in range(len(strings)):
            self.assertEquals(sect.get_string_idx(i),
                              new_sect.get_string_idx(i))
Пример #5
0
    def test_remove_nobits(self):
        for file_name in [
            "data/null_elf",
            "data/arm_exec",
            "data/arm_exec_nosect",
            "data/arm_object",
            "data/mips64_exec",
            "data/mips32_exec",
            "data/ia32_exec",
            "data/amd64_exec",
            "data/ia64_exec",
        ]:
            ef = PreparedElfFile(filename=file_name)
            if ef.segments:
                seg_sizes = []
                for segment in ef.segments:
                    seg_sizes.append((segment.get_memsz(), segment.get_filesz()))
                ef.remove_nobits()
                count = 0
                for segment in ef.segments:
                    self.assertEqual(segment.get_memsz(), segment.get_filesz())
                    self.assertEqual(segment.get_memsz(), seg_sizes[count][0])
                    count += 1

        ef = UnpreparedElfFile()
        sec = UnpreparedElfSection(section_type=SHT_NOBITS, data=10)
        self.assertEqual(sec.get_size(), 10)
        ef.add_section(sec)
        ef.remove_nobits()
        sec = ef.sections[1]
        self.assertEqual(sec.type, SHT_PROGBITS)
        self.assertEqual(sec.get_size(), 10)
        self.assertEqual(sec.get_file_data(), ByteArray("\0" * 10))
Пример #6
0
    def test_replace_section(self):
        seg = SectionedElfSegment(sections=[UnpreparedElfSection("test")])
        old_section = seg.get_sections()[0]
        new_section = UnpreparedElfSection("new")
        seg.replace_section(old_section, new_section)
        self.assertEqual(seg.get_sections(), [new_section])
        new_seg = seg.copy()

        self.assertRaises(InvalidArgument, seg.replace_section, None,
                          new_section)
Пример #7
0
    def test_get_link(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(sect.link, None)

        sect2 = UnpreparedElfSection("test_link", link=sect)
        self.assertEqual(sect2.link, sect)

        sect3 = self.assertRaises(InvalidArgument,
                                  UnpreparedElfSection,
                                  "test_link",
                                  link=80)
Пример #8
0
 def test_get_data(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect = UnpreparedElfSection("test", section_type=SHT_NOBITS)
     sect.set_size(10)
     self.assertEquals(sect.get_data(), ByteArray('\0' * 10))
Пример #9
0
    def test_get_size(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(sect.get_size(), 0)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        self.assertEqual(sect.get_size(), 5)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(40)
        self.assertEqual(sect.get_size(), 40)
Пример #10
0
 def test_init(self):
     ElfSegment()
     ElfSegment(PT_LOAD)
     ElfSegment(program_header_type=PT_LOAD)
     sections = [UnpreparedElfSection("foo")]
     self.assertRaises(TypeError,
                       ElfSegment,
                       data=ByteArray("pants"),
                       sections=sections)
Пример #11
0
 def test_prepare(self):
     ef = UnpreparedElfFile()
     segment = SectionedElfSegment(None, align=0x1)
     new_sect = UnpreparedElfSection(None, "pants")
     ef.add_section(new_sect)
     segment.add_section(new_sect)
     ef.add_segment(segment)
     ef.add_segment(HeaderElfSegment(None))
     ef = ef.prepare(32, '<')
Пример #12
0
    def test_get_section_header(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(hasattr(sect, "get_section_header"), False)
        sect = sect.prepare(0, 0, 0, 32, "<")

        sh = sect.get_section_header()
        self.assertEquals(sh.todata(), Elf32SectionHeader("<").todata())

        sect = UnpreparedElfSection("test")
        sect2 = UnpreparedElfSection("test")
        sect.link = sect2
        sect2 = sect2.prepare(0, 2, 0, 32, "<")
        sect = sect.prepare(0, 0, 0, 32, "<")
        sh = sect.get_section_header()
        self.assertEquals(sh.sh_link, 2)
Пример #13
0
 def test_data_append(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect.data_append(ByteArray("foo"))
     self.assertEquals(sect.get_data(), ByteArray("pantsfoo"))
     sect = sect.prepare(0, 0, 0, 32, '<')
     self.assertEqual(hasattr(sect, "data_append"), False)
Пример #14
0
    def test_add_section(self):
        seg = DataElfSegment()
        data = ByteArray("foo")
        seg.set_data(data)
        section = UnpreparedElfSection()
        self.assertRaises(InvalidArgument, seg.add_section, section)

        seg = SectionedElfSegment()
        seg.add_section(section)
        self.assertEqual(section in seg.sections, True)
Пример #15
0
    def test_add_section(self):
        ef = UnpreparedElfFile()
        sect = UnpreparedElfSection()
        ef.add_section(sect)
        self.assertEqual(ef.sections[-1], sect)

        seg = HeaderElfSegment()
        self.assertRaises(InvalidArgument, seg.add_section, sect)

        seg = DataElfSegment()
        self.assertRaises(InvalidArgument, seg.add_section, sect)
Пример #16
0
 def test_get_data(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect = UnpreparedElfSection("test", section_type=SHT_NOBITS)
     sect.set_size(10)
     self.assertEquals(sect.get_data(), ByteArray("\0" * 10))
Пример #17
0
 def test_data_append(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect.data_append(ByteArray("foo"))
     self.assertEquals(sect.get_data(), ByteArray("pantsfoo"))
     sect = sect.prepare(0, 0, 0, 32, "<")
     self.assertEqual(hasattr(sect, "data_append"), False)
Пример #18
0
    def test_add_symbols(self):

        # Adding symbols to a file with no symbol table
        # should create a new symbol table
        symbols = []
        ef = UnpreparedElfFile()
        self.assertEqual(ef.get_symbol_table(), None)
        self.assertEqual(ef.get_symbols(), [])
        ef.add_symbols(symbols)
        self.assertNotEqual(ef.get_symbol_table(), None)
        # Apart from the opening null symbol, we should have nothing
        self.assertEqual(ef.get_symbols()[1:], [])

        sect_a = UnpreparedElfSection(ef)
        symbols = [ElfSymbol("a", sect_a), ElfSymbol("b", sect_a)]
        ef.add_symbols(symbols)
        self.assertEqual(ef.get_symbols()[1:], symbols)

        sect_b = UnpreparedElfSection(ef)
        symbols_b = [ElfSymbol("c", sect_b), ElfSymbol("d", sect_b)]
        ef.add_symbols(symbols_b)
        self.assertEqual(ef.section_symbols(sect_a), symbols)
        self.assertEqual(ef.section_symbols(sect_b), symbols_b)

        symbol_dict = {}
        for name in ["foo", "bar"]:
            symbol = ElfSymbol(name, sect_a)
            symbol_dict[name] = symbol
        ef.add_symbols(symbol_dict.values())

        for name in symbol_dict.keys():
            #full string match
            self.assertEqual(ef.find_symbol(name), symbol_dict[name])

            # partial suffix match
            self.assertEqual(ef.find_symbol(name[1:]), symbol_dict[name])

        self.assertEqual(ef.find_symbol("missing"), None)
Пример #19
0
    def test_copy(self):
        seg = DataElfSegment()
        new_seg = seg.copy()

        seg = SectionedElfSegment()
        seg.sections = [UnpreparedElfSection("test")]
        new_seg = seg.copy()

        seg = DataElfSegment()
        seg._data = ByteArray()
        new_seg = seg.copy()

        seg = DataElfSegment()
        seg.prepare(34)
        new_seg = seg.copy()

        seg = HeaderElfSegment()
        new_Seg = seg.copy()
Пример #20
0
    def test_remove_section(self):
        ef = UnpreparedElfFile()
        sect = UnpreparedElfSection(None)
        self.assertRaises(InvalidArgument, ef.remove_section, sect)
        ef.add_section(sect)
        self.assertEqual(sect in ef.sections, True)
        ef.remove_section(sect)
        self.assertEqual(sect in ef.sections, False)

        seg = SectionedElfSegment(None)
        ef.add_segment(seg)
        ef.add_section(sect)
        seg.add_section(sect)
        self.assertEqual(sect in ef.sections, True)
        self.assertEqual(sect in seg.sections, True)  
        ef.remove_section(sect)
        self.assertEqual(sect in ef.sections, False)
        self.assertEqual(sect in seg.sections, False)  
Пример #21
0
 def test_setname_prepared(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect = sect.prepare(0, 0, 0, 32, '<')
     self.assertEqual(hasattr(sect, "set_name"), False)
Пример #22
0
 def test_get_entries(self):
     sect = UnpreparedElfSection("test", entsize=4)
     sect.data_append(ByteArray("12345678"))
     self.assertEquals(list(sect.get_entries()), [ByteArray("1234"), ByteArray("5678")])
Пример #23
0
 def test_set_address(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.address, 0)
     sect.address = 25
     self.assertEqual(sect.address, 25)
Пример #24
0
 def test_get_index(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_index"), False)
     sect = sect.prepare(0, 15, 0, 32, "<")
     self.assertEqual(sect.index, 15)
Пример #25
0
 def test_set_addralign(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.addralign, 0)
     sect.addralign = 13
     self.assertEqual(sect.addralign, 13)
Пример #26
0
 def test_set_info(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.info, 0)
     sect.info = 13
     self.assertEqual(sect.info, 13)
Пример #27
0
    def test_set_size(self):
        sect = UnpreparedElfSection("test")
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(3)
        self.assertEqual(sect.get_size(), 3)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(10)
        self.assertEqual(sect.get_size(), 10)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, "<")
        sect.set_size(4)
        self.assertEqual(sect.get_size(), 4)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, "<")
        self.assertRaises(InvalidArgument, sect.set_size, 14)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, "<")
        self.assertRaises(InvalidArgument, sect.set_size, 69)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, "<")
        sect.set_size(12)
        self.assertEqual(sect.get_size(), 12)
Пример #28
0
 def test_add_section(self):
     ef = UnpreparedElfFile()
     sect = UnpreparedElfSection(None)
     ef.add_section(sect)
     self.assertEqual(ef.sections[-1], sect)
Пример #29
0
 def test_repr(self):
     sect = UnpreparedElfSection("test")
     self.assertEquals(repr(sect), "<UnpreparedElfSection NULL test>")
Пример #30
0
 def test_get_entries(self):
     sect = UnpreparedElfSection("test", entsize=4)
     sect.data_append(ByteArray("12345678"))
     self.assertEquals(
         list(sect.get_entries()),
         [ByteArray("1234"), ByteArray("5678")])
Пример #31
0
    def test_get_section_header(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(hasattr(sect, "get_section_header"), False)
        sect = sect.prepare(0, 0, 0, 32, '<')

        sh = sect.get_section_header()
        self.assertEquals(sh.todata(), Elf32SectionHeader('<').todata())

        sect = UnpreparedElfSection("test")
        sect2 = UnpreparedElfSection("test")
        sect.link = sect2
        sect2 = sect2.prepare(0, 2, 0, 32, '<')
        sect = sect.prepare(0, 0, 0, 32, '<')
        sh = sect.get_section_header()
        self.assertEquals(sh.sh_link, 2)
Пример #32
0
 def test_get_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_offset"), False)
     sect = sect.prepare(15, 0, 0, 32, '<')
     self.assertEqual(sect.offset, 15)
Пример #33
0
 def test_set_address(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.address, 0)
     sect.address = 25
     self.assertEqual(sect.address, 25)
Пример #34
0
 def test_setname(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect.name = "pants"
     self.assertEqual(sect.name, "pants")
Пример #35
0
 def test_set_entsize(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.entsize, 0)
     sect.entsize = 13
     self.assertEqual(sect.entsize, 13)
Пример #36
0
 def test_set_addralign(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.addralign, 0)
     sect.addralign = 13
     self.assertEqual(sect.addralign, 13)
Пример #37
0
 def test_set_flags(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.flags, 0)
     sect.flags = 0xFF
     self.assertEqual(sect.flags, 0xFF)
Пример #38
0
    def test_set_size(self):
        sect = UnpreparedElfSection("test")
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(3)
        self.assertEqual(sect.get_size(), 3)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(10)
        self.assertEqual(sect.get_size(), 10)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, '<')
        sect.set_size(4)
        self.assertEqual(sect.get_size(), 4)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, '<')
        self.assertRaises(InvalidArgument, sect.set_size, 14)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, '<')
        self.assertRaises(InvalidArgument, sect.set_size, 69)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, '<')
        sect.set_size(12)
        self.assertEqual(sect.get_size(), 12)
Пример #39
0
 def test_set_entsize(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.entsize, 0)
     sect.entsize = 13
     self.assertEqual(sect.entsize, 13)
Пример #40
0
 def test_settype(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.type, SHT_NULL)
     sect.type = SHT_PROGBITS
     self.assertEqual(sect.type, SHT_PROGBITS)
Пример #41
0
 def test_get_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_offset"), False)
     sect = sect.prepare(15, 0, 0, 32, "<")
     self.assertEqual(sect.offset, 15)
Пример #42
0
 def test_setname(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect.name = "pants"
     self.assertEqual(sect.name, "pants")
Пример #43
0
 def test_set_info(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.info, 0)
     sect.info = 13
     self.assertEqual(sect.info, 13)
Пример #44
0
 def test_setname_prepared(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect = sect.prepare(0, 0, 0, 32, "<")
     self.assertEqual(hasattr(sect, "set_name"), False)
Пример #45
0
 def test_set_flags(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.flags, 0)
     sect.flags = 0xff
     self.assertEqual(sect.flags, 0xff)
Пример #46
0
 def test_getname(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
Пример #47
0
    def test_get_size(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(sect.get_size(), 0)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        self.assertEqual(sect.get_size(), 5)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(40)
        self.assertEqual(sect.get_size(), 40)
Пример #48
0
 def test_get_index(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_index"), False)
     sect = sect.prepare(0, 15, 0, 32, '<')
     self.assertEqual(sect.index, 15)