コード例 #1
0
        protected static Arm32Instruction Disassemble(byte[] bytes)
        {
            var image = new MemoryArea(Address.Ptr32(0x00100000), bytes);
            var dasm  = new Arm32Disassembler(new Arm32ProcessorArchitecture(), image.CreateLeReader(0));

            return(dasm.First());
        }
コード例 #2
0
        protected static MachineInstruction Disassemble(byte[] bytes)
        {
            var image = new MemoryArea(Address.Ptr32(0x00100000), bytes);
            var dasm  = new Arm32Architecture("arm32").CreateDisassembler(image.CreateLeReader(0));

            return(dasm.First());
        }
コード例 #3
0
ファイル: C64BasicReader.cs プロジェクト: chostelet/reko
        public C64BasicInstruction ReadLine(Address addr)
        {
            var rdr = image.CreateLeReader(addr);

            if (!rdr.TryReadLeUInt16(out ushort next))
            {
                return(null);
            }
            if (!rdr.TryReadLeUInt16(out ushort line))
            {
                return(null);
            }
            if (next < 0x0801)
            {
                return(null);
            }
            var mem = new List <byte>();

            while (rdr.TryReadByte(out byte b) && b != 0)
            {
                mem.Add(b);
            }
            return(new C64BasicInstruction
            {
                Address = Address.Ptr16(line),
                Length = (int)(rdr.Address - addr),
                NextAddress = next,
                Line = mem.ToArray()
            });
        }
コード例 #4
0
ファイル: C64BasicReader.cs プロジェクト: smx-smx/reko
        public C64BasicInstruction ReadLine(Address addr)
        {
            var    rdr = image.CreateLeReader(addr);
            ushort next;
            ushort line;
            byte   b;

            if (!rdr.TryReadLeUInt16(out next))
            {
                return(null);
            }
            if (!rdr.TryReadLeUInt16(out line))
            {
                return(null);
            }
            if (next < 0x0801)
            {
                return(null);
            }
            var mem = new MemoryStream();

            while (rdr.TryReadByte(out b) && b != 0)
            {
                mem.WriteByte(b);
            }
            return(new C64BasicInstruction
            {
                Address = Address.Ptr16(line),
                NextAddress = next,
                Line = mem.ToArray()
            });
        }
コード例 #5
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.SegmentMap.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);
        }
コード例 #6
0
 protected override IEnumerable <RtlInstructionCluster> GetRtlStream(MemoryArea mem, IStorageBinder binder, IRewriterHost host)
 {
     return(new AlphaRewriter(
                arch,
                mem.CreateLeReader(0),
                binder,
                host));
 }
コード例 #7
0
ファイル: X86DisassemblerTests.cs プロジェクト: Godzil/reko
        private X86Instruction Disassemble32(params byte[] bytes)
        {
            var img  = new MemoryArea(Address.Ptr32(0x10000), bytes);
            var rdr  = img.CreateLeReader(img.BaseAddress);
            var dasm = new X86Disassembler(ProcessorMode.Protected32, rdr, PrimitiveType.Word32, PrimitiveType.Word32, false);

            return(dasm.First());
        }
コード例 #8
0
ファイル: TypedDataDumperTests.cs プロジェクト: zan00789/reko
        private void Given_TypedDataDumper(byte[] bytes)
        {
            this.sw = new StringWriter();
            var fmt = new TextFormatter(sw);
            var mem = new MemoryArea(Address.Ptr32(0x00123400), bytes);
            var rdr = mem.CreateLeReader(0);

            this.tdd = new TypedDataDumper(rdr, (uint)mem.Length, fmt);
        }
コード例 #9
0
ファイル: X86DisassemblerTests.cs プロジェクト: Godzil/reko
 private void CreateDisassembler32(MemoryArea image)
 {
     dasm = new X86Disassembler(
         ProcessorMode.Protected32,
         image.CreateLeReader(image.BaseAddress),
         PrimitiveType.Word32,
         PrimitiveType.Word32,
         false);
 }
コード例 #10
0
ファイル: CilDisassemblerTests.cs プロジェクト: erenes/reko
        private void RunTest(string sExp, params byte[] bytes)
        {
            var image = new MemoryArea(Address.Ptr32(0x0100000), bytes);
            var dasm  = new CilDisassembler(image.CreateLeReader(0)).GetEnumerator();

            Assert.IsTrue(dasm.MoveNext());
            var instr = dasm.Current;

            Assert.AreEqual(sExp, instr.ToString());
        }
コード例 #11
0
 /// <summary>
 /// Establishes a disassembler instance for further tests.
 /// </summary>
 /// <param name="instrs"></param>
 private void Given_Instructions(params ushort[] instrs)
 {
     var w = new LeImageWriter();
     foreach (var instr in instrs)
     {
         w.WriteLeUInt16(instr);
     }
     var image = new MemoryArea(Address.Ptr32(0x00100000), w.ToArray());
     var arch = CreateArchitecture();
     this.dasm = CreateDisassembler(arch, image.CreateLeReader(0));
 }
コード例 #12
0
ファイル: ArmArchitectureTests.cs プロジェクト: zan00789/reko
        public void ArmArch_CreateRewriter()
        {
            this.arch = new Arm32Architecture("arm32");
            var mem = new MemoryArea(Address.Ptr32(0x00123400), new byte[] { 0x03, 0x10, 0x12, 0xE0 });

            var rdr = mem.CreateLeReader(0);
            var rw  = arch.CreateRewriter(rdr, new AArch32ProcessorState(arch), new StorageBinder(), null);
            var rtl = rw.First().Instructions[0];

            Assert.AreEqual("r1 = r2 & r3", rtl.ToString());
        }
コード例 #13
0
ファイル: ArmArchitectureTests.cs プロジェクト: zan00789/reko
        public void ArmArch_CreateDisassembler()
        {
            this.arch = new Arm32Architecture("arm32");
            var mem = new MemoryArea(Address.Ptr32(0x00123400), new byte[] { 0x03, 0x10, 0x12, 0xE0 });

            var rdr  = mem.CreateLeReader(0);
            var dasm = arch.CreateDisassembler(rdr);
            var str  = dasm.First().ToString();

            Assert.AreEqual("ands\tr1,r2,r3", str);
        }
コード例 #14
0
        public List <DecodedInstruction> Decode(int count = int.MaxValue)
        {
            var decoded = new List <DecodedInstruction>();

            try
            {
                var dasm = arch.CreateDisassembler(memoryArea.CreateLeReader((uint)Offset));

                foreach (var instr in dasm)
                {
                    var len         = instr.Length;
                    var address     = instr.Address.Offset;
                    var instruction = instr.ToString().Replace('\t', ' ');

                    // preference
                    instruction = instruction.Replace(",", ", ");

                    // fix up
                    instruction = ChangeHex(instruction);

                    var sb = new StringBuilder();

                    sb.AppendFormat("{0:x8}", address);
                    sb.Append(' ');
                    sb.Append(BytesToHex(memory, (uint)Offset, len));
                    sb.Append(string.Empty.PadRight(41 - sb.Length, ' '));
                    sb.Append(instruction);

                    decoded.Add(new DecodedInstruction()
                    {
                        Address     = address,
                        Length      = len,
                        Instruction = instruction,
                        Full        = sb.ToString()
                    });

                    count--;

                    if (count == 0)
                    {
                        break;
                    }

                    Offset += (uint)len;
                }

                return(decoded);
            }
            catch
            {
                return(decoded);
            }
        }
コード例 #15
0
ファイル: X86DisassemblerTests.cs プロジェクト: Godzil/reko
        private X86Instruction Disassemble16(params byte[] bytes)
        {
            MemoryArea  img  = new MemoryArea(Address.SegPtr(0xC00, 0), bytes);
            ImageReader rdr  = img.CreateLeReader(img.BaseAddress);
            var         dasm = new X86Disassembler(ProcessorMode.Real, rdr, PrimitiveType.Word16, PrimitiveType.Word16, false);

            if (options != null)
            {
                dasm.Emulate8087 = options.Emulate8087;
            }
            return(dasm.First());
        }
コード例 #16
0
ファイル: XtensaRewriterTests.cs プロジェクト: zan00789/reko
 protected override MemoryArea RewriteCode(uint[] words)
 {
     byte[] bytes = words.SelectMany(w => new byte[]
     {
         (byte) w,
         (byte) (w >> 8),
         (byte) (w >> 16),
         (byte) (w >> 24)
     }).ToArray();
     this.image = new MemoryArea(LoadAddress, bytes);
     var dasm = new XtensaDisassembler(arch, image.CreateLeReader(LoadAddress));
     return image;
 }
コード例 #17
0
ファイル: X86DisassemblerTests.cs プロジェクト: Godzil/reko
 private void CreateDisassembler16(MemoryArea mem)
 {
     dasm = new X86Disassembler(
         ProcessorMode.Real,
         mem.CreateLeReader(mem.BaseAddress),
         PrimitiveType.Word16,
         PrimitiveType.Word16,
         false);
     if (options != null)
     {
         dasm.Emulate8087 = options.Emulate8087;
     }
 }
コード例 #18
0
        protected MachineInstruction DisassembleBits(string bitPattern)
        {
            var           image = new MemoryArea(Address.Ptr32(0x00100000), new byte[4]);
            LeImageWriter w     = new LeImageWriter(image.Bytes);
            uint          instr = ParseBitPattern(bitPattern);

            w.WriteLeUInt32(0, instr);
            var b = image.Bytes;
            //Debug.Print("Instruction bytes: {0:X2} {1:X2} {2:X2} {3:X2}", b[0], b[1], b[2], b[3]); // Spews in the unit tests
            var arch = CreateArchitecture();
            var dasm = arch.CreateDisassembler(image.CreateLeReader(0));

            return(dasm.First());
        }
コード例 #19
0
ファイル: X86DisassemblerTests.cs プロジェクト: Godzil/reko
        public void X86Dis_RelocatedSegment()
        {
            byte[]     image = new byte[] { 0x2E, 0xC7, 0x06, 0x01, 0x00, 0x00, 0x08 }; // mov cs:[0001],0800
            MemoryArea img   = new MemoryArea(Address.SegPtr(0x900, 0), image);

            img.Relocations.AddSegmentReference(5, 0x0800);
            ImageReader rdr = img.CreateLeReader(img.BaseAddress);

            CreateDisassembler16(rdr);
            X86Instruction instr = dasm.First();

            Assert.AreEqual("mov\tword ptr cs:[0001],0800", instr.ToString());
            Assert.AreEqual("selector", instr.op2.Width.ToString());
        }
コード例 #20
0
        protected MachineInstruction Disassemble32(uint instr)
        {
            var           image = new MemoryArea(Address.Ptr32(0x00100000), new byte[4]);
            LeImageWriter w     = new LeImageWriter(image.Bytes);

            w.WriteLeUInt32(0, instr);
            var arch = CreateArchitecture();
            var dasm = CreateDisassembler(arch, image.CreateLeReader(0));

            Assert.IsTrue(dasm.MoveNext());
            this.armInstr = (AArch32Instruction)dasm.Current;
            dasm.Dispose();
            return(armInstr);
        }
コード例 #21
0
ファイル: V850DisassemblerTests.cs プロジェクト: ntzwq/reko
        public void V850Dis_Generate()
        {
            var buf = new byte[10000];
            var rnd = new Random(0x4711);

            rnd.NextBytes(buf);
            var mem  = new MemoryArea(addr, buf);
            var rdr  = mem.CreateLeReader(mem.BaseAddress);
            var dasm = arch.CreateDisassembler(rdr);

            foreach (var instr in dasm)
            {
                dasm.ToString();
            }
        }
コード例 #22
0
        private void RunTest(string sExp, params byte[] bytes)
        {
            var image = new MemoryArea(Address.Ptr32(0x0100000), bytes);
            var sc    = new ServiceContainer();

            sc.AddService <ITestGenerationService>(new UnitTestGenerationService(sc));
            var arch = new CilArchitecture {
                Services = sc,
            };
            var dasm = new CilDisassembler(arch, image.CreateLeReader(0)).GetEnumerator();

            Assert.IsTrue(dasm.MoveNext());
            var instr = dasm.Current;

            Assert.AreEqual(sExp, instr.ToString());
        }
コード例 #23
0
        protected MachineInstruction Disassemble16(params ushort[] instrs)
        {
            var           image = new MemoryArea(Address.Ptr32(0x00100000), new byte[4]);
            LeImageWriter w     = new LeImageWriter(image.Bytes);

            foreach (var instr in instrs)
            {
                w.WriteLeUInt16(instr);
            }
            var arch = CreateArchitecture();
            var dasm = CreateDisassembler(arch, image.CreateLeReader(0));

            Assert.IsTrue(dasm.MoveNext());
            var armInstr = dasm.Current;

            dasm.Dispose();
            return(armInstr);
        }
コード例 #24
0
ファイル: X86DisassemblerTests.cs プロジェクト: Godzil/reko
        public void X86Dis_RelocatedOperand()
        {
            byte[]     image = new byte[] { 0xB8, 0x78, 0x56, 0x34, 0x12 }; // mov eax,0x12345678
            MemoryArea img   = new MemoryArea(Address.Ptr32(0x00100000), image);

            img.Relocations.AddPointerReference(0x00100001ul - img.BaseAddress.ToLinear(), 0x12345678);
            ImageReader     rdr  = img.CreateLeReader(img.BaseAddress);
            X86Disassembler dasm = new X86Disassembler(
                ProcessorMode.Protected32,
                rdr,
                PrimitiveType.Word32,
                PrimitiveType.Word32,
                false);
            X86Instruction instr = dasm.First();

            Assert.AreEqual("mov\teax,12345678", instr.ToString());
            Assert.AreEqual("ptr32", instr.op2.Width.ToString());
        }
コード例 #25
0
        private void Given_Program()
        {
            var addrBase = Address.Ptr32(0x10000);
            var mem      = new MemoryArea(addrBase, new byte[100]);
            var map      = new SegmentMap(
                mem.BaseAddress,
                new ImageSegment("code", mem, AccessMode.ReadWriteExecute));
            var arch = new Mock <IProcessorArchitecture>();
            var dasm = new Mock <IEnumerable <MachineInstruction> >();
            var e    = new Mock <IEnumerator <MachineInstruction> >();

            arch.Setup(a => a.CreateDisassembler(It.IsNotNull <EndianImageReader>())).Returns(dasm.Object);
            arch.Setup(a => a.InstructionBitSize).Returns(8);
            arch.Setup(a => a.CreateImageReader(
                           It.IsNotNull <MemoryArea>(),
                           It.IsNotNull <Address>())).Returns(mem.CreateLeReader(addrBase));
            dasm.Setup(d => d.GetEnumerator()).Returns(e.Object);
            this.program = new Program(map, arch.Object, null);
        }
コード例 #26
0
        private void Given_Program()
        {
            var addrBase = Address.Ptr32(0x10000);
            var mem      = new MemoryArea(addrBase, new byte[100]);
            var map      = new SegmentMap(
                mem.BaseAddress,
                new ImageSegment("code", mem, AccessMode.ReadWriteExecute));
            var arch = mr.Stub <IProcessorArchitecture>();
            var dasm = mr.Stub <IEnumerable <MachineInstruction> >();
            var e    = mr.Stub <IEnumerator <MachineInstruction> >();

            arch.Stub(a => a.CreateDisassembler(Arg <EndianImageReader> .Is.NotNull)).Return(dasm);
            arch.Stub(a => a.InstructionBitSize).Return(8);
            arch.Stub(a => a.CreateImageReader(
                          Arg <MemoryArea> .Is.NotNull,
                          Arg <Address> .Is.NotNull)).Return(mem.CreateLeReader(addrBase));
            dasm.Stub(d => d.GetEnumerator()).Return(e);
            arch.Replay();
            dasm.Replay();
            e.Replay();
            this.program = new Program(map, arch, null);
        }
コード例 #27
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.CreateReader(program.ImageMap.BaseAddress))
            .Return(mem.CreateLeReader(0));
            var state = mr.Stub <ProcessorState>();

            mr.ReplayAll();

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

            Assert.AreEqual(3, vector.Count);
        }
コード例 #28
0
        public void X86Arch_Inline_x86get_pc_thunk_bx()
        {
            arch = new X86ArchitectureFlat32("x86-protected-32");
            var mem = new MemoryArea(Address.Ptr32(0x1000), new byte[]
            {
                0x8B, 0x1C, 0x24,       // mov ebx,[esp]
                0xC3                    // ret
            });
            var cluster = arch.InlineCall(Address.Ptr16(0x1000), Address.Ptr32(0x2305), mem.CreateLeReader(0), arch.CreateFrame());

            Assert.AreEqual(1, cluster.Count);
            Assert.AreEqual("ebx = 00002305", cluster[0].ToString());
        }
コード例 #29
0
        protected override IEnumerable <RtlInstructionCluster> GetInstructionStream(IStorageBinder binder, IRewriterHost host)
        {
            var state = new Mos6502ProcessorState(arch);

            return(new Rewriter(arch, image.CreateLeReader(0), state, new Frame(arch.FramePointerType), host));
        }
コード例 #30
0
        protected override IEnumerable <RtlInstructionCluster> GetRtlStream(MemoryArea mem, IStorageBinder binder, IRewriterHost host)
        {
            var rdr = mem.CreateLeReader(mem.BaseAddress);

            return(arch.CreateRewriter(rdr, arch.CreateProcessorState(), binder, host));
        }