Esempio n. 1
0
        public static VirtualMemoryInformation[] EnumerateVirtualMemorySpaces(Process proc)
        {
#if WINDOWS
            MEMORY_BASIC_INFORMATION        m = new MEMORY_BASIC_INFORMATION();
            List <VirtualMemoryInformation> virtual_mem_entries = new List <VirtualMemoryInformation>();
            long address    = 0;
            long maxAddress = (long)proc.MainModule.BaseAddress.ToInt64() > UInt32.MaxValue ? Int64.MaxValue : UInt32.MaxValue;
            VirtualMemoryPermissions perms = 0;
            do
            {
                VirtualQueryEx(proc.Handle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
                perms = 0;
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_READONLY))
                {
                    perms = VirtualMemoryPermissions.READ;
                }
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_READWRITE))
                {
                    perms = VirtualMemoryPermissions.READ | VirtualMemoryPermissions.WRITE;
                }
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_WRITECOMBINE) ||
                    m.Protect.HasFlag(AllocationProtectEnum.PAGE_WRITECOPY))
                {
                    perms = VirtualMemoryPermissions.WRITE;
                }
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_EXECUTE))
                {
                    perms = VirtualMemoryPermissions.EXECUTE;
                }
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_EXECUTE_READ))
                {
                    perms = VirtualMemoryPermissions.EXECUTE | VirtualMemoryPermissions.READ;
                }
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_EXECUTE_WRITECOPY))
                {
                    perms = VirtualMemoryPermissions.EXECUTE | VirtualMemoryPermissions.WRITE;
                }
                if (m.Protect.HasFlag(AllocationProtectEnum.PAGE_EXECUTE_READWRITE))
                {
                    perms = VirtualMemoryPermissions.EXECUTE | VirtualMemoryPermissions.READ | VirtualMemoryPermissions.WRITE;
                }
                virtual_mem_entries.Add(new VirtualMemoryInformation(
                                            m.BaseAddress.ToInt64(),
                                            m.BaseAddress.ToInt64() + m.RegionSize.ToInt64(),
                                            perms,
                                            m.Type.HasFlag(TypeEnum.MEM_PRIVATE),
                                            !m.Type.HasFlag(TypeEnum.MEM_PRIVATE)
                                            ));
                if (address == (long)m.BaseAddress + (long)m.RegionSize)
                {
                    break;
                }
                address = (long)m.BaseAddress + (long)m.RegionSize;
            } while (address < maxAddress);
            return(virtual_mem_entries.ToArray());
#else
            throw new NotImplementedException();
#endif
        }
Esempio n. 2
0
 public VirtualMemoryInformation(long start_addr, long end_addr, VirtualMemoryPermissions perms, bool is_private, bool is_shared)
 {
     BaseAddress = start_addr;
     Size        = end_addr - start_addr;
     Permissions = perms;
     IsPrivate   = is_private;
     IsShared    = is_shared;
 }
Esempio n. 3
0
        public static VirtualMemoryInformation[] EnumerateVirtualMemorySpaces(Process proc)
        {
#if LINUX
            List <VirtualMemoryInformation> virtual_mem_entries = new List <VirtualMemoryInformation>();
            String[] virtual_mem_entry_lines = File.ReadAllLines("/proc/" + proc.Id + "/maps");
            String[] values                = null;
            String[] address_space         = null;
            VirtualMemoryPermissions perms = 0;

            foreach (var virtual_mem_entry_line in virtual_mem_entry_lines)
            {
                values        = virtual_mem_entry_line.Split(' ');
                address_space = values[0].Split('-');
                perms         = 0;

                if (values[1][0] == 'r')
                {
                    perms = VirtualMemoryPermissions.READ;
                }
                if (values[1][1] == 'w')
                {
                    perms |= VirtualMemoryPermissions.WRITE;
                }
                if (values[1][2] == 'x')
                {
                    perms |= VirtualMemoryPermissions.EXECUTE;
                }

                virtual_mem_entries.Add(new VirtualMemoryInformation(
                                            Convert.ToInt64("0x" + address_space[0], 16),
                                            Convert.ToInt64("0x" + address_space[1], 16),
                                            perms,
                                            values[1][3] == 'p',
                                            values[1][3] == 's'
                                            ));
                Thread.Sleep(1);
            }
            return(virtual_mem_entries.ToArray());
#else
            throw new NotImplementedException();
#endif
        }