Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            var ep = new ImageSymbol(baseAddress);

            this.program.EntryPoints.Add(ep.Address, ep);
            var program = project.Programs[0];

            foreach (Procedure_v1 sp in program.User.Procedures.Values)
            {
                scanner.EnqueueUserProcedure(sp);
            }
            scanner.ScanImage();
        }
Exemple #3
0
        protected override void RunTest(Program program, string outputFile)
        {
            FileUnitTester fut = null;

            try
            {
                fut = new FileUnitTester(outputFile);
                var factory  = program.TypeFactory;
                var store    = program.TypeStore;
                var listener = new FakeDecompilerEventListener();
                var aen      = new ExpressionNormalizer(program.Platform.PointerType);
                var eqb      = new EquivalenceClassBuilder(factory, store, listener);

                var tyco = new TypeCollector(factory, store, program, listener);

                aen.Transform(program);
                eqb.Build(program);
                tyco.CollectTypes();
                if (buildEquivalenceClasses)
                {
                    store.BuildEquivalenceClassDataTypes(factory);
                    new TypeVariableReplacer(store).ReplaceTypeVariables();
                }
            }
            catch (Exception ex)
            {
                fut.TextWriter.WriteLine(ex.Message);
                fut.TextWriter.WriteLine(ex.StackTrace);
                throw;
            }
            finally
            {
                DumpProgAndStore(program, fut);
                fut.Dispose();
            }
        }
Exemple #4
0
        protected Program RewriteFile(string relativePath, Address addrBase)
        {
            sc = new ServiceContainer();
            var config        = new FakeDecompilerConfiguration();
            var eventListener = new FakeDecompilerEventListener();

            sc.AddService <IConfigurationService>(config);
            sc.AddService <IDecompiledFileService>(new FakeDecompiledFileService());
            sc.AddService <DecompilerEventListener>(eventListener);
            sc.AddService <IFileSystemService>(new FileSystemServiceImpl());
            var     arch    = new X86ArchitectureReal("x86-real-16");
            ILoader ldr     = new Loader(sc);
            var     program = ldr.AssembleExecutable(
                FileUnitTester.MapTestPath(relativePath),
                new X86TextAssembler(sc, arch),
                addrBase);

            program.Platform = new DefaultPlatform(sc, program.Architecture);
            var ep      = ImageSymbol.Procedure(arch, 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);
        }
Exemple #5
0
        private Program RewriteProgram()
        {
            var project = new Project {
                Programs = { program }
            };
            var scan = new Scanner(
                program,
                new Dictionary <Address, ProcedureSignature>(),
                new ImportResolver(project),
                new FakeDecompilerEventListener());

            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);
        }
Exemple #6
0
        private void RunTest(string sExp, Action <ProcedureBuilder> builder)
        {
            var pb = new ProcedureBuilder(this.pb.Program.Architecture);

            builder(pb);
            var proc    = pb.Procedure;
            var dg      = new DominatorGraph <Block>(proc.ControlGraph, proc.EntryBlock);
            var project = new Project
            {
                Programs = { this.pb.Program }
            };
            var listener       = new FakeDecompilerEventListener();
            var importResolver = new ImportResolver(
                project,
                this.pb.Program,
                listener);
            var arch = new FakeArchitecture();

            var platform = new FakePlatform(null, arch);

            // Register r1 is assumed to always be implicit when calling
            // another procedure.
            var implicitRegs = new HashSet <RegisterStorage>
            {
                arch.GetRegister(1)
            };

            Debug.Print("GetRegister(1) {0}", arch.GetRegister(1));
            this.pb.Program.Platform   = platform;
            this.pb.Program.Platform   = new FakePlatform(null, new FakeArchitecture());
            this.pb.Program.SegmentMap = new SegmentMap(
                Address.Ptr32(0x0000),
                new ImageSegment(
                    ".text",
                    Address.Ptr32(0),
                    0x40000,
                    AccessMode.ReadWriteExecute));

            // Perform the initial transformation
            var ssa = new SsaTransform(programFlow, proc, importResolver, dg, implicitRegs);

            // Propagate values and simplify the results.
            // We hope the the sequence
            //   esp = fp - 4
            //   mov [esp-4],eax
            // will become
            //   esp_2 = fp - 4
            //   mov [fp - 8],eax

            var vp = new ValuePropagator(this.pb.Program.Architecture, ssa.SsaState, listener);

            vp.Transform();

            ssa.RenameFrameAccesses = true;
            ssa.AddUseInstructions  = true;
            ssa.Transform();

            var writer = new StringWriter();

            proc.Write(false, writer);
            var sActual = writer.ToString();

            if (sActual != sExp)
            {
                Debug.Print(sActual);
            }
            Assert.AreEqual(sExp, sActual);
            ssa.SsaState.CheckUses(s => Assert.Fail(s));
        }
Exemple #7
0
 public void Setup()
 {
     this.buildEquivalenceClasses = false;
     this.eventListener           = new FakeDecompilerEventListener();
 }
 public void Setup()
 {
     m        = new ProcedureBuilder();
     ssa      = new SsaIdentifierCollection();
     listener = new FakeDecompilerEventListener();
 }
 public void Setup()
 {
     this.listener = new FakeDecompilerEventListener();
 }
Exemple #10
0
 public void Setup()
 {
     this.sc       = new ServiceContainer();
     this.listener = new FakeDecompilerEventListener();
     sc.AddService <DecompilerEventListener>(listener);
 }
Exemple #11
0
 public void Setup()
 {
     this.listener   = new FakeDecompilerEventListener();
     this.segmentMap = new SegmentMap(Address.Ptr32(0x0040000));
 }
 public void Setup()
 {
     arch     = new X86ArchitectureFlat32();
     frame    = new Frame(arch.FramePointerType);
     listener = new FakeDecompilerEventListener();
 }