Exemple #1
0
 public Program(SegmentMap segmentMap, IProcessorArchitecture arch, IPlatform platform) : this()
 {
     this.SegmentMap   = segmentMap;
     this.ImageMap     = segmentMap.CreateImageMap();
     this.Architecture = arch;
     this.Platform     = platform;
 }
Exemple #2
0
 public Program(SegmentMap segmentMap, IProcessorArchitecture arch, IPlatform platform) : this()
 {
     this.SegmentMap = segmentMap;
     this.ImageMap = segmentMap.CreateImageMap();
     this.Architecture = arch;
     this.Platform = platform;
 }
Exemple #3
0
        /// <summary>
        /// Seed the imagemap with image symbols
        /// </summary>
        public void BuildImageMap()
        {
            if (!this.NeedsScanning)
            {
                return;
            }
            this.ImageMap = SegmentMap.CreateImageMap();
            foreach (var sym in this.ImageSymbols.Values.Where(
                         s => s.Type == SymbolType.Data && s.DataType.BitSize != 0))
            {
                this.ImageMap.AddItemWithSize(
                    sym.Address,
                    new ImageMapItem
                {
                    Address  = sym.Address,
                    DataType = sym.DataType,
                    Size     = (uint)sym.DataType.Size,
                });
            }
            var tlDeser = CreateTypeLibraryDeserializer();

            foreach (var kv in User.Globals)
            {
                var dt   = kv.Value.DataType.Accept(tlDeser);
                var size = GetDataSize(Architecture, kv.Key, dt);
                var item = new ImageMapItem(size)
                {
                    Address  = kv.Key,
                    DataType = dt,
                    Name     = kv.Value.Name,
                };
                if (item.Size > 0)
                {
                    this.ImageMap.AddItemWithSize(kv.Key, item);
                }
                else
                {
                    this.ImageMap.AddItem(kv.Key, item);
                }
                //$BUGBUG: what about x86 segmented binaries?
                int offset = (int)kv.Key.ToLinear();
                GlobalFields.Fields.Add(offset, dt, kv.Value.Name);
            }
        }
Exemple #4
0
        private void chkShowData_CheckedChanged(object sender, EventArgs e)
        {
            if (chkShowData.Checked)
            {
                var mem = new MemoryArea(Address.Ptr32(0x00100000), new byte[2560]);
                var segMap = new SegmentMap(mem.BaseAddress,
                    new ImageSegment("", mem, AccessMode.ReadWriteExecute));
                var imgMap = segMap.CreateImageMap();
                imgMap.AddItemWithSize(Address.Ptr32(0x00100000), new ImageMapBlock { Size = 30 });
                imgMap.AddItemWithSize(Address.Ptr32(0x00100100), new ImageMapBlock { Size = 300 });
                imgMap.AddItemWithSize(Address.Ptr32(0x00100500), new ImageMapBlock { Size = 600 });
                memoryControl1.Architecture = new X86ArchitectureFlat32();

                imageMapView1.ImageMap = imgMap;
            }
            else
            {
                memoryControl1.Architecture = null;
            }
        }
 private void Given_Program(byte[] bytes)
 {
     var addr = Address.Ptr32(0x1000);
     var mem = new MemoryArea(addr, bytes);
     this.segmentMap = new SegmentMap(
             mem.BaseAddress,
             new ImageSegment(
                 "code", mem, AccessMode.ReadWriteExecute));
     this.imageMap = segmentMap.CreateImageMap();
     this.program = new Program(
         segmentMap,
         arch, 
         new DefaultPlatform(null, arch));
     this.program.ImageMap = imageMap;
 }
Exemple #6
0
 public Scanner(
     Program program, 
     IImportResolver importResolver,
     IServiceProvider services)
 {
     this.program = program;
     this.segmentMap = program.SegmentMap;
     this.importResolver = importResolver;
     this.Services = services;
     this.eventListener = services.RequireService<DecompilerEventListener>();
     this.cancelSvc = services.GetService<CancellationTokenSource>();
     if (segmentMap == null)
         throw new InvalidOperationException("Program must have an segment map.");
     if (program.ImageMap == null)
     {
         program.ImageMap = segmentMap.CreateImageMap();
     }
     this.imageMap = program.ImageMap;
     this.queue = new PriorityQueue<WorkItem>();
     this.blocks = new SortedList<Address, BlockRange>();
     this.blockStarts = new Dictionary<Block, Address>();
     this.pseudoProcs = program.PseudoProcedures;
     this.importReferences = program.ImportReferences;
     this.visitedProcs = new HashSet<Procedure>();
     this.noDecompiledProcs = new Dictionary<Address, Procedure_v1>();
 }
Exemple #7
0
 public void Im_CreateCoveringItem()
 {
     var segmentMap = new SegmentMap(Address.Ptr32(0x01000),
         new ImageSegment(
             ".text", 
             new MemoryArea(Address.Ptr32(0x01010), new byte[0x10]),
             AccessMode.ReadExecute));
     var map = segmentMap.CreateImageMap();
     Assert.AreEqual(1, map.Items.Count);
     var item = map.Items.Values.First();
     Assert.AreEqual(Address.Ptr32(0x1010), item.Address);
     Assert.AreEqual(16, item.Size);
 }
Exemple #8
0
        public void Im_RemoveItem_DoNotMergeDisjointItems()
        {
            var mem = new MemoryArea(addrBase, new byte[0x0100]);
            var segmentMap = new SegmentMap(addrBase,
                new ImageSegment("", mem, AccessMode.ReadWriteExecute));
            var codeAddr = addrBase;
            var dataAddr = addrBase + 0x1000;
            var textAddr = addrBase + 0x2000;
            segmentMap.AddSegment(codeAddr, "code", AccessMode.ReadWrite, 0x100);
            segmentMap.AddSegment(dataAddr, "data", AccessMode.ReadWrite, 0x4);
            segmentMap.AddSegment(textAddr, "text", AccessMode.ReadWrite, 0x100);

            var map = segmentMap.CreateImageMap();

            CreateImageMapItem(map, PrimitiveType.Int32, addrBase + 0x1000);

            map.Dump();

            CheckImageMapTypes(map, "<unknown>", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:1000", "8000:2000");
            CheckImageMapSizes(map, 0x100, 0x4, 0x100);

            map.RemoveItem(codeAddr);
            CheckImageMapTypes(map, "<unknown>", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:1000", "8000:2000");
            CheckImageMapSizes(map, 0x100, 0x4, 0x100);

            map.RemoveItem(dataAddr);
            CheckImageMapTypes(map, "<unknown>", "<unknown>", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:1000", "8000:2000");
            CheckImageMapSizes(map, 0x100, 0x4, 0x100);

            map.RemoveItem(textAddr);
            CheckImageMapTypes(map, "<unknown>", "<unknown>", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:1000", "8000:2000");
            CheckImageMapSizes(map, 0x100, 0x4, 0x100);
        }
Exemple #9
0
        public void Im_RemoveItem()
        {
            var segmentMap = new SegmentMap(addrBase,
                new ImageSegment("code", addrBase, 0x100, AccessMode.ReadWrite));
            var map = segmentMap.CreateImageMap();

            var itemAddress1 = addrBase;
            var itemAddress2 = CreateImageMapItem(map, PrimitiveType.Int32);
            var itemAddress3 = CreateImageMapItem(map, PrimitiveType.Int32);
            var itemAddress4 = CreateImageMapItem(map, PrimitiveType.Int32);
            var itemAddress5 = CreateImageMapItem(map, PrimitiveType.Int32);

            map.Dump();

            Assert.AreEqual(5, map.Items.Count);

            map.RemoveItem(itemAddress5);
            CheckImageMapTypes(map, "int32", "int32", "int32", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:0004", "8000:0008", "8000:000C", "8000:0010");
            CheckImageMapSizes(map, 4, 4, 4, 4, 240);

            map.RemoveItem(itemAddress1);
            CheckImageMapTypes(map, "<unknown>", "int32", "int32", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:0004", "8000:0008", "8000:000C", "8000:0010");
            CheckImageMapSizes(map, 4, 4, 4, 4, 240);

            map.RemoveItem(itemAddress3);
            CheckImageMapTypes(map, "<unknown>", "int32", "<unknown>", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:0004", "8000:0008", "8000:000C", "8000:0010");
            CheckImageMapSizes(map, 4, 4, 4, 4, 240);

            map.RemoveItem(itemAddress2);
            CheckImageMapTypes(map, "<unknown>", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:000C", "8000:0010");
            CheckImageMapSizes(map, 12, 4, 240);

            CreateImageMapItem(map, PrimitiveType.Int32, itemAddress3);
            map.RemoveItem(itemAddress4);
            CheckImageMapTypes(map, "<unknown>", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:0008", "8000:000C");
            CheckImageMapSizes(map, 8, 4, 244);

            CreateImageMapItem(map, PrimitiveType.Int32, itemAddress4);
            map.RemoveItem(itemAddress3);
            CheckImageMapTypes(map, "<unknown>", "int32", "<unknown>");
            CheckImageMapAddresses(map, "8000:0000", "8000:000C", "8000:0010");
            CheckImageMapSizes(map, 12, 4, 240);

            map.RemoveItem(itemAddress4);
            CheckImageMapTypes(map, "<unknown>");
            CheckImageMapAddresses(map, "8000:0000");
            CheckImageMapSizes(map, 256);
        }
Exemple #10
0
 public void Im_CreateItem_AtExistingRange()
 {
     var segmentMap = new SegmentMap(addrBase,
         new ImageSegment("code", addrBase, 0x100, AccessMode.ReadWrite));
     var map = segmentMap.CreateImageMap();
     map.AddItemWithSize(
         addrBase,
         new ImageMapItem(0x10) { DataType = new ArrayType(PrimitiveType.Byte, 0x10) });
     map.Dump();
     ImageMapItem item;
     Assert.IsTrue(map.TryFindItemExact(addrBase, out item));
     Assert.AreEqual("(arr byte 16)", item.DataType.ToString());
     Assert.IsTrue(map.TryFindItemExact(addrBase + 0x10, out item));
     Assert.IsInstanceOf<UnknownType>(item.DataType);
 }
Exemple #11
0
 public void Im_CreateItem_MiddleOfEmptyRange()
 {
     var mem = new MemoryArea(addrBase, new byte[0x100]);
     var segmentMap = new SegmentMap(addrBase,
         new ImageSegment("code", mem, AccessMode.ReadWriteExecute));
     var map = segmentMap.CreateImageMap();
     map.AddItemWithSize(
         addrBase + 0x10,
         new ImageMapItem(0x10) { DataType = new ArrayType(PrimitiveType.Byte, 10) });
     map.Dump();
     Assert.AreEqual(3, map.Items.Count);
     ImageMapItem item;
     Assert.IsTrue(map.TryFindItemExact(addrBase, out item));
     Assert.AreEqual(0x10, item.Size);
     Assert.IsInstanceOf<UnknownType>(item.DataType);
 }
 private void Given_ExecutableProgram(string exeName, Address address)
 {
     var bytes = new byte[0x1000];
     var mem = new MemoryArea(address, bytes);
     var segmentMap = new SegmentMap(address,
             new ImageSegment(".text", mem, AccessMode.ReadWriteExecute));
     var program = new Program
     {
         Architecture = arch,
         Platform = mockFactory.CreatePlatform(),
         SegmentMap = segmentMap,
         ImageMap = segmentMap.CreateImageMap()
     };
     loader.Stub(l => l.LoadImageBytes(
         Arg<string>.Matches(s => s.EndsWith(exeName)),
         Arg<int>.Is.Anything)).Return(bytes);
     loader.Stub(l => l.LoadExecutable(
         Arg<string>.Matches(s => s.EndsWith(exeName)),
         Arg<byte[]>.Is.NotNull,
         Arg<Address>.Is.Null)).Return(program);
 }