Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # p2x unpacker (c) 2012 reverser
- import array
- import sys
- import os.path
- import os
- def make_key(src):
- dst = array.array('B')
- for i in range(256):
- dst.append(i)
- dst.append(0)
- dst.append(0)
- srclen = len(src)
- src = array.array('B', src)
- j = 0
- k = 0
- for i in range(256):
- j = (src[k] + j + dst[i]) & 0xFF
- dst[j], dst[i] = dst[i], dst[j]
- k = (k + 1) % srclen
- return dst
- def unscramble_1(src, k):
- srclen = len(src)
- src = array.array('B', src)
- p1 = k[256]
- p2 = k[257]
- for i in range(srclen):
- p1 = (p1 + 1) & 0xFF
- p2 = (p2 + k[p1]) & 0xFF
- k[p2], k[p1] = k[p1], k[p2]
- src[i] ^= k[(k[p1] + k[p2]) & 0xFF]
- k[256] = p1
- k[257] = p2
- return src.tostring()
- class Decryptor:
- def __init__(self, tpl, s):
- k1 = make_key(s)
- sc = unscramble_1(tpl, k1)
- self.key = make_key(sc)
- def decrypt(self, s):
- k1 = self.key[:]
- return unscramble_1(s, k1)
- g_dec = Decryptor("For more information visit www.indigostar.com", "continue")
- # NAME=<name>;SIZE=<size>;ENC=<enc>
- def parse_finfo(s):
- props = {}
- i1 = s.find('NAME=')
- i2 = s.find(';SIZE=', i1+5)
- if i1 == -1 or i2 == -1:
- return
- props['name'] = s[i1+5:i2]
- i3 = s.find(';ENC=', i2+6)
- if i3 != -1:
- props['size'] = int(s[i2+6:i3])
- props['enc'] = int(s[i3+5:])
- else:
- i3 = s.find(';VALUE=', i2+6)
- if i3 == -1:
- props['size'] = int(s[i2+6:])
- props['value'] = ''
- else:
- props['size'] = int(s[i2+6:i3])
- props['value'] = s[i3+7:]
- props['enc'] = 0
- return props
- def write_file(name, body):
- dir = os.path.dirname(name)
- if dir and not os.path.exists(dir):
- os.makedirs(dir)
- open(name, 'wb').write(body)
- if len(sys.argv) < 2:
- print "Usage: p2x_dec.py <file.exe>"
- sys.exit(1)
- taillen = 256
- fn = sys.argv[1]
- inf = open(fn, "rb")
- inf.seek(-taillen, 2)
- stail = g_dec.decrypt(inf.read(taillen))
- tocprops = parse_finfo(stail)
- if not tocprops:
- print "Not a perl2exe file?"
- sys.exit(1)
- tocsz = tocprops['size']
- inf.seek(-taillen - tocsz, 2)
- toc = inf.read(tocsz)
- toc = g_dec.decrypt(toc)
- write_file(tocprops['name'], toc)
- inf.seek(0)
- for line in toc.split('\n'):
- line = line.rstrip('\n')
- fprops = parse_finfo(line)
- if fprops:
- sz = fprops['size']
- nm = fprops['name']
- if sz:
- fbody = inf.read(sz)
- if fprops['enc']:
- fbody = g_dec.decrypt(fbody)
- print nm
- write_file(nm, fbody)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement