Esempio n. 1
0
        public ImageSymbol CreateImageSymbol(ElfSymbol sym, bool isExecutable)
        {
            if (!isExecutable && sym.SectionIndex > 0 && sym.SectionIndex >= Sections.Count)
            {
                return(null);
            }
            SymbolType?st = GetSymbolType(sym);

            if (st == null || st.Value == SymbolType.Unknown)
            {
                return(null);
            }
            // If this is a relocatable file, the symbol value is
            // an offset from the section's virtual address.
            // If this is an executable file, the symbol value is
            // the virtual address.
            var addr = isExecutable
                ? platform.MakeAddressFromLinear(sym.Value, true)
                : Sections[(int)sym.SectionIndex].Address + sym.Value;

            var dt     = GetSymbolDataType(sym);
            var imgSym = ImageSymbol.Create(
                st.Value,
                this.Architecture,
                addr,
                sym.Name,
                dt);

            imgSym.ProcessorState = Architecture.CreateProcessorState();
            return(imgSym);
        }
Esempio n. 2
0
        public override Address ComputeBaseAddress(IPlatform platform)
        {
            ulong uBaseAddr = Segments
                              .Where(ph => ph.p_vaddr > 0 && ph.p_filesz > 0)
                              .Min(ph => ph.p_vaddr);

            return(platform.MakeAddressFromLinear(uBaseAddr, true));
        }
Esempio n. 3
0
        public override SegmentMap LoadImageBytes(IPlatform platform, byte[] rawImage, Address addrPreferred)
        {
            var segMap = AllocateMemoryAreas(
                Segments
                .Where(p => IsLoadable(p.p_pmemsz, p.p_type))
                .OrderBy(p => p.p_vaddr)
                .Select(p => (
                            platform.MakeAddressFromLinear(p.p_vaddr, false),
                            (uint)p.p_pmemsz)));

            foreach (var ph in Segments)
            {
                ElfImageLoader.trace.Inform("ph: addr {0:X8} filesize {0:X8} memsize {0:X8}", ph.p_vaddr, ph.p_filesz, ph.p_pmemsz);
                if (!IsLoadable(ph.p_pmemsz, ph.p_type))
                {
                    continue;
                }
                var vaddr = platform.MakeAddressFromLinear(ph.p_vaddr, false);
                segMap.TryGetLowerBound(vaddr, out var mem);
                if (ph.p_filesz > 0)
                {
                    Array.Copy(
                        rawImage,
                        (long)ph.p_offset, mem.Bytes,
                        vaddr - mem.BaseAddress, (long)ph.p_filesz);
                }
            }
            var segmentMap = new SegmentMap(addrPreferred);

            if (Sections.Count > 0)
            {
                foreach (var section in Sections)
                {
                    if (section.Name == null || section.Address == null)
                    {
                        continue;
                    }
                    if (segMap.TryGetLowerBound(section.Address, out var mem) &&
                        mem.IsValidAddress(section.Address))
                    {
                        AccessMode mode = AccessModeOf(section.Flags);
                        var        seg  = segmentMap.AddSegment(new ImageSegment(
                                                                    section.Name,
                                                                    section.Address,
                                                                    mem, mode)
                        {
                            Size = (uint)section.Size
                        });
                        seg.Designer = CreateRenderer64(section);
                    }
                    else
                    {
                        //$TODO: warn
                    }
                }
            }
            else
            {
                // There are stripped ELF binaries with 0 sections. If we have one
                // create a pseudo-section from the segMap.
                foreach (var segment in segMap)
                {
                    var imgSegment = new ImageSegment(
                        segment.Value.BaseAddress.GenerateName("seg", ""),
                        segment.Value,
                        AccessMode.ReadExecute)        //$TODO: writeable segments.
                    {
                        Size = (uint)segment.Value.Length,
                    };
                    segmentMap.AddSegment(imgSegment);
                }
            }
            segmentMap.DumpSections();
            return(segmentMap);
        }
Esempio n. 4
0
        public override SegmentMap LoadImageBytes(IPlatform platform, byte[] rawImage, Address addrPreferred)
        {
            var segMap = AllocateMemoryAreas(
                ProgramHeaders64
                    .Where(p => IsLoadable(p.p_vaddr, p.p_type))
                    .Select(p => Tuple.Create(
                        platform.MakeAddressFromLinear(p.p_vaddr),
                        (uint)p.p_pmemsz)));
            foreach (var ph in ProgramHeaders64)
            {
                Debug.Print("ph: addr {0:X8} filesize {0:X8} memsize {0:X8}", ph.p_vaddr, ph.p_filesz, ph.p_pmemsz);
                if (!IsLoadable(ph.p_vaddr, ph.p_type))
                    continue;
                var vaddr = platform.MakeAddressFromLinear(ph.p_vaddr);
                MemoryArea mem;
                segMap.TryGetLowerBound(vaddr, out mem);
                if (ph.p_filesz > 0)
                    Array.Copy(
                        rawImage,
                        (long)ph.p_offset, mem.Bytes,
                        vaddr - mem.BaseAddress, (long)ph.p_filesz);
            }
            var segmentMap = new SegmentMap(addrPreferred);
            foreach (var section in Sections)
            {
                if (section.Name == null || section.Address == null)
                    continue;
                MemoryArea mem;
                if (segMap.TryGetLowerBound(section.Address, out mem) &&
                    section.Address < mem.EndAddress)
                {
                    AccessMode mode = AccessModeOf(section.Flags);
                    var seg = segmentMap.AddSegment(new ImageSegment(
                        section.Name,
                        section.Address,
                        mem, mode)
                    {
                        Size = (uint)section.Size
                    });
                    seg.Designer = CreateRenderer64(section);
                }
                else
                {
                    //$TODO: warn
                }
            }
            segmentMap.DumpSections();
            return segmentMap;

        }
Esempio n. 5
0
 public override Address ComputeBaseAddress(IPlatform platform)
 {
     ulong uBaseAddr = ProgramHeaders64
         .Where(ph => ph.p_vaddr > 0 && ph.p_filesz > 0)
         .Min(ph => ph.p_vaddr);
     return platform.MakeAddressFromLinear(uBaseAddr);
 }