Exemplo n.º 1
0
        protected static Program RewriteMsdosAssembler(string relativePath, string configFile)
        {
            var sc         = new ServiceContainer();
            var arch       = new X86ArchitectureReal(sc, "x86-real-16");
            var cfgSvcMock = new Mock <IConfigurationService>();
            var envMock    = new Mock <PlatformDefinition>();
            var tlSvcMock  = new Mock <ITypeLibraryLoaderService>();

            cfgSvcMock.Setup(c => c.GetEnvironment("ms-dos")).Returns(envMock.Object);
            envMock.Setup(e => e.TypeLibraries).Returns(new List <TypeLibraryDefinition>());
            envMock.Setup(e => e.CharacteristicsLibraries).Returns(new List <TypeLibraryDefinition>());
            sc.AddService <IFileSystemService>(new FileSystemServiceImpl());
            sc.AddService <IConfigurationService>(cfgSvcMock.Object);
            sc.AddService <ITypeLibraryLoaderService>(tlSvcMock.Object);
            Program    program;
            IAssembler asm = new X86TextAssembler(arch);

            using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
            {
                program          = asm.Assemble(Address.SegPtr(0xC00, 0), rdr);
                program.Platform = new MsdosPlatform(sc, arch);
            }
            Rewrite(program, asm, configFile);
            return(program);
        }
Exemplo n.º 2
0
        private Program RewriteFile32(string relativePath, string configFile)
        {
            Program program;
            var     services = new ServiceContainer();
            var     arch     = new X86ArchitectureFlat32(services, "x86-protected-32");
            var     asm      = new X86TextAssembler(arch);

            using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
            {
                if (this.platform == null)
                {
                    this.platform = new Reko.Environments.Windows.Win32Platform(sc, arch);
                }
                else if (this.platformMock.Object == platform)
                {
                    platformMock.Setup(p => p.Architecture).Returns(arch);
                }
                program          = asm.Assemble(Address.Ptr32(0x10000000), rdr);
                program.Platform = this.platform;
            }
            foreach (var item in asm.ImportReferences)
            {
                program.ImportReferences.Add(item.Key, item.Value);
            }
            Rewrite(program, asm, configFile);
            return(program);
        }
Exemplo n.º 3
0
        public void Rotations()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureReal());
            var lr = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                "foo	proc\r\n"+
                "rol	ax,cl\r\n"+
                "ror	word ptr [bx+2],cl\r\n"+
                "rcr	word ptr [bp+4],4\r\n"+
                "rcl	ax,1\r\n");

            MemoryArea img = lr.ImageMap.Segments.Values.First().MemoryArea;

            CreateDisassembler16(img.CreateLeReader(img.BaseAddress));
            StringBuilder sb = new StringBuilder();

            foreach (var instr in dasm.Take(4))
            {
                sb.AppendFormat("{0}\r\n", instr.ToString());
            }
            string s = sb.ToString();

            Assert.AreEqual(
                "rol\tax,cl\r\n" +
                "ror\tword ptr [bx+02],cl\r\n" +
                "rcr\tword ptr [bp+04],04\r\n" +
                "rcl\tax,01\r\n", s);
        }
Exemplo n.º 4
0
 public void Setup()
 {
     this.sc = new ServiceContainer();
     sc.AddService <IFileSystemService>(new FileSystemServiceImpl());
     arch = new X86ArchitectureReal(sc, "x86-real-16");
     asm  = new X86TextAssembler(arch);
 }
Exemplo n.º 5
0
        public void X86Dis_Sequence()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureReal());
            var program          = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                @"	mov	ax,0
	cwd
foo:
	lodsb	
	dec		cx
	jnz		foo
");

            CreateDisassembler16(program.ImageMap.Segments.Values.First().MemoryArea);
            StringBuilder sb = new StringBuilder();

            foreach (var instr in dasm.Take(5))
            {
                Address addr = instr.Address;
                sb.AppendFormat("{0}\t{1}\r\n", addr, instr.ToString());
            }

            string s = sb.ToString();

            Assert.AreEqual(
                "0B96:0000\tmov\tax,0000\r\n" +
                "0B96:0003\tcwd\t\r\n" +
                "0B96:0004\tlodsb\t\r\n" +
                "0B96:0005\tdec\tcx\r\n" +
                "0B96:0006\tjnz\t0004\r\n",
                s);
        }
Exemplo n.º 6
0
        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(sc, "x86-protected-32", new Dictionary <string, object>());
            var asm  = new X86TextAssembler(arch);

            using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
            {
                var platform = new DefaultPlatform(sc, arch);
                program          = asm.Assemble(Address.Ptr32(0x10000000), rdr);
                program.Platform = platform;
            }
            var scanner = new Scanner(program, null, sc);

            scanner.EnqueueImageSymbol(ImageSymbol.Procedure(arch, program.ImageMap.BaseAddress), true);
            scanner.ScanImage();
            using (var fut = new FileUnitTester(outputFile))
            {
                foreach (var proc in program.Procedures.Values)
                {
                    proc.Write(false, fut.TextWriter);
                }
                fut.AssertFilesEqual();
            }
        }
Exemplo n.º 7
0
        protected static Program RewriteMsdosAssembler(string relativePath, string configFile)
        {
            var arch   = new X86ArchitectureReal();
            var sc     = new ServiceContainer();
            var cfgSvc = MockRepository.GenerateStub <IConfigurationService>();
            var env    = MockRepository.GenerateStub <OperatingEnvironment>();
            var tlSvc  = MockRepository.GenerateStub <ITypeLibraryLoaderService>();

            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 <IFileSystemService>(new FileSystemServiceImpl());
            sc.AddService <IConfigurationService>(cfgSvc);
            sc.AddService <ITypeLibraryLoaderService>(tlSvc);
            Program   program;
            Assembler asm = new X86TextAssembler(sc, arch);

            using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
            {
                program          = asm.Assemble(Address.SegPtr(0xC00, 0), rdr);
                program.Platform = new MsdosPlatform(sc, program.Architecture);
            }
            Rewrite(program, asm, configFile);
            return(program);
        }
Exemplo n.º 8
0
        public void Extensions()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureReal());
            var program          = asm.AssembleFragment(
                Address.SegPtr(0xA14, 0),
                @"		.i86
foo		proc
		movsx	ecx,word ptr [bp+8]
		movzx   edx,cl
		movsx	ebx,bx
		movzx	ax,byte ptr [bp+04]
");

            CreateDisassembler16(program.ImageMap.Segments.Values.First().MemoryArea);
            StringBuilder sb = new StringBuilder();

            foreach (var ii in dasm.Take(4))
            {
                sb.AppendLine(string.Format("{0}", ii.ToString()));
            }
            string s = sb.ToString();

            Assert.AreEqual(
                @"movsx	ecx,word ptr [bp+08]
movzx	edx,cl
movsx	ebx,bx
movzx	ax,byte ptr [bp+04]
", s);
        }
Exemplo n.º 9
0
        public void Dis_x86_InvalidKeptStateRegression()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureFlat32());
            var lr = asm.AssembleFragment(
                Address.Ptr32(0x01001000),

                "db 0xf2, 0x0f, 0x70, 0x00, 0x00\r\n" +
                "db 0xf3, 0x0f, 0x70, 0x00, 0x00\r\n");

            /* Before (incorrect):
             *  pshuflw xmm0, dqword ptr ds:[eax], 0
             *  pshuflw xmm0, dqword ptr ds:[eax], 0
             *
             *
             * After (correct):
             *  pshuflw xmm0, dqword ptr ds:[eax], 0
             *  pshufhw xmm0, dqword ptr ds:[eax], 0
             */

            MemoryArea img = lr.SegmentMap.Segments.Values.First().MemoryArea;

            CreateDisassembler32(img);
            var instructions = dasm.GetEnumerator();

            X86Instruction one = DisEnumerator_TakeNext(instructions);
            X86Instruction two = DisEnumerator_TakeNext(instructions);

            Assert.AreEqual(Opcode.pshuflw, one.code);
            Assert.AreEqual("xmm0", one.op1.ToString());
            Assert.AreEqual("[eax]", one.op2.ToString());

            Assert.AreEqual(Opcode.pshufhw, two.code);
            Assert.AreEqual("xmm0", two.op1.ToString());
            Assert.AreEqual("[eax]", two.op2.ToString());
        }
Exemplo n.º 10
0
 protected Program RewriteCodeFragment32(string s)
 {
     Assembler asm = new X86TextAssembler(sc, new X86ArchitectureFlat32());
     var program = asm.AssembleFragment(Address.Ptr32(0x00400000), s);
     program.Platform = new DefaultPlatform(null, program.Architecture);
     Rewrite(program, asm, null);
     return program;
 }
Exemplo n.º 11
0
 protected Program RewriteX86RealFragment(string asmFragment, Address addrBase)
 {
     var asm = new X86TextAssembler(new X86ArchitectureReal());
     program = asm.AssembleFragment(addrBase, asmFragment);
     program.Platform = new DefaultPlatform(null, program.Architecture);
     program.EntryPoints.Add(new EntryPoint(addrBase, program.Architecture.CreateProcessorState()));
     return RewriteProgram();
 }
Exemplo n.º 12
0
        protected Program RewriteX86_32Fragment(string asmFragment, Address addrBase)
        {
            var asm = new X86TextAssembler(new X86ArchitectureFlat32());

            program          = asm.AssembleFragment(addrBase, asmFragment);
            program.Platform = new DefaultPlatform(null, program.Architecture);
            program.EntryPoints.Add(new EntryPoint(addrBase, program.Architecture.CreateProcessorState()));
            return(RewriteProgram());
        }
Exemplo n.º 13
0
        protected Program RewriteCodeFragment(string s)
        {
            Assembler asm     = new X86TextAssembler(sc, new X86ArchitectureReal());
            var       program = asm.AssembleFragment(Address.SegPtr(0xC00, 0), s);

            program.Platform = new DefaultPlatform(null, program.Architecture);
            Rewrite(program, asm, null);
            return(program);
        }
Exemplo n.º 14
0
        protected Program RewriteCodeFragment32(string s)
        {
            var        arch    = new X86ArchitectureFlat32("x86-protected-32");
            IAssembler asm     = new X86TextAssembler(arch);
            var        program = asm.AssembleFragment(Address.Ptr32(0x00400000), s);

            program.Platform = new DefaultPlatform(null, arch);
            Rewrite(program, asm, (string)null);
            return(program);
        }
Exemplo n.º 15
0
        protected Program RewriteCodeFragment(string s)
        {
            var        arch    = new X86ArchitectureReal("x86-real-16");
            IAssembler asm     = new X86TextAssembler(arch);
            var        program = asm.AssembleFragment(Address.SegPtr(0xC00, 0), s);

            program.Platform = new MsdosPlatform(null, arch);
            Rewrite(program, asm, (string)null);
            return(program);
        }
Exemplo n.º 16
0
        protected Program RewriteCodeFragment32(string s)
        {
            var        services = new ServiceContainer();
            var        arch     = new X86ArchitectureFlat32(services, "x86-protected-32", new Dictionary <string, object>());
            IAssembler asm      = new X86TextAssembler(arch);
            var        program  = asm.AssembleFragment(Address.Ptr32(0x00400000), s);

            program.Platform = new DefaultPlatform(services, arch);
            Rewrite(program, asm, (string)null);
            return(program);
        }
Exemplo n.º 17
0
        protected Program RewriteCodeFragment(string s)
        {
            var        services = new ServiceContainer();
            var        arch     = new X86ArchitectureReal(services, "x86-real-16", new Dictionary <string, object>());
            IAssembler asm      = new X86TextAssembler(arch);
            var        program  = asm.AssembleFragment(Address.SegPtr(0xC00, 0), s);

            program.Platform = new MsdosPlatform(services, arch);
            Rewrite(program, asm, (string)null);
            return(program);
        }
Exemplo n.º 18
0
        protected Program RewriteX86_32Fragment(string asmFragment, Address addrBase)
        {
            sc = new ServiceContainer();
            sc.AddService <DecompilerEventListener>(new FakeDecompilerEventListener());
            var asm = new X86TextAssembler(sc, new X86ArchitectureFlat32());

            program          = asm.AssembleFragment(addrBase, asmFragment);
            program.Platform = new DefaultPlatform(null, program.Architecture);
            program.EntryPoints.Add(
                addrBase,
                new EntryPoint(addrBase, program.Architecture.CreateProcessorState()));
            return(RewriteProgram());
        }
Exemplo n.º 19
0
        protected Program RewriteX86RealFragment(string asmFragment, Address addrBase)
        {
            sc = new ServiceContainer();
            sc.AddService <DecompilerEventListener>(new FakeDecompilerEventListener());
            var asm = new X86TextAssembler(sc, new X86ArchitectureReal("x86-real-16"));

            program          = asm.AssembleFragment(addrBase, asmFragment);
            program.Platform = new DefaultPlatform(null, program.Architecture);
            program.EntryPoints.Add(
                addrBase,
                ImageSymbol.Procedure(program.Architecture, addrBase));
            return(RewriteProgram());
        }
Exemplo n.º 20
0
        protected Program RewriteX86_32Fragment(string asmFragment, Address addrBase)
        {
            sc = new ServiceContainer();
            sc.AddService <DecompilerEventListener>(new FakeDecompilerEventListener());
            var arch = new X86ArchitectureFlat32(sc, "x86-protected-32", new Dictionary <string, object>());
            var asm  = new X86TextAssembler(arch);

            program          = asm.AssembleFragment(addrBase, asmFragment);
            program.Platform = new DefaultPlatform(sc, program.Architecture);
            program.EntryPoints.Add(
                addrBase,
                ImageSymbol.Procedure(arch, addrBase));
            return(RewriteProgram());
        }
Exemplo n.º 21
0
        protected static Program RewriteMsdosAssembler(string relativePath, string configFile)
        {
            var       arch = new IntelArchitecture(ProcessorMode.Real);
            Program   program;
            Assembler asm = new X86TextAssembler(arch);

            using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
            {
                program          = asm.Assemble(Address.SegPtr(0xC00, 0), rdr);
                program.Platform = new MsdosPlatform(null, arch);
            }
            Rewrite(program, asm, configFile);
            return(program);
        }
Exemplo n.º 22
0
        public void SegmentOverrides()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureReal());
            var program          = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                "foo	proc\r\n"+
                "		mov	bx,[bp+4]\r\n"+
                "		mov	ax,[bx+4]\r\n"+
                "		mov cx,cs:[si+4]\r\n");

            CreateDisassembler16(program.ImageMap.Segments.Values.First().MemoryArea);
            X86Instruction[] instrs = dasm.Take(3).ToArray();
            Assert.AreEqual(Registers.ss, ((MemoryOperand)instrs[0].op2).DefaultSegment);
            Assert.AreEqual(Registers.ds, ((MemoryOperand)instrs[1].op2).DefaultSegment);
            Assert.AreEqual(Registers.cs, ((MemoryOperand)instrs[2].op2).DefaultSegment);
        }
Exemplo n.º 23
0
        public void DisEdiTimes2()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureFlat32());
            var program          = asm.AssembleFragment(Address.SegPtr(0x0B00, 0),
                                                        @"	.i386
	mov ebx,[edi*2]
");

            CreateDisassembler32(program.ImageMap.Segments.Values.First().MemoryArea);
            var           instr = dasm.First();
            MemoryOperand mem   = (MemoryOperand)instr.op2;

            Assert.AreEqual(2, mem.Scale);
            Assert.AreEqual(RegisterStorage.None, mem.Base);
            Assert.AreEqual(Registers.edi, mem.Index);
        }
Exemplo n.º 24
0
 public void DisFpuInstructions()
 {
     using (FileUnitTester fut = new FileUnitTester("Intel/DisFpuInstructions.txt"))
     {
         X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureReal());
         Program          lr;
         using (var rdr = new StreamReader(FileUnitTester.MapTestPath("Fragments/fpuops.asm")))
         {
             lr = asm.Assemble(Address.SegPtr(0xC32, 0), rdr);
         }
         CreateDisassembler16(lr.ImageMap.Segments.Values.First().MemoryArea);
         foreach (X86Instruction instr in dasm)
         {
             fut.TextWriter.WriteLine("{0}", instr.ToString());
         }
         fut.AssertFilesEqual();
     }
 }
Exemplo n.º 25
0
 private Program RewriteFile32(string relativePath, string configFile)
 {
     Program program;
     var asm = new X86TextAssembler(sc, new X86ArchitectureReal());
     using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
     {
         if (this.platform == null)
         {
             this.platform = new Reko.Environments.Windows.Win32Platform(sc, new X86ArchitectureFlat32());
         }
         asm.Platform = this.platform;
         program = asm.Assemble(Address.Ptr32(0x10000000), rdr);
     }
     foreach (var item in asm.ImportReferences)
     {
         program.ImportReferences.Add(item.Key, item.Value);
     }
     Rewrite(program, asm, configFile);
     return program;
 }
Exemplo n.º 26
0
        private void RunTest(string sourceFile, string outputFile)
        {
            Program program;
            var     asm = new X86TextAssembler(new X86ArchitectureFlat32(services, "x86-protected-32", new Dictionary <string, object>()));

            using (StreamReader rdr = new StreamReader(FileUnitTester.MapTestPath(sourceFile)))
            {
                program          = asm.Assemble(Address.Ptr32(0x10000000), rdr);
                program.Platform = new Win32Platform(services, program.Architecture);
                program.User.Heuristics.Add("shingle");
            }
            foreach (var item in asm.ImportReferences)
            {
                program.ImportReferences.Add(item.Key, item.Value);
            }
            var project = new Project {
                Programs = { program }
            };
            Scanner scan = new Scanner(
                program,
                project.LoadedMetadata,
                new DynamicLinker(project, program, eventListener),
                services);

            foreach (var ep in asm.EntryPoints)
            {
                scan.EnqueueImageSymbol(ep, true);
            }
            scan.ScanImage();

            using (FileUnitTester fut = new FileUnitTester(outputFile))
            {
                foreach (Procedure proc in program.Procedures.Values)
                {
                    proc.Write(true, fut.TextWriter);
                    fut.TextWriter.WriteLine();
                }
                fut.AssertFilesEqual();
            }
        }
Exemplo n.º 27
0
        private void RunTest(string sourceFile, string outputFile)
        {
            Program program;
            var     asm = new X86TextAssembler(new X86ArchitectureFlat32());

            using (StreamReader rdr = new StreamReader(FileUnitTester.MapTestPath(sourceFile)))
            {
                program          = asm.Assemble(Address.Ptr32(0x10000000), rdr);
                program.Platform = win32;
            }
            foreach (var item in asm.ImportReferences)
            {
                program.ImportReferences.Add(item.Key, item.Value);
            }
            var project = new Project {
                Programs = { program }
            };
            Scanner scan = new Scanner(
                program,
                new Dictionary <Address, ProcedureSignature>(),
                new ImportResolver(project),
                new FakeDecompilerEventListener());

            foreach (var ep in asm.EntryPoints)
            {
                scan.EnqueueEntryPoint(ep);
            }
            scan.ScanImage();

            using (FileUnitTester fut = new FileUnitTester(outputFile))
            {
                foreach (Procedure proc in program.Procedures.Values)
                {
                    proc.Write(true, fut.TextWriter);
                    fut.TextWriter.WriteLine();
                }
                fut.AssertFilesEqual();
            }
        }
Exemplo n.º 28
0
        protected Program RewriteMsdosAssembler(string relativePath, Action <Program> postLoad)
        {
            var arch   = new X86ArchitectureReal(sc, "x86-real-16", new Dictionary <string, object>());
            var cfgSvc = new Mock <IConfigurationService>();
            var env    = new Mock <PlatformDefinition>();
            var tlSvc  = new Mock <ITypeLibraryLoaderService>();

            cfgSvc.Setup(c => c.GetEnvironment("ms-dos")).Returns(env.Object);
            env.Setup(e => e.TypeLibraries).Returns(new List <TypeLibraryDefinition>());
            env.Setup(e => e.CharacteristicsLibraries).Returns(new List <TypeLibraryDefinition>());
            sc.AddService <IConfigurationService>(cfgSvc.Object);
            sc.AddService <ITypeLibraryLoaderService>(tlSvc.Object);
            Program    program;
            IAssembler asm = new X86TextAssembler(arch);

            using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
            {
                program          = asm.Assemble(Address.SegPtr(0xC00, 0), rdr);
                program.Platform = new MsdosPlatform(sc, arch);
            }
            Rewrite(program, asm, postLoad);
            return(program);
        }
Exemplo n.º 29
0
        public void DisEdiTimes2()
        {
            X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureFlat32());
            var program = asm.AssembleFragment(Address.SegPtr(0x0B00, 0),
                @"	.i386
	mov ebx,[edi*2]
");
            CreateDisassembler32(program.Image);
            var instr = dasm.First();
            MemoryOperand mem = (MemoryOperand)instr.op2;
            Assert.AreEqual(2, mem.Scale);
            Assert.AreEqual(RegisterStorage.None, mem.Base);
            Assert.AreEqual(Registers.edi, mem.Index);
        }
Exemplo n.º 30
0
        public void SegmentOverrides()
        {
            X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureReal());
            var program = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                "foo	proc\r\n" +
                "		mov	bx,[bp+4]\r\n" +
                "		mov	ax,[bx+4]\r\n" +
                "		mov cx,cs:[si+4]\r\n");

            CreateDisassembler16(program.Image);
            IntelInstruction[] instrs = dasm.Take(3).ToArray();
            Assert.AreEqual(Registers.ss, ((MemoryOperand)instrs[0].op2).DefaultSegment);
            Assert.AreEqual(Registers.ds, ((MemoryOperand)instrs[1].op2).DefaultSegment);
            Assert.AreEqual(Registers.cs, ((MemoryOperand)instrs[2].op2).DefaultSegment);
        }
Exemplo n.º 31
0
        public void Extensions()
        {
            X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureReal());
            var program = asm.AssembleFragment(
                Address.SegPtr(0xA14, 0),
@"		.i86
foo		proc
		movsx	ecx,word ptr [bp+8]
		movzx   edx,cl
		movsx	ebx,bx
		movzx	ax,byte ptr [bp+04]
");
            CreateDisassembler16(program.Image);
            StringBuilder sb = new StringBuilder();
            foreach (var ii in dasm.Take(4))
            {
                sb.AppendLine(string.Format("{0}", ii.ToString()));
            }
            string s = sb.ToString();
            Assert.AreEqual(
@"movsx	ecx,word ptr [bp+08]
movzx	edx,cl
movsx	ebx,bx
movzx	ax,byte ptr [bp+04]
", s);
        }
Exemplo n.º 32
0
		private void RunTest(string sourceFile, string outputFile)
		{
			Program program;
            var asm = new X86TextAssembler(new X86ArchitectureFlat32());
            using (StreamReader rdr = new StreamReader(FileUnitTester.MapTestPath(sourceFile)))
            {
                program = asm.Assemble(Address.Ptr32(0x10000000), rdr);
                program.Platform = win32;
            }
            foreach (var item in asm.ImportReferences)
            {
                program.ImportReferences.Add(item.Key, item.Value);
            }
            var project = new Project { Programs = { program } };
            Scanner scan = new Scanner(
                program,
                new Dictionary<Address, ProcedureSignature>(),
                new ImportResolver(project),
                new FakeDecompilerEventListener());
            foreach (var ep in asm.EntryPoints)
            {
                scan.EnqueueEntryPoint(ep);
            }
            scan.ScanImage();

			using (FileUnitTester fut = new FileUnitTester(outputFile))
			{
				foreach (Procedure proc in program.Procedures.Values)
				{
					proc.Write(true, fut.TextWriter);
					fut.TextWriter.WriteLine();
				}
				fut.AssertFilesEqual();
			}
		}
Exemplo n.º 33
0
 public void Setup()
 {
     arch = new IntelArchitecture(ProcessorMode.Real);
     asm  = new X86TextAssembler(arch);
 }
Exemplo n.º 34
0
        public void Dis_x86_StringOps()
        {
            X86TextAssembler asm = new X86TextAssembler(sc, new X86ArchitectureFlat32());
            var lr = asm.AssembleFragment(
                Address.Ptr32(0x01001000),

                "movsb\r\n" +
                "movsw\r\n" +
                "movsd\r\n" +

                "scasb\r\n" +
                "scasw\r\n" +
                "scasd\r\n" +

                "cmpsb\r\n" +
                "cmpsw\r\n" +
                "cmpsd\r\n" +

                "lodsb\r\n" +
                "lodsw\r\n" +
                "lodsd\r\n" +

                "stosb\r\n" +
                "stosw\r\n" +
                "stosd\r\n");

            MemoryArea img = lr.SegmentMap.Segments.Values.First().MemoryArea;

            CreateDisassembler32(img);
            var instructions = dasm.GetEnumerator();

            List <X86Instruction> instr = new List <X86Instruction>();

            for (int i = 0; i < 5 * 3; i++)
            {
                instr.Add(DisEnumerator_TakeNext(instructions));
            }
            Assert.AreEqual(Opcode.movsb, instr[0].code);
            Assert.AreEqual(Opcode.movs, instr[1].code);
            Assert.AreEqual("word16", instr[1].dataWidth.Name);
            Assert.AreEqual(Opcode.movs, instr[2].code);
            Assert.AreEqual("word32", instr[2].dataWidth.Name);

            Assert.AreEqual(Opcode.scasb, instr[3].code);
            Assert.AreEqual(Opcode.scas, instr[4].code);
            Assert.AreEqual("word16", instr[4].dataWidth.Name);
            Assert.AreEqual(Opcode.scas, instr[5].code);
            Assert.AreEqual("word32", instr[5].dataWidth.Name);

            Assert.AreEqual(Opcode.cmpsb, instr[6].code);
            Assert.AreEqual(Opcode.cmps, instr[7].code);
            Assert.AreEqual("word16", instr[7].dataWidth.Name);
            Assert.AreEqual(Opcode.cmps, instr[8].code);
            Assert.AreEqual("word32", instr[8].dataWidth.Name);

            Assert.AreEqual(Opcode.lodsb, instr[9].code);
            Assert.AreEqual(Opcode.lods, instr[10].code);
            Assert.AreEqual("word16", instr[10].dataWidth.Name);
            Assert.AreEqual(Opcode.lods, instr[11].code);
            Assert.AreEqual("word32", instr[11].dataWidth.Name);

            Assert.AreEqual(Opcode.stosb, instr[12].code);
            Assert.AreEqual(Opcode.stos, instr[13].code);
            Assert.AreEqual("word16", instr[13].dataWidth.Name);
            Assert.AreEqual(Opcode.stos, instr[14].code);
            Assert.AreEqual("word32", instr[14].dataWidth.Name);
        }
Exemplo n.º 35
0
 protected static Program RewriteMsdosAssembler(string relativePath, string configFile)
 {
     var arch = new IntelArchitecture(ProcessorMode.Real);
     Program program;
     Assembler asm = new X86TextAssembler(arch);
     using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
     {
         program = asm.Assemble(Address.SegPtr(0xC00, 0), rdr);
         program.Platform = new MsdosPlatform(null, arch);
     }
     Rewrite(program, asm, configFile);
     return program;
 }
Exemplo n.º 36
0
 private Program RewriteFile32(string relativePath, string configFile)
 {
     Program program;
     var asm = new X86TextAssembler(new X86ArchitectureReal());
     using (var rdr = new StreamReader(FileUnitTester.MapTestPath(relativePath)))
     {
         if (this.platform == null)
         {
             this.platform = new Decompiler.Environments.Win32.Win32Platform(null, new X86ArchitectureFlat32());
         }
         asm.Platform = this.platform;
         program = asm.Assemble(Address.Ptr32(0x10000000), rdr);
     }
     foreach (var item in asm.ImportReferences)
     {
         program.ImportReferences.Add(item.Key, item.Value);
     }
     Rewrite(program, asm, configFile);
     return program;
 }
Exemplo n.º 37
0
        public void Rotations()
        {
            X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureReal());
            var lr = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                "foo	proc\r\n" +
                "rol	ax,cl\r\n" +
                "ror	word ptr [bx+2],cl\r\n" +
                "rcr	word ptr [bp+4],4\r\n" +
                "rcl	ax,1\r\n");

            LoadedImage img = lr.Image;
            CreateDisassembler16(img.CreateLeReader(img.BaseAddress));
            StringBuilder sb = new StringBuilder();
            foreach (var instr in dasm.Take(4))
            {
                sb.AppendFormat("{0}\r\n", instr.ToString());
            }
            string s = sb.ToString();
            Assert.AreEqual(
                "rol\tax,cl\r\n" +
                "ror\tword ptr [bx+02],cl\r\n" +
                "rcr\tword ptr [bp+04],04\r\n" +
                "rcl\tax,01\r\n", s);
        }
Exemplo n.º 38
0
 protected Program RewriteCodeFragment(string s)
 {
     Assembler asm = new X86TextAssembler(new X86ArchitectureReal());
     var program = asm.AssembleFragment(Address.SegPtr(0xC00, 0), s);
     program.Platform = new DefaultPlatform(null, program.Architecture);
     Rewrite(program, asm, null);
     return program;
 }
Exemplo n.º 39
0
        public void X86Dis_Sequence()
        {
            X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureReal());
            var program = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                @"	mov	ax,0
	cwd
foo:
	lodsb	
	dec		cx
	jnz		foo
");

            CreateDisassembler16(program.Image);
            StringBuilder sb = new StringBuilder();
            foreach (var instr in dasm.Take(5))
            {
                Address addr = instr.Address;
                sb.AppendFormat("{0}\t{1}\r\n", addr, instr.ToString());
            }

            string s = sb.ToString();
            Assert.AreEqual(
                "0B96:0000\tmov\tax,0000\r\n" +
                "0B96:0003\tcwd\t\r\n" +
                "0B96:0004\tlodsb\t\r\n" +
                "0B96:0005\tdec\tcx\r\n" +
                "0B96:0006\tjnz\t0004\r\n",
                s);
        }
Exemplo n.º 40
0
		public void Setup()
		{
            arch = new IntelArchitecture(ProcessorMode.Real);
            asm = new X86TextAssembler(arch);
        }
Exemplo n.º 41
0
 public void DisFpuInstructions()
 {
     using (FileUnitTester fut = new FileUnitTester("Intel/DisFpuInstructions.txt"))
     {
         X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureReal());
         Program lr;
         using (var rdr = new StreamReader(FileUnitTester.MapTestPath("Fragments/fpuops.asm")))
         {
             lr = asm.Assemble(Address.SegPtr(0xC32, 0), rdr);
         }
         CreateDisassembler16(lr.Image);
         foreach (IntelInstruction instr in dasm)
         {
             fut.TextWriter.WriteLine("{0}", instr.ToString());
         }
         fut.AssertFilesEqual();
     }
 }