Exemple #1
0
        public ElfRunner(string filename)
        {
            // todo: hack up this baby to take Streams
            _elf = ELFReader.Load <long>(filename);

            var loadsegs = _elf.Segments.Where(s => s.Type == SegmentType.Load);

            long orig_start = loadsegs.Min(s => s.Address);

            orig_start &= ~(Environment.SystemPageSize - 1);
            long orig_end = loadsegs.Max(s => s.Address + s.Size);

            _base       = new MemoryBlock(0, (ulong)(orig_end - orig_start));
            _loadoffset = (long)_base.Start - orig_start;

            try
            {
                _base.Set(_base.Start, _base.Size, MemoryBlock.Protection.RW);

                foreach (var seg in loadsegs)
                {
                    var data = seg.GetContents();
                    Marshal.Copy(data, 0, Z.SS(seg.Address + _loadoffset), data.Length);
                }
                RegisterSymbols();
                ProcessRelocations();


                _base.Set(_base.Start, _base.Size, MemoryBlock.Protection.R);

                foreach (var sec in _elf.Sections.Where(s => s.Flags.HasFlag(SectionFlags.Allocatable)))
                {
                    if (sec.Flags.HasFlag(SectionFlags.Executable))
                    {
                        _base.Set((ulong)(sec.LoadAddress + _loadoffset), (ulong)sec.Size, MemoryBlock.Protection.RX);
                    }
                    else if (sec.Flags.HasFlag(SectionFlags.Writable))
                    {
                        _base.Set((ulong)(sec.LoadAddress + _loadoffset), (ulong)sec.Size, MemoryBlock.Protection.RW);
                    }
                }

                //FixupGOT();
                ConnectAllClibPatches();
                Console.WriteLine("Loaded {0}@{1:X16}", filename, _base.Start);
            }
            catch
            {
                _base.Dispose();
                throw;
            }
        }
Exemple #2
0
		public ElfRunner(string filename)
		{
			// todo: hack up this baby to take Streams
			_elf = ELFReader.Load<long>(filename);

			var loadsegs = _elf.Segments.Where(s => s.Type == SegmentType.Load);

			long orig_start = loadsegs.Min(s => s.Address);
			orig_start &= ~(Environment.SystemPageSize - 1);
			long orig_end = loadsegs.Max(s => s.Address + s.Size);
			_base = new MemoryBlock(UIntPtr.Zero, orig_end - orig_start);
			_loadoffset = (long)_base.Start - orig_start;

			try
			{
				_base.Set(_base.Start, _base.Size, MemoryBlock.Protection.RW);

				foreach (var seg in loadsegs)
				{
					var data = seg.GetContents();
					Marshal.Copy(data, 0, (IntPtr)(seg.Address + _loadoffset), data.Length);
				}
				RegisterSymbols();
				ProcessRelocations();


				_base.Set(_base.Start, _base.Size, MemoryBlock.Protection.R);

				foreach (var sec in _elf.Sections.Where(s => s.Flags.HasFlag(SectionFlags.Allocatable)))
				{
					if (sec.Flags.HasFlag(SectionFlags.Executable))
						_base.Set((UIntPtr)(sec.LoadAddress + _loadoffset), sec.Size, MemoryBlock.Protection.RX);
					else if (sec.Flags.HasFlag(SectionFlags.Writable))
						_base.Set((UIntPtr)(sec.LoadAddress + _loadoffset), sec.Size, MemoryBlock.Protection.RW);
				}

				//FixupGOT();
				ConnectAllClibPatches();
				Console.WriteLine("Loaded {0}@{1:X16}", filename, (long)_base.Start);
			}
			catch
			{
				_base.Dispose();
				throw;
			}
		}
        private IntPtr AllocMem(IntPtr size)
        {
            var block = new MemoryBlock((long)size);
            var p     = (IntPtr)(long)block.Start;

            _heaps[p] = block;
            block.Set(block.Start, block.Size, MemoryBlock.Protection.RW);
            Console.WriteLine("AllocMem: {0:X8}@{1:X16}", (long)size, (long)block.Start);
            return(p);
        }
Exemple #4
0
		private IntPtr AllocMem(IntPtr size)
		{
			var block = new MemoryBlock((long)size);
			var p = (IntPtr)(long)block.Start;
			_heaps[p] = block;
			block.Set(block.Start, block.Size, MemoryBlock.Protection.RW);
			Console.WriteLine("AllocMem: {0:X8}@{1:X16}", (long)size, (long)block.Start);
			return p;
		}