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))
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))
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)
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)
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)
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)
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)
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))
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)
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, '<')
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)
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)
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)
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)
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()
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)
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)
def test_set_entsize(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.entsize, 0) sect.entsize = 13 self.assertEqual(sect.entsize, 13)
def test_getname(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.name, "test")
def test_setname(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.name, "test") sect.name = "pants" self.assertEqual(sect.name, "pants")
def test_add_section(self): ef = UnpreparedElfFile() sect = UnpreparedElfSection(None) ef.add_section(sect) self.assertEqual(ef.sections[-1], sect)
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)
def test_repr(self): sect = UnpreparedElfSection("test") self.assertEquals(repr(sect), "<UnpreparedElfSection NULL test>")
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")])
def test_set_address(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.address, 0) sect.address = 25 self.assertEqual(sect.address, 25)
def test_set_flags(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.flags, 0) sect.flags = 0xff self.assertEqual(sect.flags, 0xff)
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)
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)
def test_set_addralign(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.addralign, 0) sect.addralign = 13 self.assertEqual(sect.addralign, 13)
def test_set_info(self): sect = UnpreparedElfSection("test") self.assertEqual(sect.info, 0) sect.info = 13 self.assertEqual(sect.info, 13)