Обращение напрямую к адресу оперативной памяти - C#
Формулировка задачи:
Подскажите, как в си шарп обращаться к определённым адресам оперативной памяти и читать оттуда значения??? Нужно для оффсетов... Например, есть игра, я с помощью артмани ищу адрес определённого значения, забиваю его в программу и считываю его через каждые 10 секунд... Спасибо!!!
Решение задачи: «Обращение напрямую к адресу оперативной памяти»
textual
Листинг программы
using System; using System.Linq; using System.Security; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.ConstrainedExecution; using System.Timers; namespace ReadMemory { class Program { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess,bool bInheritHandle,int processId); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory(IntPtr hProcess,IntPtr lpBaseAddress,[Out] byte[] lpBuffer,int dwSize,out IntPtr lpNumberOfBytesRead); [DllImport("kernel32.dll", SetLastError = true)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); [Flags] public enum ProcessAccessFlags : uint { All = 0x001F0FFF, Terminate = 0x00000001, CreateThread = 0x00000002, VirtualMemoryOperation = 0x00000008, VirtualMemoryRead = 0x00000010, VirtualMemoryWrite = 0x00000020, DuplicateHandle = 0x00000040, CreateProcess = 0x000000080, SetQuota = 0x00000100, SetInformation = 0x00000200, QueryInformation = 0x00000400, QueryLimitedInformation = 0x00001000, Synchronize = 0x00100000 } public static int pID; public static string pName = "ProcessName";//Имя процесса без .exe static void Main(string[] args) { var pList = Process.GetProcesses(); if (pList.Count() != 0) { foreach(var _getCurrentProcess in pList) { if(_getCurrentProcess.ProcessName == pName) { pID = _getCurrentProcess.Id; break; } } } var pHandle = OpenProcess(ProcessAccessFlags.All, false, pID); Console.WriteLine(">ProcessName:\t"+pName+"\n>ProcessID:\t"+pID+"\n>ProcessHandle:\t"+pHandle); Timer tmr = new Timer(); tmr.Interval = 10000; tmr.Enabled = true; tmr.Elapsed += Tmr_Elapsed; CloseHandle(pHandle); while (true) { if(Console.ReadKey().Key == ConsoleKey.Escape) { Environment.Exit(0); } } } private static void Tmr_Elapsed(object sender, ElapsedEventArgs e) { int[] offsets = { 0x50, 0x90, 0x70 };//сами смещения Console.WriteLine(ReadPointerMemory(0x12345678, offsets));//Базовый адрес,тот который зеленный в cheat engine } public static byte[] ReadMemory(int baseAddress, int size) { IntPtr cacheRM; byte[] buffer = new byte[size]; var handle = OpenProcess(ProcessAccessFlags.All, false, pID); ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, size, out cacheRM); CloseHandle(handle); return buffer; } public static int ReadPointerMemory(int baseAddress, int[] offsets) { baseAddress = BitConverter.ToInt32(ReadMemory(baseAddress, 4), 0); for (int i = 0; i < offsets.Length; i++) { baseAddress += offsets[i]; if (i == offsets.Length - 1) { return baseAddress; } baseAddress = BitConverter.ToInt32(ReadMemory(baseAddress, 4), 0); } return baseAddress; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д