rendered paste bodyPT_NULL = 0PT_LOAD = 1PT_DYNAMIC = 2PT_INTERP = 3PT_NOTE = 4PT_SHLIB = 5PT_PHDR = 6PT_LOOS = 0x60000000PT_HIOS = 0x6fffffffPT_LOPROC = 0x70000000PT_HIPROC = 0x7fffffffPT_GNU_EH_FRAME = 0x6474e550ET_NONE = 0ET_REL = 1ET_EXEC = 2ET_DYN = 3ET_CORE = 4ET_LOPROC = 0xff00ET_HIPROC = 0xffffEM_NONE = 0EM_M32 = 1EM_SPARC = 2EM_386 = 3EM_68K = 4EM_88K = 5EM_486 = 6EM_860 = 7import structclass section: def __init__(self, name=0, addr=0, data=''): self.name = name self.addr = addr self.size = len(data) self.data = data def writePhdr(self, fileOff=0): type = PT_LOAD return struct.pack('<LLLLLLLL', type, fileOff, self.addr, 0, self.size, self.size, 0x7, 2 ) def writeShdr(self, fileOff=0, nameOff=0): return struct.pack('<LLLLLLLLLL', nameOff, 1, 0x7, self.addr, fileOff, self.size, 0, 0, 2, 0)class ELF: def __init__(self, entry=None, isSO=False): self.sections = [] self.entry = entry self.isSO = isSO def addSection(self, sec): self.sections.append(sec) def write(self, fp): type = (ET_EXEC, ET_DYN)[int(self.isSO)] machine = EM_386 version = 1 entry = self.entry flags = 0 ehsize = 52 # sizeof(Elf32'Ehdr) phentsize = 32 # sizeof(Elf32.Phdr) phnum = len(self.sections) shentsize = 40 # sizeof(Elf32.Shdr) shnum = len(self.sections) + 2 phoff = ehsize shoff = phoff + (phentsize * phnum) shstrndx = shnum - 1 # phnum = shnum = shstrndx = 0 # phoff = shoff = 0 fp.write('\x7FELF') fp.write('\x01\x01\x01' + ('\x00' * 9)) # Rest of e'ident fp.write(struct.pack('<HHLLLLLHHHHHH', type, machine, version, entry, phoff, shoff, flags, ehsize, phentsize, phnum, shentsize, shnum, shstrndx)) # return shstr = '\0' fileOff = shoff + (shentsize * shnum) for sec in self.sections: fp.write(sec.writePhdr(fileOff=fileOff)) fileOff += sec.size fileOff = shoff + (shentsize * shnum) fp.write(struct.pack('<LLLLLLLLLL', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) for sec in self.sections: fp.write(sec.writeShdr(fileOff=fileOff, nameOff=len(shstr))) fileOff += sec.size shstr += '%s\0' % sec.name fp.write(struct.pack('<LLLLLLLLLL', 0, 3, 0x7, 0, fileOff, len(shstr), 0, 0, 0, 0)) for sec in self.sections: fp.write(sec.data) fp.write(shstr)