Advertisement
Guest User

Untitled

a guest
Aug 4th, 2013
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.45 KB | None | 0 0
  1. # p2x unpacker (c) 2012 reverser
  2.  
  3. import array
  4. import sys
  5. import os.path
  6. import os
  7.  
  8. def make_key(src):
  9.   dst = array.array('B')
  10.   for i in range(256):
  11.     dst.append(i)
  12.   dst.append(0)
  13.   dst.append(0)
  14.   srclen = len(src)
  15.   src = array.array('B', src)
  16.   j = 0
  17.   k = 0
  18.   for i in range(256):
  19.     j = (src[k] + j + dst[i]) & 0xFF
  20.     dst[j], dst[i] = dst[i], dst[j]
  21.     k = (k + 1) % srclen
  22.   return dst
  23.  
  24. def unscramble_1(src, k):
  25.   srclen = len(src)
  26.   src = array.array('B', src)
  27.   p1 = k[256]
  28.   p2 = k[257]
  29.   for i in range(srclen):
  30.     p1 = (p1 + 1) & 0xFF
  31.     p2 = (p2 + k[p1]) & 0xFF
  32.     k[p2], k[p1] = k[p1], k[p2]
  33.     src[i] ^= k[(k[p1] + k[p2]) & 0xFF]
  34.   k[256] = p1
  35.   k[257] = p2
  36.   return src.tostring()
  37.  
  38. class Decryptor:
  39.   def __init__(self, tpl, s):
  40.     k1 = make_key(s)
  41.     sc = unscramble_1(tpl, k1)
  42.     self.key = make_key(sc)
  43.  
  44.   def decrypt(self, s):
  45.     k1 = self.key[:]
  46.     return unscramble_1(s, k1)
  47.  
  48. g_dec = Decryptor("For more information visit www.indigostar.com", "continue")
  49.  
  50. # NAME=<name>;SIZE=<size>;ENC=<enc>
  51. def parse_finfo(s):
  52.   props = {}
  53.   i1 = s.find('NAME=')
  54.   i2 = s.find(';SIZE=', i1+5)
  55.   if i1 == -1 or i2 == -1:
  56.     return
  57.   props['name'] = s[i1+5:i2]
  58.   i3 = s.find(';ENC=', i2+6)
  59.   if i3 != -1:
  60.     props['size'] = int(s[i2+6:i3])
  61.     props['enc'] = int(s[i3+5:])
  62.   else:
  63.     i3 = s.find(';VALUE=', i2+6)
  64.     if i3 == -1:
  65.       props['size'] = int(s[i2+6:])
  66.       props['value'] = ''
  67.     else:
  68.       props['size'] = int(s[i2+6:i3])
  69.       props['value'] = s[i3+7:]
  70.     props['enc'] = 0
  71.   return props
  72.  
  73. def write_file(name, body):
  74.   dir = os.path.dirname(name)
  75.   if dir and not os.path.exists(dir):
  76.     os.makedirs(dir)
  77.   open(name, 'wb').write(body)
  78.  
  79. if len(sys.argv) < 2:
  80.   print "Usage: p2x_dec.py <file.exe>"
  81.   sys.exit(1)
  82.  
  83. taillen = 256
  84. fn = sys.argv[1]
  85. inf = open(fn, "rb")
  86. inf.seek(-taillen, 2)
  87. stail = g_dec.decrypt(inf.read(taillen))
  88. tocprops = parse_finfo(stail)
  89. if not tocprops:
  90.   print "Not a perl2exe file?"
  91.   sys.exit(1)
  92.  
  93. tocsz = tocprops['size']
  94. inf.seek(-taillen - tocsz, 2)
  95. toc = inf.read(tocsz)
  96. toc = g_dec.decrypt(toc)
  97. write_file(tocprops['name'], toc)
  98. inf.seek(0)
  99. for line in toc.split('\n'):
  100.   line = line.rstrip('\n')
  101.   fprops = parse_finfo(line)
  102.   if fprops:
  103.     sz = fprops['size']
  104.     nm = fprops['name']
  105.     if sz:
  106.       fbody = inf.read(sz)
  107.       if fprops['enc']:
  108.         fbody = g_dec.decrypt(fbody)
  109.       print nm
  110.       write_file(nm, fbody)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement