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(); } }
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()); }
public override void Initialize(object obj) { this.segment = (ImageMapSegment)obj; base.TreeNode.Text = segment.Name; base.TreeNode.ImageName = GetImageName(); base.TreeNode.ToolTipText = GetTooltip(); PopulateChildren(); }
public void DisplayImageSegment(ImageMapSegment segment, Program program) { if (segment == null) { return; } ShowWindow("imageSegmentViewer", "Segment: " + segment.Name, program, pane); pane.DisplaySegment(segment, program); }
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); }
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); }
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(); } }
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); }
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)); }
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(); } }
public override void Render(ImageMapSegment segment, Program program, Formatter formatter) { throw new NotImplementedException(); }
private ImageMapSegment [] ExtractSegments() { ImageMapSegment [] segs = new ImageMapSegment[map.Segments.Count]; map.Segments.Values.CopyTo(segs, 0); return(segs); }
private void PaintSegment(ImageMapSegment seg, Graphics g, Rectangle rc) { g.FillRectangle(Brushes.White, rc); g.DrawRectangle(seg == segSelected ? Pens.Red : Pens.Black, rc); }