All pastes #100419 Raw Edit

Cody Brocious

public python v1 · immutable
#100419 ·published 2006-07-26 03:31 UTC
rendered paste body
import structfrom fileformat import *CPU_TYPE_X86 = 7CPU_SUBTYPE_LITTLE_ENDIAN = 0MH_EXECUTE = 2MH_DYLIB   = 6class MachO(FileFormat):	capabilities = (FILEFORMAT_WRITE, )		def write(self, fp):		"""		Write file to given file pointer   		@param	fp:		File pointer to output file		@type	fp:		C{file}		"""			cputype = CPU_TYPE_X86		cpusubtype = CPU_SUBTYPE_LITTLE_ENDIAN		if self.is_shared:			filetype = MH_DYLIB		else:			filetype = MH_EXECUTE		flags = 0x20000		ncmds = len(self.sections)		cmds = self.commands()		sizeofcmds = len(cmds)		reserved = 0		fp.write(struct.pack('<LLL', 0xfeedfaceL, cputype, cpusubtype))		fp.write(struct.pack('<LLLL', filetype, ncmds, sizeofcmds, flags))		fp.write(cmds)		for section in self.sections:			fp.write(section.data)		def commands(self):		data = ''		fileoff = 7*4 # Size of the Mach-O header we use				for sec in self.sections:			fileoff += 56 + 68				for sec in self.sections:			datatemp = self.writeSegment(sec, fileoff)			data    += datatemp			fileoff += len(datatemp)				return data		def writeSegment(self, sec, fileoff):		cmd, cmdsize = 0x1, 56 + 68		segname = sec.name				if segname == '.':			segname = segname[1:]		elif segname[0] == '_':			segname = segname[1:]			if segname[0] == '_':				segname = segname[1:]				segname = segname.upper()		segname = segname.replace('alky', '')						data = struct.pack(			'<LL16sLLLLLLLL', cmd, cmdsize,			segname, sec.addr, sec.size,			fileoff, len(sec.data), 7,			sec.prot, 1, 0		)				data += self.writeSection(segname, sec, fileoff)				return data		def writeSection(self, segname, sec, fileoff):		align = 2		reloff = nreloc = flags = 0		reserved1 = reserved2 = 0		return struct.pack(			'<16s16sLLLLLLLLL', segname, sec.name,			sec.addr, sec.size, fileoff, align,			reloff, nreloc, flags, reserved1,			reserved2		)