private void DoRewriteCore() { var cfgSvc = MockRepository.GenerateStub<IConfigurationService>(); var env = MockRepository.GenerateStub<OperatingEnvironment>(); var tlSvc = MockRepository.GenerateStub<ITypeLibraryLoaderService>(); var eventListener = new FakeDecompilerEventListener(); cfgSvc.Stub(c => c.GetEnvironment("ms-dos")).Return(env); cfgSvc.Replay(); env.Stub(e => e.TypeLibraries).Return(new List<ITypeLibraryElement>()); env.Stub(e => e.CharacteristicsLibraries).Return(new List<ITypeLibraryElement>()); env.Replay(); tlSvc.Replay(); sc.AddService<DecompilerHost>(new FakeDecompilerHost()); sc.AddService<DecompilerEventListener>(eventListener); sc.AddService<IConfigurationService>(cfgSvc); sc.AddService<ITypeLibraryLoaderService>(tlSvc); Project project = LoadProject(); project.Programs.Add(this.program); scanner = new Scanner( this.program, new ImportResolver(project, this.program, eventListener), sc); ImageSymbol ep = new ImageSymbol(baseAddress); scanner.EnqueueImageSymbol(ep, true); var program = project.Programs[0]; foreach (Procedure_v1 sp in program.User.Procedures.Values) { scanner.EnqueueUserProcedure(sp); } scanner.ScanImage(); }
protected override void RunTest(Program program, string outputFile) { var eventListener = new FakeDecompilerEventListener(); using (FileUnitTester fut = new FileUnitTester(outputFile)) { fut.TextWriter.WriteLine("// Before ///////"); DumpProgram(program, fut.TextWriter); SetupPreStages(program); aen.Transform(program); eqb.Build(program); var coll = new TypeCollector(program.TypeFactory, program.TypeStore, program,eventListener); coll.CollectTypes(); program.TypeStore.BuildEquivalenceClassDataTypes(program.TypeFactory); tvr.ReplaceTypeVariables(); trans.Transform(); ctn.RenameAllTypes(program.TypeStore); ter = new TypedExpressionRewriter(program, eventListener); try { ter.RewriteProgram(program); } catch (Exception ex) { fut.TextWriter.WriteLine("** Exception **"); fut.TextWriter.WriteLine(ex); } finally { fut.TextWriter.WriteLine("// After ///////"); DumpProgAndStore(program, fut); } } }
protected Program RewriteFile(string relativePath, Address addrBase) { sc = new ServiceContainer(); var config = new FakeDecompilerConfiguration(); var eventListener = new FakeDecompilerEventListener(); sc.AddService<IConfigurationService>(config); sc.AddService<DecompilerHost>(new FakeDecompilerHost()); sc.AddService<DecompilerEventListener>(eventListener); sc.AddService<IFileSystemService>(new FileSystemServiceImpl()); ILoader ldr = new Loader(sc); var program = ldr.AssembleExecutable( FileUnitTester.MapTestPath(relativePath), new X86TextAssembler(sc, new X86ArchitectureReal()), addrBase); program.Platform = new DefaultPlatform(sc, program.Architecture); var ep = new ImageSymbol(program.SegmentMap.BaseAddress); var project = new Project { Programs = { program } }; var scan = new Scanner( program, new ImportResolver(project, program, eventListener), sc); scan.EnqueueImageSymbol(ep, true); scan.ScanImage(); var importResolver = new ImportResolver(project, program, eventListener); var dfa = new DataFlowAnalysis(program, importResolver, eventListener); dfa.AnalyzeProgram(); return program; }
protected override void RunTest(Program prog, TextWriter writer) { var eventListener = new FakeDecompilerEventListener(); var dfa = new DataFlowAnalysis(prog, eventListener); var trf = new TrashedRegisterFinder(prog, prog.Procedures.Values, dfa.ProgramDataFlow, eventListener); trf.Compute(); trf.RewriteBasicBlocks(); var rl = RegisterLiveness.Compute(prog, dfa.ProgramDataFlow, eventListener); DumpProcedureFlows(prog, dfa, rl, writer); }
public void Setup() { mr = new MockRepository(); sc = new ServiceContainer(); eventListener = new FakeDecompilerEventListener(); cfgSvc = mr.Stub<IConfigurationService>(); signatureFiles = new List<SignatureFile>(); sc.AddService<DecompilerEventListener>(eventListener); sc.AddService<IConfigurationService>(cfgSvc); cfgSvc.Stub(d => d.GetSignatureFiles()).Return(signatureFiles); }
protected override void RunTest(Program prog, TextWriter writer) { var dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); var eventListener = new FakeDecompilerEventListener(); var trf = new TrashedRegisterFinder(prog, prog.Procedures.Values, dfa.ProgramDataFlow, eventListener); trf.Compute(); trf.RewriteBasicBlocks(); RegisterLiveness rl = RegisterLiveness.Compute(prog, dfa.ProgramDataFlow, eventListener); foreach (Procedure proc in prog.Procedures.Values) { LongAddRewriter larw = new LongAddRewriter(proc, prog.Architecture); larw.Transform(); proc.Write(false, writer); writer.WriteLine(); } }
private void BuildTest(Address addrBase, IPlatform platform , Action<X86Assembler> asmProg) { var sc = new ServiceContainer(); var eventListener = new FakeDecompilerEventListener(); sc.AddService<DecompilerEventListener>(eventListener); sc.AddService<DecompilerHost>(new FakeDecompilerHost()); sc.AddService<IFileSystemService>(new FileSystemServiceImpl()); var entryPoints = new List<ImageSymbol>(); var asm = new X86Assembler(sc, platform, addrBase, entryPoints); asmProg(asm); program = asm.GetImage(); var project = new Project { Programs = { program } }; scanner = new Scanner( program, new ImportResolver(project, program, eventListener), sc); scanner.EnqueueImageSymbol(new ImageSymbol(addrBase), true); scanner.ScanImage(); }
private void Build(Program prog) { var eventListener = new FakeDecompilerEventListener(); DataFlowAnalysis dfa = new DataFlowAnalysis(prog, null, eventListener); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); var gr = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, null, gr, new HashSet<RegisterStorage>()); SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, prog.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); var vp = new ValuePropagator(prog.Architecture, ssa); vp.Transform(); DeadCode.Eliminate(proc, ssa); Coalescer coa = new Coalescer(proc, ssa); coa.Transform(); DeadCode.Eliminate(proc, ssa); LiveCopyInserter lci = new LiveCopyInserter(proc, ssa.Identifiers); lci.Transform(); WebBuilder web = new WebBuilder(proc, ssa.Identifiers, new Dictionary<Identifier,LinearInductionVariable>()); web.Transform(); ssa.ConvertBack(false); } }
private void RunFileTestx86_32(string relativePath, string outputFile) { Program program; var sc = new ServiceContainer(); var fsSvc = new FileSystemServiceImpl(); var el = new FakeDecompilerEventListener(); sc.AddService<IFileSystemService>(fsSvc); sc.AddService<DecompilerEventListener>(el); var arch = new X86ArchitectureFlat32(); var asm = new X86TextAssembler(sc, arch); using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath))) { var platform = new DefaultPlatform(sc, arch); asm.Platform = platform; program = asm.Assemble(Address.Ptr32(0x10000000), rdr); } var scanner = new Scanner(program, new Dictionary<Address, ProcedureSignature>(), null, sc); scanner.EnqueueEntryPoint(new EntryPoint(program.Image.BaseAddress, arch.CreateProcessorState())); scanner.ScanImage(); using (var fut = new FileUnitTester(outputFile)) { foreach (var proc in program.Procedures.Values) { proc.Write(false, fut.TextWriter); } fut.AssertFilesEqual(); } }
protected void RunStringTest(Program program, string expectedOutput) { var sw = new StringWriter(); sw.WriteLine("// Before ///////"); DumpProgram(program, sw); var eventListener = new FakeDecompilerEventListener(); SetupPreStages(program); aen.Transform(program); eqb.Build(program); #if OLD coll = new TraitCollector(program.TypeFactory, program.TypeStore, dtb, program); coll.CollectProgramTraits(program); #else var coll = new TypeCollector(program.TypeFactory, program.TypeStore, program, eventListener); coll.CollectTypes(); #endif program.TypeStore.BuildEquivalenceClassDataTypes(program.TypeFactory); tvr.ReplaceTypeVariables(); trans.Transform(); ctn.RenameAllTypes(program.TypeStore); var ter = new TypedExpressionRewriter(program, eventListener); try { ter.RewriteProgram(program); } catch (Exception ex) { sw.WriteLine("** Exception **"); sw.WriteLine(ex); throw; } finally { sw.WriteLine("// After ///////"); DumpProgram(program, sw); } var sActual = sw.ToString(); if (expectedOutput != sActual) { Debug.Print(sActual); Assert.AreEqual(expectedOutput, sActual); } }
protected void RunHexTest(string hexFile, string outputFile) { var svc = new ServiceContainer(); var cfg = new FakeDecompilerConfiguration(); var eventListener = new FakeDecompilerEventListener(); svc.AddService<IConfigurationService>(cfg); svc.AddService<DecompilerEventListener>(eventListener); svc.AddService<DecompilerHost>(new FakeDecompilerHost()); ILoader ldr = new Loader(svc); var imgLoader = new DchexLoader(FileUnitTester.MapTestPath( hexFile), svc, null); var program = imgLoader.Load(null); var project = new Project { Programs = { program } }; var ep = new ImageSymbol(program.ImageMap.BaseAddress); var importResolver = new ImportResolver(project, program, eventListener); var scan = new Scanner(program, importResolver, svc); scan.EnqueueImageSymbol(ep, true); scan.ScanImage(); var dfa = new DataFlowAnalysis(program, null, eventListener); dfa.AnalyzeProgram(); RunTest(program, outputFile); }
private Program RewriteProgram() { var eventListener = new FakeDecompilerEventListener(); var importResolver = MockRepository.GenerateStub<IImportResolver>(); importResolver.Replay(); var scan = new Scanner( program, importResolver, sc); foreach (ImageSymbol ep in program.EntryPoints.Values) { scan.EnqueueImageSymbol(ep, true); } scan.ScanImage(); var dfa = new DataFlowAnalysis(program, importResolver, eventListener); dfa.AnalyzeProgram(); return program; }
protected override void RunTest(Program prog, TextWriter writer) { var flow = new ProgramDataFlow(prog); var eventListener = new FakeDecompilerEventListener(); var importResolver = MockRepository.GenerateStub<IImportResolver>(); importResolver.Replay(); var trf = new TrashedRegisterFinder(prog, prog.Procedures.Values, flow, eventListener); trf.Compute(); trf.RewriteBasicBlocks(); Dump(prog.CallGraph); RegisterLiveness.Compute(prog, flow, eventListener); GlobalCallRewriter.Rewrite(prog, flow, eventListener); foreach (Procedure proc in prog.Procedures.Values) { Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); var gr = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform( flow, proc, importResolver, gr, new HashSet<RegisterStorage>()); ssa = sst.SsaState; ssa.Write(writer); proc.Write(false, true, writer); writer.WriteLine(); } }
protected override void RunTest(Program program, TextWriter fut) { InitProgram(program); IImportResolver importResolver = null; var eventListener = new FakeDecompilerEventListener(); DataFlowAnalysis dfa = new DataFlowAnalysis( program, importResolver, eventListener); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { SsaTransform sst = new SsaTransform( dfa.ProgramDataFlow, proc, importResolver, proc.CreateBlockDominatorGraph(), new HashSet<RegisterStorage>()); SsaState ssa = sst.SsaState; var icrw = new IndirectCallRewriter( program, ssa, eventListener); icrw.Rewrite(); ssa.Write(fut); proc.Write(false, fut); fut.WriteLine(); } }
private Program RewriteProgram() { var project = new Project { Programs = { program } }; var scan = new Scanner( program, new Dictionary<Address, ProcedureSignature>(), new ImportResolver(project), sc); foreach (EntryPoint ep in program.EntryPoints) { scan.EnqueueEntryPoint(ep); } scan.ScanImage(); DecompilerEventListener eventListener = new FakeDecompilerEventListener(); DataFlowAnalysis da = new DataFlowAnalysis(program, eventListener); da.AnalyzeProgram(); return program; }
private static void Rewrite(Program program, Assembler asm, string configFile) { var fakeDiagnosticsService = new FakeDiagnosticsService(); var fakeConfigService = new FakeDecompilerConfiguration(); var eventListener = new FakeDecompilerEventListener(); var sc = new ServiceContainer(); sc.AddService(typeof(IDiagnosticsService), fakeDiagnosticsService); sc.AddService(typeof(IConfigurationService), fakeConfigService); sc.AddService<DecompilerEventListener>(eventListener); sc.AddService<DecompilerHost>(new FakeDecompilerHost()); var loader = new Loader(sc); var project = string.IsNullOrEmpty(configFile) ? new Project() : new ProjectLoader(sc, loader).LoadProject(FileUnitTester.MapTestPath(configFile)); var scan = new Scanner( program, new ImportResolver(project, program, eventListener), sc); scan.EnqueueImageSymbol(new ImageSymbol(asm.StartAddress), true); foreach (var f in project.Programs) { foreach (var sp in f.User.Procedures.Values) { scan.EnqueueUserProcedure(sp); } } scan.ScanImage(); }