Esempio n. 1
0
        private string ReadSegmentName()
        {
            var abSegname = rdr.ReadBytes(16);
            var cChars    = Array.IndexOf <byte>(abSegname, 0);

            if (cChars == -1)
            {
                cChars = 16;
            }
            string segname = Encoding.ASCII.GetString(abSegname, 0, cChars);

            return(segname);
        }
Esempio n. 2
0
 /// <summary>
 /// Reads a fixed length string (not NULL-terminated)
 /// </summary>
 /// <param name="offset"></param>
 /// <param name="length"></param>
 /// <returns></returns>
 public string ReadString(uint offset, uint length)
 {
     return(rdr.ReadAt(infoHeader.loaderStringsOffset + offset, (_) =>
     {
         var bytes = rdr.ReadBytes(length);
         return Encoding.ASCII.GetString(bytes);
     }));
 }
Esempio n. 3
0
        public IEnumerable <PefImageSegment> GetImageSegments(EndianByteImageReader rdr, Address addrLoad)
        {
            var addr = addrLoad;

            for (int i = 0; i < ContainerHeader.sectionCount; i++)
            {
                PEFSectionHeader sectionHeader = sectionHeaders[i];

                byte[] containerData = rdr.ReadAt(sectionHeader.containerOffset, rdr => rdr.ReadBytes(sectionHeader.packedSize));

                if (sectionHeader.IsCompressedSection())
                {
                    // replace PEF bytecode with decoded output from the interpreter
                    containerData = DecompressSection(containerData);
                }

                if (sectionHeader.defaultAddress != 0)
                {
                    addr = Address.Ptr32(sectionHeader.defaultAddress);
                }
                else
                {
                    addr = addrLoad;
                }
                var segment = new ImageSegment(
                    sectionNameTable[i] ?? $"seg{sectionHeader.defaultAddress:X8}",
                    new ByteMemoryArea(addr, containerData),
                    sectionHeader.GetAccessMode());

                yield return(new PefImageSegment(sectionHeader, segment));

                addrLoad = (segment.Address + containerData.Length).Align(0x1000);
            }
        }