Advertisement
Guest User

Untitled

a guest
Apr 17th, 2017
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.10 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import sys, os, zlib, io
  4. from struct import pack, unpack
  5.  
  6. def read_ntstr(f):
  7.         bytes = 1
  8.         str = ""
  9.         chr = f.read(1)
  10.         while ord(chr):
  11.                 str += chr
  12.                 bytes += 1
  13.                 chr = f.read(1)
  14.         return (str, bytes)
  15.  
  16. if len(sys.argv) < 2:
  17.     print "Wrong"
  18.     exit(1)
  19.  
  20. file = sys.argv[1]
  21. name = sys.argv[2]
  22. size = int(sys.argv[3])
  23.  
  24. f = open(file, "r+b")
  25. print "Opening %s" % file
  26.  
  27. if tuple(unpack("<cccc",f.read(4))) == ('\x7f', 'E', 'L', 'F'):
  28.         f.seek(40,0)
  29.         shoff = (unpack("<Q",f.read(8)))[0]
  30.         f.seek(10,1)
  31.         shsize = (unpack("<H",f.read(2)))[0]
  32.         shnum = (unpack("<H",f.read(2)))[0]
  33.         shidx = (unpack("<H",f.read(2)))[0]
  34.         print "SH Offset: %s, SH Num: %s, SH Size: %s, SH Index: %s" % (shoff, shnum, shsize, shidx)
  35.  
  36.         f.seek(shoff+(shidx * shsize),0)
  37.         shtextoff = unpack("<IIQQQQIIQQ",f.read(shsize))[4]
  38.         f.seek(shoff,0)
  39.  
  40.         for i in range(shnum):
  41.                 sh = unpack("<IIQQQQIIQQ",f.read(shsize))
  42.                 curpos = f.tell()
  43.                 f.seek(shtextoff+sh[0])
  44.                 realname = read_ntstr(f)[0]
  45.                 if realname == name:
  46.                         print "Name %s, offset: %s, size: %s" % (realname,sh[4], sh[5])
  47.             # BEFORE
  48.                     f.seek(curpos-shsize,0)
  49.             sh = unpack("<IIQQQQIIQQ",f.read(shsize))
  50.             print "NAME: %s, TYPE: %s, FLAGS: %s, ADDR: %s, OFFSET: %s, SIZE: %s, LINK: %s, INFO: %s, ALIGN: %s, SIZE: %s" % (sh[0], sh[1], sh[2], sh[3], sh[4], sh[5], sh[6], sh[7], sh[8], sh[9])
  51.             #
  52.             print "Writing new size: %s at %s" % (size,f.tell())
  53.                     f.seek(curpos-shsize+4+4+8+8+8,0)
  54.             f.write(pack('<Q', size))
  55.             # AFTER
  56.                     f.seek(curpos-shsize,0)
  57.             sh = unpack("<IIQQQQIIQQ",f.read(shsize))
  58.             print "NAME: %s, TYPE: %s, FLAGS: %s, ADDR: %s, OFFSET: %s, SIZE: %s, LINK: %s, INFO: %s, ALIGN: %s, SIZE: %s" % (sh[0], sh[1], sh[2], sh[3], sh[4], sh[5], sh[6], sh[7], sh[8], sh[9])
  59.             #
  60.             break
  61.         f.seek(curpos,0)
  62. else:
  63.     print "Not valid ELF file"
  64.  
  65. f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement