Чтение памяти процесса не работает, выдавая ошибку Попытка чтения или записи в защищенную память

В настоящее время я пытаюсь заставить мою функцию readProcessMemory работать, и я продолжаю получать ошибку "Attempted to read or write protected memory. This is often an indication that other memory is corruptMsgstr "Я пытался решить эту проблему, но я просто не могу это сделать. Я прочитал другие форумы и темы, чтобы решить проблему, но ничего не помогло. Я пытался просто прочитать целочисленную переменную в тестовой программе, чтобы убедиться в этом." работает, но я первоначально попробовал это на блокноте и штурмовой куб, но ничего не получалось.

Вот мой код:

        const int PROCESS_VM_READ = 0x0010;

        #region imports
        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll")]
        public static extern bool ReadProcessMemory(int hProcess,
    Int64 lpBaseAddress, byte[] lpBuffer, UInt64 dwSize, out IntPtr lpNumberOfBytesRead);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, UInt32 dwSize, out IntPtr lpNumberOfBytesWritten);
        #endregion


        private static IntPtr processHandle;

        static void Main(string[] args)
        {
            Console.WriteLine(readInt(0x003CECC4));

            Console.Read();
        }


        static byte[] readMemory(int memoryAddress, int bytesToRead)
        {
            Process process = Process.GetProcessesByName("test")[0];
            processHandle = OpenProcess(PROCESS_VM_READ, false, process.Id);

            IntPtr bytesRead;
            byte[] buffer = new byte[bytesToRead];
            ReadProcessMemory((int)processHandle, memoryAddress, buffer, (uint)buffer.Length, out bytesRead);
            return buffer;
        }

        static int  readInt(int memoryAddress)
        {
            return BitConverter.ToInt32(readMemory(memoryAddress, 4), 0);
        }    

    }
}

0 ответов

Вы должны запустить свою программу от имени администратора, щелкнуть проект правой кнопкой мыши, выбрать "добавить новый элемент" и выбрать файл манифеста. Измените asInvoker на requireAdministrator, перекомпилируйте и выполните, и он будет работать.

Во-вторых, вы используете динамический адрес, если вы перезапустите игру, он больше не будет работать, вы будете пытаться читать неинициализированную или просто случайную память. вы должны использовать динамические методы для разрешения цепочки указателей и получения базового адреса модулей вместо жесткого кодирования динамических адресов.

Другие вопросы по тегам