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 }
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; }
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 }