rendered paste bodyimport 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 )