2015-12-25 4 views
3

Я получаю чтение памяти приложения. Я использую CheatEngine для получения адреса памяти, а затем пытаюсь вернуть его значение. Тем не менее, CheatEngine, похоже, возвращает 64-битные адреса памяти, поэтому моя функция ReadProcessMemory продолжает говорить мне, что он не может преобразовать «long» в «int» всякий раз, когда я вхожу в адрес. Все обучающие программы, которые я нашел, по-видимому, основаны на адресах памяти, которые похожи на 00AB5678, но те, которые я получаю, больше похожи на D3569227FC.C# ReadProcessMemory: как читать 64-битный адрес памяти?

Итак, мой вопрос: как использовать ReadProcessMemory с гораздо большими адресами памяти?

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     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); 

     static void Main(string[] args) 
     { 
      Process process = Process.GetProcessesByName("MyProgram")[0]; 
      IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id); 

      int bytesRead = 0; 
      byte[] buffer = new byte[24]; //To read a 24 byte unicode string 

      ReadProcessMemory((int)processHandle, 0xD5369227FC, buffer, buffer.Length, ref bytesRead); 

      Console.WriteLine(Encoding.Unicode.GetString(buffer) + 
        " (" + bytesRead.ToString() + "bytes)"); 
      Console.ReadLine(); 
     } 
    } 
} 

Edit: Я преобразовал мою C# приложение 64 разрядное приложение, перейдя в VS2012 -> Project -> ApplicationName Свойства -> Build -> Платформа Target -> Изменить на «x64», теперь мне просто нужно знать, как изменить свой код для чтения 64-битных адресов.

+0

является какой линии вы получаете ошибку? Если он находится в функции ReadProcessMemory, попробуйте изменить значение int cast для lons cast .... @ user1928362 – khaled4vokalz

+0

Ошибка действительно в функции ReadProcessMemory, она читается точно так: «Наилучшее перегруженное соответствие метода для ConsoleApplication1.Program.ReadProcessMemory (int, int, byte [], int, ref int) 'имеет некоторые недопустимые аргументы, а затем "Аргумент 2: невозможно преобразовать из' long 'в' int '. Проблема не в первом аргументе, это второй аргумент. Он отлично работает, если я изменю адрес на что-то вроде 0x00AFBCD7, но он не примет адрес, который дал мне CheatEngine. – user1928362

ответ

4

Вы можете указать путь lpBaseAddress как Int64. Попробуйте заменить вашу

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

в

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

Работал отлично, большое вам спасибо :). – user1928362