All pastes #120220 Raw Edit

Cody Brocious

public python v1 · immutable
·published 2006-08-07 06:00 UTC
rendered paste body
PT_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)