Перейти к содержанию

У меня есть этот код в C # более человек basic_info возвращает 0 !? кто может мне помочь?


Рекомендуемые сообщения

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();            }
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.