from System.CodeDom import * from System.CodeDom.Compiler import CodeDomProvider, CodeGeneratorOptions from System.IO import StringWriter import System.String, System.Int16 from Decoder import Decoder class Decompiler(object): ARITH_ADD = CodeBinaryOperatorType.Add ARITH_SUB = CodeBinaryOperatorType.Subtract ARITH_MUL = CodeBinaryOperatorType.Multiply ARITH_DIV = CodeBinaryOperatorType.Divide ARITH_XOR = '^' ARITH_LSL = '<<' ARITH_LSR = '>>' def compileExpr(expr): provider = CodeDomProvider.CreateProvider('CSharp') options = CodeGeneratorOptions() options.BracingStyle = 'Block' writer = StringWriter() provider.GenerateCodeFromExpression(expr, writer, options) ret = writer.ToString() writer.Close() return ret def arith(op, A, B): if isinstance(op, CodeBinaryOperatorType): return CodeBinaryOperatorExpression( A, op, B ) else: return CodeSnippetExpression( '%s %s %s' % ( compileExpr(A), oper, compileExpr(B) ) ) add = lambda A, B: Arith(ARITH_ADD, A, B) sub = lambda A, B: Arith(ARITH_SUB, A, B) mul = lambda A, B: Arith(ARITH_MUL, A, B) div = lambda A, B: Arith(ARITH_DIV, A, B) xor = lambda A, B: Arith(ARITH_XOR, A, B) lsl = lambda A, B: Arith(ARITH_LSL, A, B) lsr = lambda A, B: Arith(ARITH_LSR, A, B) move = CodeAssignStatement def branch(L, C=None, cond=None, hintTaken=False): pass def comp(op, A, B): pass V = 1 def formE(code, off, pre): pass forms = { 'E' : formE, 'G' : formG, } sizes = { 'v' : V, } def form(formstr): outform = [] for opc in formstr.split(','): major, minor = opc[0], opc[1] outform.append((forms[major], sizes[minor])) return outform opcodes = { 0x33 : (form('Gv,Ev'), lambda D, S: move(D, xor(D, S)), False), } def decompile(self, code): method = CodeMemberMethod() method.Name = 'Decompiled' method.ReturnType = CodeTypeReference(System.String) method.Attributes = MemberAttributes.Public end = False while not end: stmt, end = self.decode(code) method.Statements.Add(stmt)