Чтение в памяти указателя на другой адрес - C#

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

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

В общем у меня получается считывать только значение в памяти, а вот указатель что-то не выходит. Вот как считываю значение:
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
 
namespace Project1
{
    class MyMemory
    {
        const int PROCESS_WM_READ = 0x0010;
 
        [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);
 
        public static void ReadMemory()
        {
            Process process = Process.GetProcessesByName("gta_sa").FirstOrDefault();
            IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
 
            int bytesRead = 0;
            byte[] buffer = new byte[100];
 
            ReadProcessMemory((int)processHandle, 0xF6C8898, buffer, buffer.Length, ref bytesRead);
            
            MessageBox.Show(Encoding.ASCII.GetString(buffer));
        }
 
    }
}
Спасибо.

Решение задачи: «Чтение в памяти указателя на другой адрес»

textual
Листинг программы
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms; // Тут нужно только для MessageBox.Show
 
namespace Project1
{
    class MyMemory
    {
        const int PROCESS_WM_READ = 0x0010;
 
        [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);
 
        public static void ReadMemory()
        {
            
            IntPtr dllBase = IntPtr.Zero;
            int dllLength = 0;
            string processName = "имя процесса"; // Без ".exe"
 
            Process process = Process.GetProcessesByName(processName ).FirstOrDefault();
            IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
 
            int bytesRead = 0;
            byte[] buffer = new byte[15]; // Массив байт для выходного значения
            byte[] addr = new byte[255]; // Массив байт для смещения
            
            // Найти смещение dll, если надо
            foreach (ProcessModule item in process.Modules)
            {
                if (item.ModuleName == "имя длл.dll")
                {
                    dllBase = item.BaseAddress;
                    dllLength = item.ModuleMemorySize;
                    break;
                }
            }
            
            ReadProcessMemory((int)processHandle, (int)dllBase + 0x21A190, addr, addr.Length, ref bytesRead);
            int intAddr = BitConverter.ToInt32(addr, 0);
            ReadProcessMemory((int)processHandle, intAddr + 0x40, buffer, buffer.Length, ref bytesRead);
            
 
            MessageBox.Show(Encoding.ASCII.GetString(buffer).ToString()); // Вывод в MsgBox
        }
 
    }
}

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


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

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

10   голосов , оценка 3.6 из 5
Похожие ответы