示例#1
0
        public void SysV_LoadTrashedRegisters()
        {
            arch.Stub(a => a.Name).Return("mmix");
            arch.Stub(a => a.GetRegister((string)null)).IgnoreArguments()
            .Do(new Func <string, RegisterStorage>(r => new RegisterStorage(r, (int)r[1], 0, PrimitiveType.Word32)));
            var env = new OperatingEnvironmentElement
            {
                Architectures =
                {
                    new PlatformArchitectureElement()
                    {
                        Name             = "mmix",
                        TrashedRegisters =
                        {
                            "r2", "r3"
                        }
                    }
                }
            };

            Given_EnvironmentConfiguration(env);

            mr.ReplayAll();

            var sysv = new SysVPlatform(sc, arch);
            var regs = sysv.CreateTrashedRegisters();

            Assert.AreEqual(2, regs.Count);
            Assert.AreEqual("r2,r3", string.Join(",", regs.Select(r => r.Name)));
        }
示例#2
0
 public void Setup()
 {
     mr = new MockRepository();
     program = new Program();
     proc = new Procedure("testProc", new Frame(PrimitiveType.Word32));
     block = proc.AddBlock("l00100000");
     trace = new RtlTrace(0x00100000);
     r0 = new Identifier("r0", PrimitiveType.Word32, new RegisterStorage("r0", 0, 0, PrimitiveType.Word32));
     r1 = new Identifier("r1", PrimitiveType.Word32, new RegisterStorage("r1", 1, 0, PrimitiveType.Word32));
     r2 = new Identifier("r2", PrimitiveType.Word32, new RegisterStorage("r2", 2, 0, PrimitiveType.Word32));
     sp = new Identifier("sp", PrimitiveType.Word32, new RegisterStorage("sp", 15, 0, PrimitiveType.Word32));
     grf = proc.Frame.EnsureFlagGroup(Registers.eflags, 3, "SCZ", PrimitiveType.Byte);
     var sc = new ServiceContainer();
     var listener = mr.Stub<DecompilerEventListener>();
     scanner = mr.StrictMock<IScanner>();
     arch = mr.Stub<IProcessorArchitecture>();
     program.Architecture = arch;
     program.SegmentMap = new SegmentMap(
         Address.Ptr32(0x00100000),
         new ImageSegment(
             ".text",
             new MemoryArea(Address.Ptr32(0x00100000), new byte[0x20000]),
             AccessMode.ReadExecute));
     arch.Replay();
     program.Platform = new DefaultPlatform(null, arch);
     arch.BackToRecord();
     arch.Stub(s => s.StackRegister).Return((RegisterStorage)sp.Storage);
     arch.Stub(s => s.PointerType).Return(PrimitiveType.Pointer32);
     scanner.Stub(s => s.Services).Return(sc);
     sc.AddService<DecompilerEventListener>(listener);
 }
示例#3
0
        public void Setup()
        {
            mr      = new MockRepository();
            program = new Program();
            proc    = new Procedure("testProc", new Frame(PrimitiveType.Word32));
            block   = proc.AddBlock("l00100000");
            trace   = new RtlTrace(0x00100000);
            r0      = new Identifier("r0", PrimitiveType.Word32, new RegisterStorage("r0", 0, 0, PrimitiveType.Word32));
            r1      = new Identifier("r1", PrimitiveType.Word32, new RegisterStorage("r1", 1, 0, PrimitiveType.Word32));
            r2      = new Identifier("r2", PrimitiveType.Word32, new RegisterStorage("r2", 2, 0, PrimitiveType.Word32));
            sp      = new Identifier("sp", PrimitiveType.Word32, new RegisterStorage("sp", 15, 0, PrimitiveType.Word32));
            grf     = proc.Frame.EnsureFlagGroup(Registers.eflags, 3, "SCZ", PrimitiveType.Byte);

            scanner = mr.StrictMock <IScanner>();
            arch    = mr.Stub <IProcessorArchitecture>();
            program.Architecture = arch;
            program.SegmentMap   = new SegmentMap(
                Address.Ptr32(0x00100000),
                new ImageSegment(
                    ".text",
                    new MemoryArea(Address.Ptr32(0x00100000), new byte[0x20000]),
                    AccessMode.ReadExecute));
            arch.Replay();
            program.Platform = new DefaultPlatform(null, arch);
            arch.BackToRecord();
            arch.Stub(s => s.StackRegister).Return((RegisterStorage)sp.Storage);
            arch.Stub(s => s.PointerType).Return(PrimitiveType.Pointer32);
        }
示例#4
0
        private void Given_Architecture()
        {
            arch = mr.Stub <IProcessorArchitecture>();
            var dasm = mr.Stub <IEnumerable <MachineInstruction> >();
            var e    = mr.Stub <IEnumerator <MachineInstruction> >();

            arch.Stub(a => a.InstructionBitSize).Return(8);
            arch.Stub(a => a.PointerType).Return(PrimitiveType.Ptr32);
            arch.Stub(a => a.CreateImageReader(null, null))
            .IgnoreArguments()
            .Do(new Func <MemoryArea, Address, EndianImageReader>((i, a) => new LeImageReader(i, a)));
            arch.Stub(a => a.CreateDisassembler(
                          Arg <EndianImageReader> .Is.NotNull)).Return(dasm);
            Address dummy;

            arch.Stub(a => a.TryParseAddress(null, out dummy)).IgnoreArguments().WhenCalled(m =>
            {
                Address addr;
                bool ret       = Address.TryParse32((string)m.Arguments[0], out addr);
                m.Arguments[1] = addr;
                m.ReturnValue  = ret;
            }).Return(false);
            dasm.Stub(d => d.GetEnumerator()).Return(e);
            arch.Replay();
            dasm.Replay();
            e.Replay();
        }
示例#5
0
        private void Given_MsDosRawFileFormat()
        {
            this.x86arch = mr.Stub <IProcessorArchitecture>();
            var env = mr.Stub <OperatingEnvironment>();

            this.msdosPlatform = mr.Stub <IPlatform>();
            var state   = mr.Stub <ProcessorState>();
            var rawFile = new RawFileElementImpl
            {
                BaseAddress  = "0C00:0100",
                Environment  = "ms-dos",
                Architecture = "x86-real-16",
            };

            rawFile.EntryPoint.Address = null;
            rawFile.EntryPoint.Name    = "Start_Here";
            cfgSvc.Stub(d => d.GetRawFile("ms-dos-com")).Return(rawFile);
            cfgSvc.Stub(d => d.GetArchitecture("x86-real-16")).Return(x86arch);
            cfgSvc.Stub(d => d.GetEnvironment("ms-dos")).Return(env);
            env.Stub(e => e.Load(null, null)).IgnoreArguments().Return(msdosPlatform);
            x86arch.Stub(a => a.TryParseAddress(
                             Arg <string> .Is.Equal("0C00:0100"),
                             out Arg <Address> .Out(Address.SegPtr(0x0C00, 0x0100)).Dummy))
            .Return(true);
            x86arch.Stub(a => a.CreateProcessorState()).Return(state);
        }
示例#6
0
 private void Given_i386_Architecture()
 {
     this.arch_386 = mr.StrictMock<IProcessorArchitecture>();
     arch_386.Stub(a => a.CreateFrame()).Return(new Frame(PrimitiveType.Pointer32));
     arch_386.Stub(a => a.WordWidth).Return(PrimitiveType.Word32);
     var state = mr.Stub<ProcessorState>();
     arch_386.Stub(a => a.CreateProcessorState()).Return(state);
 }
 private void Given_ArchitectureStub()
 {
     arch = mr.DynamicMock <IProcessorArchitecture>();
     arch.Stub(a => a.PointerType).Return(PrimitiveType.Ptr32);
     arch.Stub(a => a.WordWidth).Return(PrimitiveType.Ptr32);
     platform = mr.DynamicMock <IPlatform>();
     platform.Stub(p => p.PointerType).Return(PrimitiveType.Ptr32);
     platform.Stub(p => p.Architecture).Return(arch);
     platform.Replay();
     this.procSer = new ProcedureSerializer(platform, null, "");
 }
示例#8
0
        private void Given_i386_Architecture()
        {
            this.arch_386 = mr.StrictMock <IProcessorArchitecture>();
            arch_386.Stub(a => a.CreateFrame()).Return(new Frame(PrimitiveType.Pointer32));
            arch_386.Stub(a => a.WordWidth).Return(PrimitiveType.Word32);
            arch_386.Stub(a => a.PointerType).Return(PrimitiveType.Pointer32);
            var state = mr.Stub <ProcessorState>();

            arch_386.Stub(a => a.CreateProcessorState()).Return(state);
            arch_386.Replay();
        }
示例#9
0
        private void Given_i386_Architecture()
        {
            this.arch_386 = mr.StrictMock <IProcessorArchitecture>();
            arch_386.Stub(a => a.CreateFrame()).Return(new Frame(PrimitiveType.Ptr32));
            arch_386.Stub(a => a.WordWidth).Return(PrimitiveType.Word32);
            arch_386.Stub(a => a.PointerType).Return(PrimitiveType.Ptr32);
            var map   = new SegmentMap(addrLoad);
            var state = new Mocks.FakeProcessorState(this.arch_386);

            arch_386.Stub(a => a.CreateProcessorState()).Return(state);
            arch_386.Replay();
        }
示例#10
0
        public void Dumper_LotsOfZeros()
        {
            Given_32bit_Program_Zeros(110);
            arch.Stub(a => a.CreateImageReader(null, null)).IgnoreArguments()
            .Do(new Func <MemoryArea, Address, EndianImageReader>(
                    (m, a) => new LeImageReader(m, a)));
            mr.ReplayAll();

            var addr = program.ImageMap.BaseAddress + 8;
            var item = new ImageMapItem(90)
            {
                Address = addr
            };

            program.ImageMap.AddItem(item.Address, item);
            var dmp = new Dumper(program);
            var sw  = new StringWriter();

            dmp.Dump(new TextFormatter(sw));

            var sExp =
                #region Expected
                @";;; Segment .text (00010000)
00010000 00 00 00 00 00 00 00 00                         ........       
00010008                         00 00 00 00 00 00 00 00         ........
00010010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
; ...
00010060 00 00 00 00 00 00 00 00 00 00 00 00 00 00       .............. 
";

            #endregion
            AssertOutput(sExp, sw);
            mr.VerifyAll();
        }
示例#11
0
        public void Setup()
        {
            mr     = new MockRepository();
            loader = mr.Stub <ILoader>();
            arch   = mr.StrictMock <IProcessorArchitecture>();
            Address dummy;

            arch.Stub(a => a.TryParseAddress(null, out dummy)).IgnoreArguments().WhenCalled(m =>
            {
                Address addr;
                var sAddr  = (string)m.Arguments[0];
                var iColon = sAddr.IndexOf(':');
                if (iColon > 0)
                {
                    addr = Address.SegPtr(
                        Convert.ToUInt16(sAddr.Remove(iColon)),
                        Convert.ToUInt16(sAddr.Substring(iColon + 1)));
                    m.ReturnValue = true;
                }
                else
                {
                    m.ReturnValue = Address32.TryParse32((string)m.Arguments[0], out addr);
                }
                m.Arguments[1] = addr;
            }).Return(false);
        }
示例#12
0
        public void Setup()
        {
            this.mr       = new MockRepository();
            this.sc       = new ServiceContainer();
            loader        = mr.Stub <ILoader>();
            arch          = mr.StrictMock <IProcessorArchitecture>();
            this.listener = mr.Stub <DecompilerEventListener>();
            Address dummy;

            arch.Stub(a => a.TryParseAddress(null, out dummy)).IgnoreArguments().WhenCalled(m =>
            {
                Address addr;
                var sAddr  = (string)m.Arguments[0];
                var iColon = sAddr.IndexOf(':');
                if (iColon > 0)
                {
                    addr = Address.SegPtr(
                        Convert.ToUInt16(sAddr.Remove(iColon)),
                        Convert.ToUInt16(sAddr.Substring(iColon + 1)));
                    m.ReturnValue = true;
                }
                else
                {
                    m.ReturnValue = Address32.TryParse32((string)m.Arguments[0], out addr);
                }
                m.Arguments[1] = addr;
            }).Return(false);
            this.cfgSvc = mr.Stub <IConfigurationService>();
            this.sc.AddService <IConfigurationService>(cfgSvc);
        }
 public void Setup()
 {
     this.mr = new MockRepository();
     this.sc = new ServiceContainer();
     loader = mr.Stub<ILoader>();
     arch = mr.StrictMock<IProcessorArchitecture>();
     Address dummy;
     arch.Stub(a => a.TryParseAddress(null, out dummy)).IgnoreArguments().WhenCalled(m =>
     {
         Address addr;
         var sAddr = (string)m.Arguments[0];
         var iColon = sAddr.IndexOf(':');
         if (iColon > 0)
         {
             addr = Address.SegPtr(
                 Convert.ToUInt16(sAddr.Remove(iColon)),
                 Convert.ToUInt16(sAddr.Substring(iColon+1)));
             m.ReturnValue = true;
         }
         else
         {
             m.ReturnValue = Address32.TryParse32((string)m.Arguments[0], out addr);
         }
         m.Arguments[1] = addr;
     }).Return(false);
 }
示例#14
0
 private void Given_ArchitectureStub()
 {
     arch = mr.DynamicMock<IProcessorArchitecture>();
     var procSer = mr.StrictMock<ProcedureSerializer>(null, null, null);
     arch.Stub(a => a.CreateProcedureSerializer(null, null)).IgnoreArguments().Return(procSer);
     procSer.Stub(p => p.Deserialize(null, null)).IgnoreArguments().Return(new ProcedureSignature());
 }
示例#15
0
        public void Setup()
        {
            mr   = new MockRepository();
            arch = mr.Stub <IProcessorArchitecture>();
            arch.Stub(a => a.CreateImageReader(null, 0u)).IgnoreArguments().Do(new Func <MemoryArea, ulong, EndianImageReader>((i, o) => i.CreateLeReader(o)));
            arch.Replay();
            globalStruct = new StructureType
            {
            };
            var globals_t = new TypeVariable("globals_t", 1)
            {
                DataType = globalStruct
            };
            var globals = new Identifier("globals", PrimitiveType.Ptr32, null);

            eqLink = new EquivalenceClass(new TypeVariable(2));
            StructureType str = new StructureType
            {
                Fields =
                {
                    { 0, new Pointer(eqLink, 32) },
                    { 4, PrimitiveType.Int32 }
                }
            };

            eqLink.DataType = str;
        }
示例#16
0
        private void Given_ArchitectureStub()
        {
            arch = mr.DynamicMock <IProcessorArchitecture>();
            var procSer = mr.StrictMock <ProcedureSerializer>(null, null, null);

            arch.Stub(a => a.CreateProcedureSerializer(null, null)).IgnoreArguments().Return(procSer);
            procSer.Stub(p => p.Deserialize(null, null)).IgnoreArguments().Return(new ProcedureSignature());
        }
示例#17
0
        private void Given_Image(params byte[] bytes)
        {
            addrBase = Address.Ptr32(0x00010000);
            var mem = new MemoryArea(addrBase, bytes);

            program.ImageMap = new ImageMap(addrBase);
            program.ImageMap.AddSegment(mem, ".text", AccessMode.ReadWriteExecute);
            arch.Stub(a => a.CreateImageReader(mem, addrBase)).Return(new LeImageReader(mem, 0));
        }
示例#18
0
        public void Setup()
        {
            mr = new MockRepository();
            prog = new Program();
            proc = new Procedure("testProc", new Frame(PrimitiveType.Word32));
            block = proc.AddBlock("l00100000");
            trace = new RtlTrace(0x00100000);
            r0 = new Identifier("r0", PrimitiveType.Word32, new RegisterStorage("r0", 0, PrimitiveType.Word32));
            r1 = new Identifier("r1", PrimitiveType.Word32, new RegisterStorage("r1", 0, PrimitiveType.Word32));
            r2 = new Identifier("r2", PrimitiveType.Word32, new RegisterStorage("r2", 0, PrimitiveType.Word32));
            grf = proc.Frame.EnsureFlagGroup(3, "SCZ", PrimitiveType.Byte);

            scanner = mr.StrictMock<IScanner>();
            arch = mr.DynamicMock<IProcessorArchitecture>();
            arch.Stub(s => s.PointerType).Return(PrimitiveType.Pointer32);
            arch.Stub(s => s.CreateRegisterBitset()).Return(new BitSet(32));
            prog.Architecture = arch;
            arch.Replay();
            prog.Platform = new DefaultPlatform(null, arch);
            arch.BackToRecord();
        }
示例#19
0
        public void Setup()
        {
            mr    = new MockRepository();
            prog  = new Program();
            proc  = new Procedure("testProc", new Frame(PrimitiveType.Word32));
            block = proc.AddBlock("l00100000");
            trace = new RtlTrace(0x00100000);
            r0    = new Identifier("r0", PrimitiveType.Word32, new RegisterStorage("r0", 0, PrimitiveType.Word32));
            r1    = new Identifier("r1", PrimitiveType.Word32, new RegisterStorage("r1", 0, PrimitiveType.Word32));
            r2    = new Identifier("r2", PrimitiveType.Word32, new RegisterStorage("r2", 0, PrimitiveType.Word32));
            grf   = proc.Frame.EnsureFlagGroup(3, "SCZ", PrimitiveType.Byte);

            scanner = mr.StrictMock <IScanner>();
            arch    = mr.DynamicMock <IProcessorArchitecture>();
            arch.Stub(s => s.PointerType).Return(PrimitiveType.Pointer32);
            arch.Stub(s => s.CreateRegisterBitset()).Return(new BitSet(32));
            prog.Architecture = arch;
            arch.Replay();
            prog.Platform = new DefaultPlatform(null, arch);
            arch.BackToRecord();
        }
示例#20
0
        private void Given_32bit_Program(int size = 32)
        {
            this.arch = mr.Stub <IProcessorArchitecture>();
            this.arch.Stub(a => a.FramePointerType).Return(PrimitiveType.Ptr32);
            this.arch.Stub(a => a.InstructionBitSize).Return(8);
            this.platform = mr.Stub <IPlatform>();
            this.program  = new Program(
                new SegmentMap(
                    Address.Ptr32(0x00010000),
                    new ImageSegment(
                        ".text",
                        new MemoryArea(
                            Address.Ptr32(0x00010000),
                            Enumerable.Range(0, size)
                            .Select(i => (byte)i)
                            .ToArray()),
                        AccessMode.ReadWrite)),
                arch,
                platform);
            arch.Stub(a => a.CreateFrame()).Do(
                new Func <Frame>(
                    () => new Frame(PrimitiveType.Ptr32)));
            arch.Stub(a => a.CreateImageReader(null, null)).IgnoreArguments()
            .Do(new Func <MemoryArea, Address, EndianImageReader>(
                    (m, a) => new LeImageReader(m, a)));
            arch.Stub(a => a.CreateDisassembler(null)).IgnoreArguments()
            .Return(new[]
            {
                Operation.Add,
                Operation.Mul,
                Operation.Add,
                Operation.Ret
            }.Select((m, i) => new FakeInstruction(m)
            {
                Address = Address.Ptr32(0x00010010 + 2 * (uint)i),
                Length  = 2,
            }));

            arch.Replay();
        }
示例#21
0
 private void Given_Program(byte [] bytes)
 {
     this.arch = mr.Stub<IProcessorArchitecture>();
     arch.Stub(a => a.ReadCodeAddress(0, null, null)).IgnoreArguments()
         .Do(new Func<int, ImageReader, ProcessorState, Address>(
             (s, r, st) => Address.Ptr32(r.ReadLeUInt32())));
     mem = new MemoryArea(Address.Ptr32(0x00010000), bytes);
     this.program = new Program(
         new SegmentMap(mem.BaseAddress,
             new ImageSegment(".text", mem, AccessMode.ReadExecute)),
         arch,
         null);
 }
示例#22
0
 private void Given_Program(byte [] bytes)
 {
     this.arch = mr.Stub <IProcessorArchitecture>();
     arch.Stub(a => a.ReadCodeAddress(0, null, null)).IgnoreArguments()
     .Do(new Func <int, ImageReader, ProcessorState, Address>(
             (s, r, st) => Address.Ptr32(r.ReadLeUInt32())));
     mem          = new MemoryArea(Address.Ptr32(0x00010000), bytes);
     this.program = new Program(
         new SegmentMap(mem.BaseAddress,
                        new ImageSegment(".text", mem, AccessMode.ReadExecute)),
         arch,
         null);
 }
示例#23
0
        private void Given_32bit_Program()
        {
            this.arch = mr.Stub<IProcessorArchitecture>();
            this.arch.Stub(a => a.FramePointerType).Return(PrimitiveType.Pointer32);
            this.platform = mr.Stub<IPlatform>();
            this.program = new Program(
                new SegmentMap(
                    Address.Ptr32(0x00010000),
                    new ImageSegment(
                        ".text",
                        new MemoryArea(
                            Address.Ptr32(0x00010000),
                            Enumerable.Range(0, 32)
                                .Select(i => (byte)i)
                                .ToArray()),
                        AccessMode.ReadWrite)),
                arch,
                platform);
            arch.Stub(a => a.CreateFrame()).Do(
                new Func<Frame>(
                    () => new Frame(PrimitiveType.Pointer32)));
            arch.Stub(a => a.CreateImageReader(null, null)).IgnoreArguments()
                .Do(new Func<MemoryArea, Address, ImageReader>(
                    (m, a) => new LeImageReader(m, a)));
            arch.Stub(a => a.CreateDisassembler(null)).IgnoreArguments()
                .Return(new[]
                {
                    Operation.Add,
                    Operation.Mul,
                    Operation.Add,
                    Operation.Ret
                }.Select((m, i) => new FakeInstruction(m)
                {
                    Address = Address.Ptr32(0x00010010 + 2 * (uint)i)
                }));

            arch.Replay();
        }
示例#24
0
 public void Setup()
 {
     mr = new MockRepository();
     programHeaders = new List<Elf32_PHdr>();
     sections = new List<ElfSection>();
     platform = mr.Stub<IPlatform>();
     this.sc = new ServiceContainer();
     var cfgSvc = mr.Stub<IConfigurationService>();
     this.arch = mr.Stub<IProcessorArchitecture>();
     arch.Stub(a => a.PointerType).Return(PrimitiveType.Pointer32);
     cfgSvc.Stub(c => c.GetArchitecture("x86-protected-32")).Return(arch);
     cfgSvc.Stub(c => c.GetArchitecture("mips-be-32")).Return(arch);
     sc.AddService<IConfigurationService>(cfgSvc);
 }
示例#25
0
 public void Setup()
 {
     this.mr       = new MockRepository();
     this.scanner  = mr.StrictMock <IScanner>();
     this.arch     = mr.StrictMock <IProcessorArchitecture>();
     this.platform = mr.StrictMock <IPlatform>();
     arch.Stub(a => a.CreateImageReader(null, null))
     .IgnoreArguments()
     .Do(new Func <MemoryArea, Address, ImageReader>((i, a) => new LeImageReader(i, a)));
     platform.Stub(p => p.Architecture).Return(arch);
     scanner.Stub(s => s.Error(null, null))
     .IgnoreArguments()
     .Do(new Action <Address, string>((a, s) => { Assert.Fail(string.Format("{0}: {1}", a, s)); }));
 }
示例#26
0
        private void Given_Image(params byte[] bytes)
        {
            var image = new LoadedImage(Address.Ptr32(0x00400000), bytes);

            arch.Stub(a => a.CreateImageReader(image, null))
            .IgnoreArguments()
            .Return(new LeImageReader(image, image.BaseAddress));
            this.program = new Program
            {
                Image        = image,
                ImageMap     = image.CreateImageMap(),
                Architecture = arch
            };
        }
示例#27
0
        private void Given_Image(params byte[] bytes)
        {
            var mem = new MemoryArea(Address.Ptr32(0x00400000), bytes);

            arch.Stub(a => a.CreateImageReader(mem, null))
            .IgnoreArguments()
            .Return(new LeImageReader(mem, mem.BaseAddress));
            this.program = new Program
            {
                Architecture = arch,
                SegmentMap   = new SegmentMap(
                    mem.BaseAddress,
                    new ImageSegment(".text", mem, AccessMode.ReadExecute)),
            };
        }
示例#28
0
        public void Setup()
        {
            mr             = new MockRepository();
            programHeaders = new List <Elf32_PHdr>();
            sections       = new List <ElfSection>();
            platform       = mr.Stub <IPlatform>();
            this.sc        = new ServiceContainer();
            var cfgSvc = mr.Stub <IConfigurationService>();

            this.arch = mr.Stub <IProcessorArchitecture>();
            arch.Stub(a => a.PointerType).Return(PrimitiveType.Pointer32);
            cfgSvc.Stub(c => c.GetArchitecture("x86-protected-32")).Return(arch);
            cfgSvc.Stub(c => c.GetArchitecture("mips-be-32")).Return(arch);
            sc.AddService <IConfigurationService>(cfgSvc);
        }
示例#29
0
        private void Given_BE32_GOT(params uint[] aPointers)
        {
            var writer = new BeImageWriter();

            foreach (var ptr in aPointers)
            {
                writer.WriteBeUInt32(ptr);
            }
            var mem = new MemoryArea(Address.Ptr32(0x10000000), writer.ToArray());

            program.SegmentMap.AddSegment(mem, ".got", AccessMode.ReadWriteExecute);
            arch.Stub(a => a.CreateImageReader(
                          Arg <MemoryArea> .Is.NotNull,
                          Arg <Address> .Is.Equal(mem.BaseAddress)))
            .Return(new BeImageReader(mem, 0));
        }
示例#30
0
        public void Ldr_UnknownImageType_DefaultSpecified()
        {
            Given_MsDosRawFileFormat();
            cfgSvc.Stub(d => d.GetImageLoaders()).Return(new List <LoaderConfiguration>());
            x86arch.Stub(x => x.PostprocessProgram(null)).IgnoreArguments();
            var testImage = new byte[] { 42, 42, 42, 42, };

            mr.ReplayAll();
            Loader ldr = mr.PartialMock <Loader>(sc);

            ldr.Replay();

            ldr.DefaultToFormat = "ms-dos-com";
            Program program = ldr.LoadExecutable("", testImage, null, null);

            Assert.IsNull(eventListener.LastDiagnostic);
            Assert.AreEqual("0C00:0100", program.ImageMap.BaseAddress.ToString());
            Assert.AreSame(x86arch, program.Architecture);
            Assert.AreSame(msdosPlatform, program.Platform);
            mr.VerifyAll();
        }
        public void Setup()
        {
            mr = new MockRepository();
            arch = mr.Stub<IProcessorArchitecture>();
            arch.Stub(a => a.CreateImageReader(null, 0u)).IgnoreArguments().Do(new Func<LoadedImage, ulong, ImageReader>((i, o) => i.CreateLeReader(o)));
            arch.Replay();
            globalStruct = new StructureType
            {
            };
            globals_t = new TypeVariable("globals_t", 1) { DataType = globalStruct };
            globals = new Identifier("globals", PrimitiveType.Pointer32, null);

            eqLink = new EquivalenceClass(new TypeVariable(2));
            StructureType str = new StructureType
            {
                Fields = {
                    { 0, new Pointer(eqLink, 4)},
                    { 4, PrimitiveType.Int32 }
                }
            };
            eqLink.DataType = str;
        }
示例#32
0
        public void Vb_CreateVector_ModifiesImageMap()
        {
            Given_Program(new byte[]
            {
                0x10, 0x00, 0x01, 0x00,
                0x11, 0x00, 0x01, 0x00,
                0x12, 0x00, 0x01, 0x00,
                0xCC, 0xCC, 0xCC, 0xCC,
                0xC3, 0xC3, 0xC3, 0xCC,
            });
            var scanner = mr.Stub <IScanner>();

            scanner.Stub(s => s.Services).Return(sc);
            arch.Stub(s => s.CreateImageReader(this.mem, this.program.ImageMap.BaseAddress))
            .Return(this.mem.CreateLeReader(0));
            var state = mr.Stub <ProcessorState>();

            mr.ReplayAll();

            var vb     = new VectorBuilder(scanner.Services, program, new DirectedGraphImpl <object>());
            var vector = vb.BuildTable(this.program.ImageMap.BaseAddress, 12, null, 4, state);

            Assert.AreEqual(3, vector.Count);
        }
示例#33
0
 private void Given_Architecture()
 {
     arch = mr.Stub<IProcessorArchitecture>();
     var dasm = mr.Stub<IEnumerable<MachineInstruction>>();
     var e = mr.Stub<IEnumerator<MachineInstruction>>();
     arch.Stub(a => a.InstructionBitSize).Return(8);
     arch.Stub(a => a.PointerType).Return(PrimitiveType.Pointer32);
     arch.Stub(a => a.CreateRegisterBitset()).Return(new BitSet(32));
     arch.Stub(a => a.CreateImageReader(null, null))
         .IgnoreArguments()
         .Do(new Func<LoadedImage, Address, ImageReader>((i, a) => new LeImageReader(i, a)));
     arch.Stub(a => a.CreateDisassembler(
         Arg<ImageReader>.Is.NotNull)).Return(dasm);
     Address dummy;
     arch.Stub(a => a.TryParseAddress(null, out dummy)).IgnoreArguments().WhenCalled(m =>
         {
             Address addr;
             bool ret = Address.TryParse32((string)m.Arguments[0], out addr);
             m.Arguments[1] = addr;
             m.ReturnValue = ret;
         }).Return(false);
     dasm.Stub(d => d.GetEnumerator()).Return(e);
     arch.Replay();
     dasm.Replay();
     e.Replay();
 }
示例#34
0
        public void VpIndirectCall()
        {
            var callee = CreateExternalProcedure("foo", RegArg(1, "r1"), StackArg(4), StackArg(8));
            var pc     = new ProcedureConstant(PrimitiveType.Ptr32, callee);

            var m  = new ProcedureBuilder();
            var r1 = m.Reg32("r1", 1);
            var sp = m.Frame.EnsureRegister(m.Architecture.StackRegister);

            m.Assign(r1, pc);
            m.Assign(sp, m.ISub(sp, 4));
            m.MStore(sp, m.Word32(3));
            m.Assign(sp, m.ISub(sp, 4));
            m.MStore(sp, m.Mem16(m.Word32(0x1231230)));
            m.Call(r1, 4);
            m.Return();

            arch.Stub(a => a.CreateStackAccess(null, 0, null))
            .IgnoreArguments()
            .Do(new Func <IStorageBinder, int, DataType, Expression>((f, off, dt) => m.Mem(dt, m.IAdd(sp, off))));
            mr.ReplayAll();

            var ssa  = RunTest(m);
            var sExp =
                #region Expected
                @"r1_0: orig: r1
    def:  r1_0 = foo
r63:r63
    def:  def r63
    uses: r63_2 = r63 - 0x00000004
          Mem3[r63 - 0x00000004:word32] = 0x00000003
          r63_4 = r63 - 0x00000008
          Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
          r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
          r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
r63_2: orig: r63
    def:  r63_2 = r63 - 0x00000004
Mem3: orig: Mem0
    def:  Mem3[r63 - 0x00000004:word32] = 0x00000003
    uses: Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
r63_4: orig: r63
    def:  r63_4 = r63 - 0x00000008
Mem5: orig: Mem0
    def:  Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
r1_6: orig: r1
    def:  r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
r63_7: orig: r63
Mem8: orig: Mem0
    uses: r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
Mem9: orig: Mem0
    uses: r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
// ProcedureBuilder
// Return size: 0
void ProcedureBuilder()
ProcedureBuilder_entry:
	def r63
	// succ:  l1
l1:
	r1_0 = foo
	r63_2 = r63 - 0x00000004
	Mem3[r63 - 0x00000004:word32] = 0x00000003
	r63_4 = r63 - 0x00000008
	Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
	r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
	return
	// succ:  ProcedureBuilder_exit
ProcedureBuilder_exit:
";

            #endregion
            AssertStringsEqual(sExp, ssa);
        }
 private void Given_NoInlinedCall()
 {
     arch.Stub(a => a.CreateImageReader(null, null))
     .IgnoreArguments()
     .Return(new LeImageReader(new byte[0]));
     arch.Stub(a => a.InlineCall(null, null, null, null))
     .IgnoreArguments()
     .Return(null);
 }
示例#36
0
 private void Expect_Arch_ParseAddress(string sExp, Address result)
 {
     arch.Stub(a => a.TryParseAddress(
                   Arg <string> .Is.Equal("1000:0400"),
                   out Arg <Address> .Out(Address.SegPtr(0x1000, 0x0400)).Dummy)).Return(true);
 }
示例#37
0
 private void Given_Arch_PointerDataType(PrimitiveType dt)
 {
     arch.Stub(a => a.PointerType).Return(dt);
 }
示例#38
0
 private void Given_MsDosRawFileFormat()
 {
     this.x86arch = mr.Stub<IProcessorArchitecture>();
     var env = mr.Stub<OperatingEnvironment>();
     this.msdosPlatform = mr.Stub<IPlatform>();
     var state = mr.Stub<ProcessorState>();
     var rawFile = new RawFileElementImpl
     {
         BaseAddress = "0C00:0100",
         Environment = "ms-dos",
         Architecture = "x86-real-16",
     };
     rawFile.EntryPoint.Address = null;
     rawFile.EntryPoint.Name = "Start_Here";
     cfgSvc.Stub(d => d.GetRawFile("ms-dos-com")).Return(rawFile);
     cfgSvc.Stub(d => d.GetArchitecture("x86-real-16")).Return(x86arch);
     cfgSvc.Stub(d => d.GetEnvironment("ms-dos")).Return(env);
     env.Stub(e => e.Load(null, null)).IgnoreArguments().Return(msdosPlatform);
     x86arch.Stub(a => a.TryParseAddress(
         Arg<string>.Is.Equal("0C00:0100"),
         out Arg<Address>.Out(Address.SegPtr(0x0C00, 0x0100)).Dummy))
         .Return(true);
     x86arch.Stub(a => a.CreateProcessorState()).Return(state);
 }
示例#39
0
        public void Bwi_StopOnGoto()
        {
            trace.Add(m =>
            {
                m.Assign(r0, m.Word32(3));
                m.Goto(Address.Ptr32(0x104000));
            });

            Block next = block.Procedure.AddBlock("next");

            using (mr.Record())
            {
                arch.Stub(x => x.PointerType).Return(PrimitiveType.Ptr32);
                arch.Stub(x => x.CreateRewriter(
                              Arg <EndianImageReader> .Is.Anything,
                              Arg <ProcessorState> .Is.Anything,
                              Arg <IStorageBinder> .Is.Anything,
                              Arg <IRewriterHost> .Is.Anything)).Return(trace);
                scanner.Stub(x => x.FindContainingBlock(
                                 Arg <Address> .Is.Anything)).Return(block);
                scanner.Expect(x => x.EnqueueJumpTarget(
                                   Arg <Address> .Is.NotNull,
                                   Arg <Address> .Is.Anything,
                                   Arg <Procedure> .Is.Same(block.Procedure),
                                   Arg <ProcessorState> .Is.Anything)).Return(next);
                scanner.Stub(x => x.TerminateBlock(null, null)).IgnoreArguments();
                scanner.Stub(x => x.GetTrace(null, null, null)).IgnoreArguments().Return(trace);
                scanner.Stub(f => f.GetImportedProcedure(null, null)).IgnoreArguments().Return(null);
                scanner.Stub(s => s.GetTrampoline(null)).IgnoreArguments().Return(null);
            }

            var wi = CreateWorkItem(Address.Ptr32(0x1000));

            wi.Process();
            Assert.AreEqual(2, block.Statements.Count);
            Assert.AreEqual("r0 = 0x00000003", block.Statements[0].ToString());
            Assert.AreEqual("goto 0x00104000", block.Statements[1].ToString());
            Assert.AreEqual(1, proc.ControlGraph.Successors(block).Count);
            var items = new List <Block>(proc.ControlGraph.Successors(block));

            Assert.AreSame(next, items[0]);
            mr.VerifyAll();
        }
示例#40
0
        public void Ps_Load_v4()
        {
            var bytes = new byte[100];

            loader.Stub(l => l.LoadImageBytes(null, 0)).IgnoreArguments().Return(bytes);
            loader.Stub(l => l.LoadExecutable(null, null, null)).IgnoreArguments().Return(
                new Program {
                Architecture = arch
            });
            Given_Architecture();
            Given_TestOS_Platform();
            Given_Platform_Address("113800", 0x113800);
            Given_Platform_Address("114000", 0x114000);
            Given_Platform_Address("115000", 0x115000);
            Given_Platform_Address("115012", 0x115012);
            Given_Platform_Address("11504F", 0x11504F);
            arch.Stub(a => a.GetRegister("r1")).Return(new RegisterStorage("r1", 1, 0, PrimitiveType.Word32));
            mr.ReplayAll();

            var sp = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "f.exe",
                        User     = new UserData_v4
                        {
                            Procedures =
                            {
                                new Procedure_v1 {
                                    Name            = "Fn",
                                    Decompile       = true,
                                    Characteristics = new ProcedureCharacteristics
                                    {
                                        Terminates = true,
                                    },
                                    Address   = "113300",
                                    Signature = new SerializedSignature{
                                        ReturnValue = new Argument_v1{
                                            Type = new PrimitiveType_v1(Domain.SignedInt, 4),
                                        },
                                        Arguments = new Argument_v1[]{
                                            new Argument_v1
                                            {
                                                Name = "a",
                                                Kind = new StackVariable_v1(),
                                                Type = new PrimitiveType_v1(Domain.Character, 2)
                                            },
                                            new Argument_v1
                                            {
                                                Name = "b",
                                                Kind = new StackVariable_v1(),
                                                Type = new PointerType_v1{
                                                    DataType = new PrimitiveType_v1(Domain.Character, 2)
                                                }
                                            }
                                        }
                                    }
                                }
                            },
                            IndirectJumps =
                            {
                                new IndirectJump_v4
                                {
                                    InstructionAddress = "113800",
                                    IndexRegister      = "r1",
                                    TableAddress       = "114000",
                                }
                            },
                            JumpTables =
                            {
                                new JumpTable_v4
                                {
                                    TableAddress = "114000",
                                    Destinations = new []
                                    {
                                        "115000",
                                        "115012",
                                        "11504F",
                                    }
                                }
                            }
                        }
                    }
                }
            };
            var ps = new ProjectLoader(sc, loader, listener);
            var p  = ps.LoadProject("c:\\tmp\\fproj.proj", sp);

            Assert.AreEqual(1, p.Programs.Count);
            var inputFile = p.Programs[0];

            Assert.AreEqual(1, inputFile.User.Procedures.Count);
            Assert.AreEqual("Fn", inputFile.User.Procedures.First().Value.Name);

            Assert.AreEqual(1, inputFile.User.JumpTables.Count);
            var jumpTable = inputFile.User.JumpTables[Address.Ptr32(0x114000)];

            Assert.AreEqual(Address.Ptr32(0x00115000), jumpTable.Addresses[0]);
            Assert.AreEqual(Address.Ptr32(0x00115012), jumpTable.Addresses[1]);
            Assert.AreEqual(Address.Ptr32(0x0011504F), jumpTable.Addresses[2]);

            Assert.AreEqual(1, inputFile.User.IndirectJumps.Count);
            var indJump = inputFile.User.IndirectJumps[Address.Ptr32(0x00113800)];

            Assert.AreSame(jumpTable, indJump.Table);
        }
示例#41
0
        public void Prld_LoadUserDefinedMetadata()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                        User     = new UserData_v4
                        {
                            LoadAddress = "00123400"
                        }
                    },
                    new MetadataFile_v3 {
                        Filename = "meta1.xml",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta2.xml",
                    },
                }
            };

            var types1 = new Dictionary <string, DataType>()
            {
                { "USRTYPE1", PrimitiveType.Word16 }
            };
            var types2 = new Dictionary <string, DataType>()
            {
                { "USRTYPE2", PrimitiveType.Word32 }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            arch.Stub(a => a.TryParseAddress(
                          Arg <string> .Is.Equal("00123400"),
                          out Arg <Address> .Out(Address.Ptr32(0x00123400)).Dummy))
            .Return(true);
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta1.xml"),
                this.platform,
                new TypeLibrary(
                    types1, new Dictionary <string, FunctionType>(), new Dictionary <string, DataType>()
                    )
                );
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta2.xml"),
                this.platform,
                new TypeLibrary(
                    types2, new Dictionary <string, FunctionType>(), new Dictionary <string, DataType>()
                    )
                );
            mr.ReplayAll();

            var prld    = new ProjectLoader(sc, ldr, listener);
            var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject);

            Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count);
            Assert.AreEqual(
                "word16",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString()
                );
            Assert.AreEqual(
                "word32",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString()
                );
            Assert.AreEqual(
                Address.Ptr32(0x00123400),
                project.Programs[0].User.LoadAddress);
        }