Exemple #1
0
def process(fname):
	ic = open(fname,'rb')
	encrypted, d, offset = Mjo.header(ic)

	#Get entrypoint details
	ic.seek(0x10)
	primary = Util.read_int(ic)
	ic.seek(0x18)
	record_count = Util.read_int(ic)
	entrypoints = {}
	for i in range(record_count):
		code = Util.read_int32(ic)
		offs = Util.read_int(ic)
		entrypoints[offs] = (code, offs == primary)

	#Get generic channel for bytecode
	if encrypted:
		s = Mjo.crypt(ic)
		bc = strio(s)
		ic.seek(0)
		open(fname+'.dec','wb').write(ic.read(offset) + s)
	else:
		ic.seek(offset)
		s = ic.read()
		bc = strio(s)
	endPos = len(s) - 1

	#Read commands
	cmds = []
	targets = {}
#	try:
	if 1:
		while bc.tell()<endPos:
			cpos = bc.tell()
			cmd = read_cmd(bc, cpos + offset)
			cmds.append((cpos, cmd))
			if cmd.__class__ == Cmd:
				for i in cmd[2]:
					targets[i] = 0
#	except:
	if 0:
		print 'warning: this mjo may be truncated.'
		import pdb
		pdb.set_trace()
	
	#Order labels
	targets = targets.keys()
	targets.sort(reverse=True)
	labels = {}
	for n in range(len(targets)):
		labels[targets[n]] = n + 1
	
	#Open output file
	dir, basename = os.path.split(fname)
	output_dir = g_output_dir
	if not output_dir:
		output_dir = dir
	noext = os.path.splitext(basename)[0]
	oc = open(output_dir + '\\' + noext + '.mjs', 'w')
	res = resstrs(output_dir + '\\' + noext + '.sjs')
	
	#Output code
	def do_lbl(pos):
		if pos in labels:
			oc.write('\n  @%d\n'%labels[pos])
			res.finalise()
			if pos in targets:
				targets.remove(pos)
	
	def do_pos(pos):
		if include_offsets == 'Bytecode': oc.write("{-%04x-} "%pos)
		elif include_offsets == 'File': oc.write("{-%04x-} "%(pos+offset))
	
	stack = []
	def pop_all():
		if stack:
			res.finalise()
			while stack:
				pos, elt = stack.pop()
				do_lbl(pos)
				do_pos(pos)
				oc.write('push %s\n'%elt)
	
	def pop_n(n, clear = True):
		skip = None
		l = []
		for n in range(n):
			if skip or not stack:
				l.append('pop')
			else:
				pos, elt = stack.pop()
				if not skip and pos in labels:
					skip = pos
				l.append(elt)
		if clear or skip:
			pop_all()
			if skip: do_lbl(skip)
		return ', '.join(l)
	
	for pos, cmd in cmds:
		if pos in entrypoints:
			code, is_entry = entrypoints[pos]
			del entrypoints[pos]
			f = "function"
			if is_entry: f = "entrypoint"
			oc.write("\n#%s $%08lx\n"%(f, code&0xFFFFFFFF))
			res.finalise()
		if cmd == None:
			pop_all()
			do_lbl(pos)
		elif cmd.__class__ == Stack:
			s, n, b = cmd
			res.finalise()
			if n: s = "%s(%s)"%(s,pop_n(n, False))
			elif b:
				if res.enabled: s=res.add_whole(s)
				else: s = repr(s)
			stack.append((pos,s))
		elif cmd.__class__ == Cmd:
			s, n, l = cmd
			if n: args = " (%s)"%pop_n(n)
			else:
				args = ""
				pop_all()
			do_lbl(pos)
			do_pos(pos)
			res.finalise()
			oc.write(s)
			oc.write(args)
			if len(l) == 1:
				oc.write(' @%d'%labels[l[0]])
			elif l:
				oc.write(' { %s }'%', '.join(['@%d'%labels[n] for n in l]))
			oc.write('\n')
		else:#text
			pop_all()
			do_lbl(pos)
			do_pos(pos)
			if res.enabled:
				r = res.add_part(cmd)
				if r: oc.write("%s\n"%r)
			else: oc.write(repr(cmd))
	pop_all()
	
	#Clean up
	if targets:
		print "Warning: labels not generated: %s" % ", ".join(['@%d'%labels[n] for n in targets])
	if entrypoints:
		print "Warning: entrypoints not generated: %s"%", ".join(['$%08lx'%entrypoints[n][0]&0xFFFFFFFF for n in entrypoints])
	oc.close()
	res.close()
Exemple #2
0
def process(fname):
    ic = open(fname, 'rb')
    encrypted, d, offset = Mjo.header(ic)

    #Get entrypoint details
    ic.seek(0x10)
    primary = Util.read_int(ic)
    ic.seek(0x18)
    record_count = Util.read_int(ic)
    entrypoints = {}
    for i in range(record_count):
        code = Util.read_int32(ic)
        offs = Util.read_int(ic)
        entrypoints[offs] = (code, offs == primary)

    #Get generic channel for bytecode
    if encrypted:
        s = Mjo.crypt(ic)
        bc = strio(s)
        ic.seek(0)
        open(fname + '.dec', 'wb').write(ic.read(offset) + s)
    else:
        ic.seek(offset)
        s = ic.read()
        bc = strio(s)
    endPos = len(s) - 1

    #Read commands
    cmds = []
    targets = {}
    #	try:
    if 1:
        while bc.tell() < endPos:
            cpos = bc.tell()
            cmd = read_cmd(bc, cpos + offset)
            cmds.append((cpos, cmd))
            if cmd.__class__ == Cmd:
                for i in cmd[2]:
                    targets[i] = 0


#	except:
    if 0:
        print 'warning: this mjo may be truncated.'
        import pdb
        pdb.set_trace()

    #Order labels
    targets = targets.keys()
    targets.sort(reverse=True)
    labels = {}
    for n in range(len(targets)):
        labels[targets[n]] = n + 1

    #Open output file
    dir, basename = os.path.split(fname)
    output_dir = g_output_dir
    if not output_dir:
        output_dir = dir
    noext = os.path.splitext(basename)[0]
    oc = open(output_dir + '\\' + noext + '.mjs', 'w')
    res = resstrs(output_dir + '\\' + noext + '.sjs')

    #Output code
    def do_lbl(pos):
        if pos in labels:
            oc.write('\n  @%d\n' % labels[pos])
            res.finalise()
            if pos in targets:
                targets.remove(pos)

    def do_pos(pos):
        if include_offsets == 'Bytecode': oc.write("{-%04x-} " % pos)
        elif include_offsets == 'File': oc.write("{-%04x-} " % (pos + offset))

    stack = []

    def pop_all():
        if stack:
            res.finalise()
            while stack:
                pos, elt = stack.pop()
                do_lbl(pos)
                do_pos(pos)
                oc.write('push %s\n' % elt)

    def pop_n(n, clear=True):
        skip = None
        l = []
        for n in range(n):
            if skip or not stack:
                l.append('pop')
            else:
                pos, elt = stack.pop()
                if not skip and pos in labels:
                    skip = pos
                l.append(elt)
        if clear or skip:
            pop_all()
            if skip: do_lbl(skip)
        return ', '.join(l)

    for pos, cmd in cmds:
        if pos in entrypoints:
            code, is_entry = entrypoints[pos]
            del entrypoints[pos]
            f = "function"
            if is_entry: f = "entrypoint"
            oc.write("\n#%s $%08lx\n" % (f, code & 0xFFFFFFFF))
            res.finalise()
        if cmd == None:
            pop_all()
            do_lbl(pos)
        elif cmd.__class__ == Stack:
            s, n, b = cmd
            res.finalise()
            if n: s = "%s(%s)" % (s, pop_n(n, False))
            elif b:
                if res.enabled: s = res.add_whole(s)
                else: s = repr(s)
            stack.append((pos, s))
        elif cmd.__class__ == Cmd:
            s, n, l = cmd
            if n: args = " (%s)" % pop_n(n)
            else:
                args = ""
                pop_all()
            do_lbl(pos)
            do_pos(pos)
            res.finalise()
            oc.write(s)
            oc.write(args)
            if len(l) == 1:
                oc.write(' @%d' % labels[l[0]])
            elif l:
                oc.write(' { %s }' % ', '.join(['@%d' % labels[n] for n in l]))
            oc.write('\n')
        else:  #text
            pop_all()
            do_lbl(pos)
            do_pos(pos)
            if res.enabled:
                r = res.add_part(cmd)
                if r: oc.write("%s\n" % r)
            else: oc.write(repr(cmd))
    pop_all()

    #Clean up
    if targets:
        print "Warning: labels not generated: %s" % ", ".join(
            ['@%d' % labels[n] for n in targets])
    if entrypoints:
        print "Warning: entrypoints not generated: %s" % ", ".join(
            ['$%08lx' % entrypoints[n][0] & 0xFFFFFFFF for n in entrypoints])
    oc.close()
    res.close()
Exemple #3
0
	opInfo[op] = ('op%03x'%op, [4])
for op in (0x1b0, 0x1b1, 0x1b2, 0x1b3, 0x1b5, 0x1b8, 0x1c0, 0x1d0, 0x1d2,
	        0x1d8, 0x1d9, 0x270, 0x272, 0x290, 0x2c0, 0x802, 0x837):
	opInfo[op] = ('op%03x'%op, [8])

ic = open(sys.argv[1],'rb')
encrypted, l, offset = Mjo.header(ic)
ic.seek(16)
primary = struct.unpack('I', ic.read(4))[0]
ic.seek(0x18)
entrypoints = {}
for i in range(struct.unpack('I', ic.read(4))[0]):
	code, offs = struct.unpack('II', ic.read(8))
	entrypoints[offs] = (code, offs == primary)
if encrypted:
	s = strio(Mjo.crypt(ic))
else:
	ic.seek(offset)
	s = strio(ic.read(l))

dasm = []
labels={}
ident = 0
while 1:
	curoff = s.tell()
	if curoff in entrypoints:
		code, isEntry = entrypoints[curoff]
		if isEntry: dasm.append((curoff, '#entry 0x%08x'%code))
		else:    dasm.append((curoff, '#function 0x%08x'%code))
	
	op = s.read(2)
Exemple #4
0
    opInfo[op] = ('op%03x' % op, [4])
for op in (0x1b0, 0x1b1, 0x1b2, 0x1b3, 0x1b5, 0x1b8, 0x1c0, 0x1d0, 0x1d2,
           0x1d8, 0x1d9, 0x270, 0x272, 0x290, 0x2c0, 0x802, 0x837):
    opInfo[op] = ('op%03x' % op, [8])

ic = open(sys.argv[1], 'rb')
encrypted, l, offset = Mjo.header(ic)
ic.seek(16)
primary = struct.unpack('I', ic.read(4))[0]
ic.seek(0x18)
entrypoints = {}
for i in range(struct.unpack('I', ic.read(4))[0]):
    code, offs = struct.unpack('II', ic.read(8))
    entrypoints[offs] = (code, offs == primary)
if encrypted:
    s = strio(Mjo.crypt(ic))
else:
    ic.seek(offset)
    s = strio(ic.read(l))

dasm = []
labels = {}
ident = 0
while 1:
    curoff = s.tell()
    if curoff in entrypoints:
        code, isEntry = entrypoints[curoff]
        if isEntry: dasm.append((curoff, '#entry 0x%08x' % code))
        else: dasm.append((curoff, '#function 0x%08x' % code))

    op = s.read(2)