Гость m4go512 Опубликовано 25 октября, 2015 Поделиться Опубликовано 25 октября, 2015 NullAlex: Код принято обрамлять соответствующим тегом. Читай правила и FAQ// REQUIRED CONSTS const int PROCESS_QUERY_INFORMATION = 0x0400; const int MEM_COMMIT = 0x00001000; const int PAGE_READWRITE = 0x04; const int PROCESS_WM_READ = 0x0010; // REQUIRED METHODS [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead); [DllImport("kernel32.dll")] static extern void GetSystemInfo(out SYSTEM_INFO lpSystemInfo); [DllImport("kernel32.dll", SetLastError = true)] static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength); // REQUIRED STRUCTS public struct MEMORY_BASIC_INFORMATION { public int BaseAddress; public int AllocationBase; public int AllocationProtect; public int RegionSize; public int State; public int Protect; public int lType; } public struct SYSTEM_INFO { public ushort processorArchitecture; ushort reserved; public uint pageSize; public IntPtr minimumApplicationAddress; public IntPtr maximumApplicationAddress; public IntPtr activeProcessorMask; public uint numberOfProcessors; public uint processorType; public uint allocationGranularity; public ushort processorLevel; public ushort processorRevision; } // finally... public static void Main() { // ficando mínima e máxima endereço SYSTEM_INFO sys_info = new SYSTEM_INFO(); GetSystemInfo(out sys_info); IntPtr proc_min_address = sys_info.minimumApplicationAddress; IntPtr proc_max_address = sys_info.maximumApplicationAddress; // salvar os valores como inteiros longos por isso não vou ter que fazer um monte de moldes mais tarde long proc_min_address_l = (long)proc_min_address; long proc_max_address_l = (long)proc_max_address; // notepad melhor estar em execução ' Process process = Process.GetProcessesByName("notepad")[0]; // Abrir o processo com nível de acesso desejado IntPtr processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id); StreamWriter sw = new StreamWriter("dump.txt"); // este irá armazenar qualquer informação que recebemos de VirtualQueryEx() MEMORY_BASIC_INFORMATION mem_basic_info = new MEMORY_BASIC_INFORMATION(); int bytesRead = 0; // Com o número de bytes ler ReadProcessMemory while (proc_min_address_l < proc_max_address_l) { // 28 = sizeof(MEMORY_BASIC_INFORMATION) VirtualQueryEx(processHandle, proc_min_address, out mem_basic_info, 28); // Se este pedaço de memória é acessível if (mem_basic_info.Protect == PAGE_READWRITE && mem_basic_info.State == MEM_COMMIT) { byte[] buffer = new byte[mem_basic_info.RegionSize]; // ler tudo no tampão atrás referido ReadProcessMemory((int)processHandle, mem_basic_info.BaseAddress, buffer, mem_basic_info.RegionSize, ref bytesRead); // Em seguida, a este arquivo de saída for (int i = 0; i < mem_basic_info.RegionSize; i++) sw.WriteLine("0x{0} : {1}", (mem_basic_info.BaseAddress + i).ToString("X"), (char)buffer[i]); } // ir para o próximo pedaço de memória proc_min_address_l += mem_basic_info.RegionSize; proc_min_address = new IntPtr(proc_min_address_l); } sw.Close(); Console.ReadLine(); } Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 26 октября, 2015 Поделиться Опубликовано 26 октября, 2015 Привет! А не мог бы ты описать свою проблему подробнее? Я ничего не понял) Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 27 октября, 2015 Поделиться Опубликовано 27 октября, 2015 Very bad translation into russian. Write in english pls. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения