Exemple #1
0
        public override void Render(ImageMapSegment segment, Program program, Formatter formatter)
        {
            var entries = shdr.sh_size / shdr.sh_entsize;
            var symtab  = (int)shdr.sh_link;
            var rdr     = loader.CreateReader(shdr.sh_offset);

            for (int i = 0; i < entries; ++i)
            {
                uint offset;
                if (!rdr.TryReadUInt32(out offset))
                {
                    return;
                }
                uint info;
                if (!rdr.TryReadUInt32(out info))
                {
                    return;
                }
                int addend;
                if (!rdr.TryReadInt32(out addend))
                {
                    return;
                }

                uint   sym    = info >> 8;
                string symStr = loader.GetSymbol(symtab, (int)sym);
                formatter.Write("{0:X8} {1,3} {2:X8} {3:X8} {4}", offset, info & 0xFF, sym, addend, symStr);
                formatter.WriteLine();
            }
        }
Exemple #2
0
        public void ImageMapCreation()
        {
            ImageMap im = new ImageMap(addrBase, img.Length);

            im.AddSegment(Address.SegPtr(0x8000, 2), "", AccessMode.ReadWrite, 0);
            im.AddSegment(Address.SegPtr(0x8000, 3), "", AccessMode.ReadWrite, 0);
            im.AddSegment(Address.SegPtr(0x8000, 0), "", AccessMode.ReadWrite, 0);

            // Verify

            IEnumerator <KeyValuePair <Address, ImageMapSegment> > e = im.Segments.GetEnumerator();

            Assert.IsTrue(e.MoveNext());
            ImageMapSegment seg = e.Current.Value;

            Assert.AreEqual(2, seg.Size);

            Assert.IsTrue(e.MoveNext());
            seg = e.Current.Value;
            Assert.AreEqual(1, seg.Size);

            Assert.IsTrue(e.MoveNext());
            seg = e.Current.Value;
            Assert.AreEqual(1, seg.Size);

            Assert.IsTrue(!e.MoveNext());
        }
Exemple #3
0
 public override void Initialize(object obj)
 {
     this.segment              = (ImageMapSegment)obj;
     base.TreeNode.Text        = segment.Name;
     base.TreeNode.ImageName   = GetImageName();
     base.TreeNode.ToolTipText = GetTooltip();
     PopulateChildren();
 }
Exemple #4
0
 public void DisplayImageSegment(ImageMapSegment segment, Program program)
 {
     if (segment == null)
     {
         return;
     }
     ShowWindow("imageSegmentViewer", "Segment: " + segment.Name, program, pane);
     pane.DisplaySegment(segment, program);
 }
Exemple #5
0
        public void AddNamedSegment()
        {
            ImageMap map = new ImageMap(Address.SegPtr(0x0B00, 0), 40000);

            map.AddSegment(Address.SegPtr(0xC00, 0), "0C00", AccessMode.ReadWrite, 0);
            IEnumerator <KeyValuePair <Address, ImageMapSegment> > e = map.Segments.GetEnumerator();

            GetNextMapSegment(e);
            ImageMapSegment s = GetNextMapSegment(e);

            Assert.AreEqual("0C00", s.Name);
            Assert.AreEqual(35904, s.Size);
        }
Exemple #6
0
 public void Setup()
 {
     mr   = new MockRepository();
     seg1 = new ImageMapSegment("seg1", AccessMode.Execute)
     {
         Address = Address.Ptr32(0x01000)
     };
     seg2 = new ImageMapSegment("seg2", AccessMode.Execute)
     {
         Address = Address.Ptr32(0x02000)
     };
     map = new ImageMap(seg1.Address, 0x4000);
 }
Exemple #7
0
        public override void Render(ImageMapSegment segment, Program program, Formatter formatter)
        {
            var entries = shdr.sh_size / shdr.sh_entsize;
            var symtab  = (int)shdr.sh_link;
            var rdr     = loader.CreateReader(shdr.sh_offset);

            for (int i = 0; i < entries; ++i)
            {
                uint iName;
                if (!rdr.TryReadUInt32(out iName))
                {
                    return;
                }
                uint value;
                if (!rdr.TryReadUInt32(out value))
                {
                    return;
                }
                uint size;
                if (!rdr.TryReadUInt32(out size))
                {
                    return;
                }
                byte info;
                if (!rdr.TryReadByte(out info))
                {
                    return;
                }
                byte other;
                if (!rdr.TryReadByte(out other))
                {
                    return;
                }
                ushort shIndex;
                if (!rdr.TryReadUInt16(out shIndex))
                {
                    return;
                }
                string symStr  = loader.GetStrPtr(symtab, iName);
                string segName = loader.GetSectionName(shIndex);
                formatter.Write("{0,-40} {1:X8} {2:X8} {3:X2} {4}", symStr, value, size, info & 0xFF, segName);
                formatter.WriteLine();
            }
        }
Exemple #8
0
 public void DisplaySegment(ImageMapSegment segment, Program program)
 {
     try
     {
         if (segmentView == null ||
             segment == null ||
             segment.Designer == null)
         {
             return;
         }
         this.program = program;
         var tsf = new TextSpanFormatter();
         segment.Designer.Render(
             segment,
             program,
             tsf);
         this.segmentView.TextView.Model = tsf.GetModel();
     }
     catch
     {
     }
 }
        public void Setup()
        {
            mr = new MockRepository();

            form = new MainForm();

            prog = new Program();
            prog.Architecture = new IntelArchitecture(ProcessorMode.Real);
            prog.Image        = new LoadedImage(Address.SegPtr(0xC00, 0), new byte[10000]);
            prog.ImageMap     = prog.Image.CreateImageMap();

            prog.ImageMap.AddSegment(Address.SegPtr(0x0C10, 0), "0C10", AccessMode.ReadWrite, 0);
            prog.ImageMap.AddSegment(Address.SegPtr(0x0C20, 0), "0C20", AccessMode.ReadWrite, 0);
            mapSegment1 = prog.ImageMap.Segments.Values[0];
            mapSegment2 = prog.ImageMap.Segments.Values[1];

            sc     = new ServiceContainer();
            decSvc = new DecompilerService();

            sc.AddService(typeof(IDecompilerService), decSvc);
            sc.AddService(typeof(IWorkerDialogService), new FakeWorkerDialogService());
            sc.AddService(typeof(DecompilerEventListener), new FakeDecompilerEventListener());
            sc.AddService(typeof(IStatusBarService), new FakeStatusBarService());
            uiSvc  = AddService <IDecompilerShellUiService>();
            memSvc = AddService <ILowLevelViewService>();

            ILoader ldr = mr.StrictMock <ILoader>();

            ldr.Stub(l => l.LoadImageBytes("test.exe", 0)).Return(new byte[400]);
            ldr.Stub(l => l.LoadExecutable(
                         Arg <string> .Is.NotNull,
                         Arg <byte[]> .Is.NotNull,
                         Arg <Address> .Is.Null)).Return(prog);
            ldr.Replay();
            decSvc.Decompiler = new DecompilerDriver(ldr, new FakeDecompilerHost(), sc);
            decSvc.Decompiler.Load("test.exe");

            interactor = new LoadedPageInteractor(sc);
        }
Exemple #10
0
            void parseSection64(uint protection)
            {
                var   abSectname = rdr.ReadBytes(16);
                var   abSegname  = rdr.ReadBytes(16);
                ulong addr;
                ulong size;
                uint  offset;
                uint  align;
                uint  reloff;
                uint  nreloc;
                uint  flags;
                uint  reserved1;
                uint  reserved2;
                uint  reserved3;

                if (!rdr.TryReadUInt64(out addr) ||
                    !rdr.TryReadUInt64(out size) ||
                    !rdr.TryReadUInt32(out offset) ||
                    !rdr.TryReadUInt32(out align) ||
                    !rdr.TryReadUInt32(out reloff) ||
                    !rdr.TryReadUInt32(out nreloc) ||
                    !rdr.TryReadUInt32(out flags) ||
                    !rdr.TryReadUInt32(out reserved1) ||
                    !rdr.TryReadUInt32(out reserved2) ||
                    !rdr.TryReadUInt32(out reserved3))
                {
                    throw new BadImageFormatException("Could not read Mach-O section.");
                }

                var sectionName = GetAsciizString(abSectname);
                var segmentName = GetAsciizString(abSegname);

                Debug.Print("Found section '{0}' in segment '{1}, addr = 0x{2:X}, size = 0x{3:X}.",
                            sectionName,
                            segmentName,
                            addr,
                            size);

                AccessMode am = 0;

                if ((protection & VM_PROT_READ) != 0)
                {
                    am |= AccessMode.Read;
                }
                if ((protection & VM_PROT_WRITE) != 0)
                {
                    am |= AccessMode.Write;
                }
                if ((protection & VM_PROT_EXECUTE) != 0)
                {
                    am |= AccessMode.Execute;
                }

                var imageSection = new ImageMapSegment(
                    string.Format("{0},{1}", segmentName, sectionName),
                    (uint)size,
                    am);        //imageSection.setData(!imageSection->isCode());
                //imageSection.setBss((section.flags & SECTION_TYPE) == S_ZEROFILL);

                //if (!imageSection.isBss()) {
                //    auto pos = source_->pos();
                //    if (!source_->seek(section.offset)) {
                //        throw ParseError("Could not seek to the beginning of the section's content.");
                //    }
                //    auto bytes = source_->read(section.size);
                //    if (checked_cast<uint>(bytes.size()) != section.size) {
                //        log_.warning("Could not read all the section's content.");
                //    } else {
                //        imageSection->setContent(std::move(bytes));
                //    }
                //    source_->seek(pos);
                //}

                //sections_.push_back(imageSection.get());
                //image_->addSection(std::move(imageSection));
            }
Exemple #11
0
        public override void Render(ImageMapSegment segment, Program program, Formatter formatter)
        {
            // Get the entry that has the segment# for the string table.
            var dynStrtab = loader.GetDynEntries(shdr.sh_offset).Where(d => d.d_tag == DT_STRTAB).FirstOrDefault();

            if (dynStrtab == null)
            {
                return;
            }
            var strtabSection = loader.GetSectionInfoByAddr(dynStrtab.d_ptr);

            foreach (var entry in loader.GetDynEntries(shdr.sh_offset))
            {
                switch (entry.d_tag)
                {
                default:
                    formatter.Write("{0,-12} {1:X8}", entry.d_tag, entry.d_val);
                    break;

                case DT_DEBUG:
                    formatter.Write("{0,-12} {1:X8}", "DT_DEBUG", entry.d_val);
                    break;

                case DT_FINI:
                    formatter.Write("{0,-12} ", "DT_FINI");
                    formatter.WriteHyperlink(string.Format("{0:X8}", entry.d_ptr), Address.Ptr32(entry.d_ptr));
                    break;

                case DT_HASH:
                    formatter.Write("{0,-12} ", "DT_HASH");
                    formatter.WriteHyperlink(string.Format("{0:X8}", entry.d_ptr), Address.Ptr32(entry.d_ptr));
                    break;

                case DT_INIT:
                    formatter.Write("{0,-12} ", "DT_INIT");
                    formatter.WriteHyperlink(string.Format("{0:X8}", entry.d_ptr), Address.Ptr32(entry.d_ptr));
                    break;

                case DT_JMPREL:
                    formatter.Write("{0,-12} ", "DT_JMPREL");
                    formatter.WriteHyperlink(string.Format("{0:X8}", entry.d_ptr), Address.Ptr32(entry.d_ptr));
                    break;

                case DT_NEEDED:
                    formatter.Write("{0,-12} {1}", "DT_NEEDED", loader.ReadAsciiString(loader.RawImage, strtabSection.sh_offset + entry.d_ptr));
                    break;

                case DT_STRSZ:
                    formatter.Write("{0,-12} {1:X}", "DT_STRSZ", entry.d_val);
                    break;

                case DT_STRTAB:
                    formatter.Write("{0,-12} ", "DT_STRTAB");
                    formatter.WriteHyperlink(string.Format("{0:X8}", entry.d_ptr), Address.Ptr32(entry.d_ptr));
                    break;

                case DT_SYMENT:
                    formatter.Write("{0,-12} {1}", "DT_SYMENTTRTAB", entry.d_val);
                    break;

                case DT_SYMTAB:
                    formatter.Write("{0,-12} ", "DT_SYMTAB");
                    formatter.WriteHyperlink(string.Format("{0:X8}", entry.d_ptr), Address.Ptr32(entry.d_ptr));
                    break;
                }
                formatter.WriteLine();
            }
        }
Exemple #12
0
 public override void Render(ImageMapSegment segment, Program program, Formatter formatter)
 {
     throw new NotImplementedException();
 }
Exemple #13
0
 private ImageMapSegment [] ExtractSegments()
 {
     ImageMapSegment [] segs = new ImageMapSegment[map.Segments.Count];
     map.Segments.Values.CopyTo(segs, 0);
     return(segs);
 }
Exemple #14
0
 private void PaintSegment(ImageMapSegment seg, Graphics g, Rectangle rc)
 {
     g.FillRectangle(Brushes.White, rc);
     g.DrawRectangle(seg == segSelected ? Pens.Red : Pens.Black, rc);
 }