Exemplo n.º 1
0
def create_file_class(elfclass):
	elfclass = common_merger.create_file_class(elfclass)

	class Rel(elfclass.relSectionClass.relClass):
		def __init__(self, data = None):
			super(Rel, self).__init__(data)

		def _get_args(self, append, relocatable = None):
			args = {}
			args['T'] = self.type
			args['BS'] = self.symbol.section.offset
			args['S'] = self.symbol.get_real_value(relocatable)
			args['P'] = self.get_real_offset(relocatable)
			args['A'] = append
			return args

		def get_real_append(self, relocatable = None):
			args = self._get_args(self.get_append())
			args['forward'] = True
			addr = arm_rel_op(**args)
			return addr

		def set_real_append(self, value, relocatable = None):
			args = self._get_args(value)
			args['forward'] = False
			addr = arm_rel_op(**args)
			self.set_append(addr)

	class RelSection(elfclass.relSectionClass):
		relClass = Rel
		PLT_ENTRY_SIZE = 0xC
		PLT_ENTRY_OFFSET_SIZE = 0x14

		def __init__(self, data = None):
			super(RelSection, self).__init__(data)

		def translate_arch(self, old, new):
			if new.type == elffile.R_ARM.byname['R_ARM_CALL'].code:
				# Compile a BL
				assert (new.symbol.get_real_value() % 4) == 0
				assert (new.get_real_offset() % 4) == 0
				offset = (new.symbol.get_real_value() - new.get_real_offset() - 8) / 4
				asm = bitstring.pack('intle:24, bin:4, bin:3, bin:1', offset, '0b1110', '0b101', '0b1')

				new.symbol = self.sym_section.symbols[0]
				new.set_append(asm.tobytes())
				new.type = elffile.R_ARM.byname['R_ARM_NONE'].code
			elif new.type == elffile.R_ARM.byname['R_ARM_REL32'].code:
				addr = new.get_real_append(True)

				new.symbol = self.sym_section.symbols[0]
				new.type = elffile.R_ARM.byname['R_ARM_NONE'].code
				new.set_real_append(addr)
			elif new.type == elffile.R_ARM.byname['R_ARM_ABS32'].code:
				addr = new.get_real_append(True)

				new.type = elffile.R_ARM.byname['R_ARM_RELATIVE'].code
				new.symbol = self.sym_section.symbols[0]
				new.set_real_append(addr)
			else:
				raise NotImplementedError("Can't handle relocation type %s" % (elffile.R_ARM.bycode[new.type].name))
			return new


	class File(elfclass):
		relSectionClass = RelSection

		def __init__(self, name, efi):
			super(File, self).__init__(name, efi)

	return File
Exemplo n.º 2
0
def create_file_class(elfclass):
	elfclass = common_merger.create_file_class(elfclass)

	class Rel(elfclass.relSectionClass.relClass):
		def __init__(self, data = None):
			super(Rel, self).__init__(data)

		def _get_args(self, append, relocatable = None):
			args = {}
			args['T'] = self.type
			args['BS'] = self.symbol.section.offset
			args['S'] = self.symbol.get_real_value(relocatable)
			args['P'] = self.get_real_offset(relocatable)
			args['A'] = append
			return args

		def get_real_append(self, relocatable = None):
			args = self._get_args(self.get_append())
			args['forward'] = True
			addr = arm_rel_op(**args)
			return addr

		def set_real_append(self, value, relocatable = None):
			args = self._get_args(value)
			args['forward'] = False
			addr = arm_rel_op(**args)
			self.set_append(addr)

	class RelSection(elfclass.relSectionClass):
		relClass = Rel
		PLT_ENTRY_SIZE = 0xC
		PLT_ENTRY_OFFSET_SIZE = 0x14

		def __init__(self, data = None):
			super(RelSection, self).__init__(data)

		def translate_arch(self, old, new):
			if new.type == elffile.R_ARM.byname['R_ARM_CALL'].code:
				# Compile a BL
				rcore.assembler.set_pc(new.get_real_offset())
				op = "bl %d" % (new.symbol.get_real_value())
				masm = rcore.assembler.massemble(op)

				new.symbol = self.sym_section.symbols[0]
				new.set_append(bytearray.fromhex(masm.buf_hex))
				new.type = elffile.R_ARM.byname['R_ARM_NONE'].code
			elif new.type == elffile.R_ARM.byname['R_ARM_REL32'].code:
				addr = new.get_real_append(True)
				new.symbol = self.sym_section.symbols[0]
				new.type = elffile.R_ARM.byname['R_ARM_NONE'].code
				new.set_real_append(addr)
			elif new.type == elffile.R_ARM.byname['R_ARM_ABS32'].code:
				addr = new.get_real_append(True)
				new.type = elffile.R_ARM.byname['R_ARM_RELATIVE'].code
				new.symbol = self.sym_section.symbols[0]
				new.set_real_append(addr)
			else:
				raise NotImplementedError("Can't handle relocation type %s" % (elffile.R_ARM.bycode[new.type].name))
			return new


	class File(elfclass):
		relSectionClass = RelSection

		def __init__(self, name, efi):
			super(File, self).__init__(name, efi)

	return File