Guest User

mclf2elf.py

a guest
Feb 2nd, 2015
743
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python
  2. """
  3. Convert an MCLF file to a fake elf file so we can use normal tools with it.
  4. """
  5.  
  6. import sys, struct
  7. from mclf import *
  8.  
  9. def writefmt(f, fmt, *args) :
  10.     f.write(struct.pack(fmt, *args))
  11.  
  12. class EHdr(object) :
  13.     def __init__(self, entry, phnum) :
  14.         self.e_ident = '\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  15.         self.e_type = 0x2
  16.         self.e_machine = 0x28
  17.         self.e_version = 0x1
  18.         self.e_entry = entry
  19.         self.e_phoff = 0x34
  20.         self.e_shoff = 0
  21.         self.e_flags = 0x4000002
  22.         self.e_ehsize = 0x34
  23.         self.e_phentsize = 0x20
  24.         self.e_phnum = phnum
  25.         self.e_shentsize = 0x28
  26.         self.e_shnum = 0
  27.         self.e_shstrndx = 0
  28.  
  29.     def write(self, f) :
  30.         f.write(self.e_ident)
  31.         writefmt(f, '<HHIIIIIHHHHHH', self.e_type,
  32.                 self.e_machine,
  33.                 self.e_version,
  34.                 self.e_entry,
  35.                 self.e_phoff,
  36.                 self.e_shoff,
  37.                 self.e_flags,
  38.                 self.e_ehsize,
  39.                 self.e_phentsize,
  40.                 self.e_phnum,
  41.                 self.e_shentsize,
  42.                 self.e_shnum,
  43.                 self.e_shstrndx)
  44.  
  45. class PHdr(object) :
  46.     def __init__(self, typ, off, vaddr, paddr, sz, vsz, flags, align) :
  47.         self.p_type = typ
  48.         self.p_offset = off
  49.         self.p_vaddr = vaddr
  50.         self.p_paddr = paddr
  51.         self.p_filesz = sz
  52.         self.p_memsz = vsz
  53.         self.p_flags = flags
  54.         self.p_align = align
  55.     def write(self, f) :
  56.         return writefmt(f, '<IIIIIIII',
  57.             self.p_type,
  58.             self.p_offset,
  59.             self.p_vaddr,
  60.             self.p_paddr,
  61.             self.p_filesz,
  62.             self.p_memsz,
  63.             self.p_flags,
  64.             self.p_align)
  65.  
  66. class Elf(object) :
  67.     def __init__(self, entry) :
  68.         self.entry = entry
  69.         self.phdrs = []
  70.         self.data = []
  71.         self.dOff = 0
  72.  
  73.     def addPhdr(self, typ, vaddr, vsz, dat, flags) :
  74.         p = PHdr(typ, self.dOff, vaddr, vaddr, len(dat), vsz, flags, 1<<12)
  75.         self.phdrs.append(p)
  76.         self.data.append(dat)
  77.         self.dOff += len(dat)
  78.  
  79.     def write(self, f) :
  80.         e = EHdr(self.entry, len(self.phdrs))
  81.         e.e_phoff = self.e_ehsize = 0x34
  82.         e.write(f)
  83.  
  84.         off = e.e_ehsize + e.e_phentsize * len(self.phdrs)
  85.         for p in self.phdrs :
  86.             p.p_offset += off
  87.             p.write(f)
  88.  
  89.         for d in self.data :
  90.             f.write(d)
  91.    
  92. def proc(fn) :
  93.     m = MCLF(fn)
  94.     m.f.seek(0)
  95.     e = Elf(m.entry)
  96.     if m.text.len :
  97.         d = m.f.read(m.text.len)
  98.         e.addPhdr(1, m.text.start, m.text.len, d, 5)
  99.     if m.data.len or m.bssLen :
  100.         d = m.f.read(m.data.len)
  101.         e.addPhdr(1, m.data.start, m.data.len + m.bssLen, d, 6)
  102.     d = m.f.read(521)
  103.     e.addPhdr(0, 0xffff0000, 521, d, 4)
  104.  
  105.     outFn = fn + '.elf'
  106.     with file(outFn, 'wb') as f :
  107.         e.write(f)
  108.  
  109.     pos = m.f.tell()
  110.     m.f.seek(0, 2)
  111.     delta = m.f.tell() - pos
  112.     assert delta == 0  # no data left in original file!
  113.  
  114. for arg in sys.argv[1:] :
  115.     proc(arg)
RAW Paste Data