Обращение напрямую к адресу оперативной памяти - C#

Узнай цену своей работы

Формулировка задачи:

Подскажите, как в си шарп обращаться к определённым адресам оперативной памяти и читать оттуда значения??? Нужно для оффсетов... Например, есть игра, я с помощью артмани ищу адрес определённого значения, забиваю его в программу и считываю его через каждые 10 секунд... Спасибо!!!

Решение задачи: «Обращение напрямую к адресу оперативной памяти»

textual
Листинг программы
  1. using System;
  2. using System.Linq;
  3. using System.Security;
  4. using System.Diagnostics;
  5. using System.Runtime.InteropServices;
  6. using System.Runtime.ConstrainedExecution;
  7. using System.Timers;
  8.  
  9. namespace ReadMemory
  10. {
  11.     class Program
  12.     {
  13.         [DllImport("kernel32.dll")]
  14.         public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess,bool bInheritHandle,int processId);
  15.  
  16.         [DllImport("kernel32.dll", SetLastError = true)]
  17.         static extern bool ReadProcessMemory(IntPtr hProcess,IntPtr lpBaseAddress,[Out] byte[] lpBuffer,int dwSize,out IntPtr lpNumberOfBytesRead);
  18.  
  19.         [DllImport("kernel32.dll", SetLastError = true)]
  20.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  21.         [SuppressUnmanagedCodeSecurity]
  22.         [return: MarshalAs(UnmanagedType.Bool)]
  23.  
  24.         static extern bool CloseHandle(IntPtr hObject);
  25.         [Flags]
  26.         public enum ProcessAccessFlags : uint
  27.         {
  28.             All = 0x001F0FFF,
  29.             Terminate = 0x00000001,
  30.             CreateThread = 0x00000002,
  31.             VirtualMemoryOperation = 0x00000008,
  32.             VirtualMemoryRead = 0x00000010,
  33.             VirtualMemoryWrite = 0x00000020,
  34.             DuplicateHandle = 0x00000040,
  35.             CreateProcess = 0x000000080,
  36.             SetQuota = 0x00000100,
  37.             SetInformation = 0x00000200,
  38.             QueryInformation = 0x00000400,
  39.             QueryLimitedInformation = 0x00001000,
  40.             Synchronize = 0x00100000
  41.         }
  42.         public static int pID;
  43.         public static string pName = "ProcessName";//Имя процесса без .exe
  44.         static void Main(string[] args)
  45.         {
  46.             var pList = Process.GetProcesses();
  47.             if (pList.Count() != 0)
  48.             {
  49.                 foreach(var _getCurrentProcess in pList)
  50.                 {
  51.                     if(_getCurrentProcess.ProcessName == pName)
  52.                     {
  53.                         pID = _getCurrentProcess.Id;
  54.                         break;
  55.                     }
  56.                 }
  57.             }
  58.             var pHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
  59.             Console.WriteLine(">ProcessName:\t"+pName+"\n>ProcessID:\t"+pID+"\n>ProcessHandle:\t"+pHandle);
  60.             Timer tmr = new Timer();
  61.             tmr.Interval = 10000;
  62.             tmr.Enabled = true;
  63.             tmr.Elapsed += Tmr_Elapsed;
  64.             CloseHandle(pHandle);
  65.             while (true)
  66.             {
  67.                 if(Console.ReadKey().Key == ConsoleKey.Escape)
  68.                 {
  69.                     Environment.Exit(0);
  70.                 }
  71.             }
  72.         }
  73.  
  74.         private static void Tmr_Elapsed(object sender, ElapsedEventArgs e)
  75.         {
  76.             int[] offsets = { 0x50, 0x90, 0x70 };//сами смещения
  77.             Console.WriteLine(ReadPointerMemory(0x12345678, offsets));//Базовый адрес,тот который зеленный в cheat engine
  78.         }
  79.  
  80.         public static byte[] ReadMemory(int baseAddress, int size)
  81.         {
  82.             IntPtr cacheRM;
  83.             byte[] buffer = new byte[size];
  84.             var handle = OpenProcess(ProcessAccessFlags.All, false, pID);
  85.             ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, size, out cacheRM);
  86.             CloseHandle(handle);
  87.             return buffer;
  88.  
  89.         }
  90.         public static int ReadPointerMemory(int baseAddress, int[] offsets)
  91.         {
  92.             baseAddress = BitConverter.ToInt32(ReadMemory(baseAddress, 4), 0);
  93.             for (int i = 0; i < offsets.Length; i++)
  94.             {
  95.                 baseAddress += offsets[i];
  96.                 if (i == offsets.Length - 1)
  97.                 {
  98.                     return baseAddress;
  99.                 }
  100.                 baseAddress = BitConverter.ToInt32(ReadMemory(baseAddress, 4), 0);
  101.             }
  102.             return baseAddress;
  103.         }
  104.     }
  105. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы