С# многоуровневые указатели, чтение памяти

Я нашел код, который отлично работает для статических адресов.

Однако как изменить этот код, чтобы он работал с указателями? Мне нужно получить значение из этого указателя: 0x1002CAA70 + 0x10 + 0x18 + 0x0 + 0x18.

Это для 64-битного приложения.

public class Program
{
    private 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,
    Int64 lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

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

        int bytesRead = 0;
        var buffer = new byte[4];

        ReadProcessMemory((int)processHandle, 0x0011D598, buffer, buffer.Length, ref bytesRead);
        Console.WriteLine(BitConverter.ToInt32(buffer, 0));
        Console.ReadLine();
    }
}

изображение 1 изображение 2


person shiny    schedule 25.11.2017    source источник
comment
Что значит изменить его и добавить смещения?   -  person Tommaso Belluzzo    schedule 25.11.2017
comment
Я не могу найти рабочий пример для указателей   -  person shiny    schedule 25.11.2017
comment
0x1002CAA70 + 0x10 + 0x18 + 0x0 + 0x18 = 1002CAAB0? Вы хотите прочитать это значение? Или вы хотите пройти с последовательными значениями?   -  person Tommaso Belluzzo    schedule 25.11.2017
comment
Извините, что не смог правильно объяснить мою проблему. Пожалуйста, смотрите прикрепленное изображение. Я нашел указатель со статическим адресом 1002CAA70 и 4 смещениями (10,18,0,18). Я хочу, чтобы моя программа возвращала значение этого указателя. По сути, я пытаюсь получить значение в памяти, используя свой указатель   -  person shiny    schedule 25.11.2017
comment
На самом деле я вижу 4 разных указателя с 4 разными адресами, вам они все нужны?   -  person Tommaso Belluzzo    schedule 25.11.2017
comment
это указатель, адреса могут меняться. Однако базовый адрес и смещения остаются прежними. см. изображение 2   -  person shiny    schedule 25.11.2017
comment
Хорошо, я думаю, что понял, смотрите мой ответ.   -  person Tommaso Belluzzo    schedule 25.11.2017
comment
Похоже, у вас есть массив объектов (структура), где каждая структура составляет 18 байт. Итак, начальный адрес — 0x1002CAA70 + (0x18 * x), где x — порядковый номер массива.   -  person jdweng    schedule 25.11.2017


Ответы (1)


Спасибо, Томмазо Беллуццо!!

мой окончательный код для тех, кто заинтересован:

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,
        Int64 lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

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

            int bytesRead = 0;
            byte[] buffer = new byte[4];


            //Byte[] buffer = new Byte[4];

            Int64 baseAddress = 0x1002CAA70;
            ReadProcessMemory((int)processHandle, baseAddress, buffer, buffer.Length, ref bytesRead);
            Int64 baseValue = BitConverter.ToInt32(buffer, 0);

            Int64 firstAddress = baseValue + 0x10;
            ReadProcessMemory((int)processHandle, firstAddress, buffer, buffer.Length, ref bytesRead);
            Int64 firstValue = BitConverter.ToInt32(buffer, 0);

            Int64 secondAddress = firstValue + 0x18;
            ReadProcessMemory((int)processHandle, secondAddress, buffer, buffer.Length, ref bytesRead);
            Int64 secondValue = BitConverter.ToInt32(buffer, 0);

            Int64 thirdAddress = secondValue + 0x0;
            ReadProcessMemory((int)processHandle, thirdAddress, buffer, buffer.Length, ref bytesRead);
            Int64 thirdValue = BitConverter.ToInt32(buffer, 0);

            Int64 fourthAddress = thirdValue + 0x18;
            ReadProcessMemory((int)processHandle, fourthAddress, buffer, buffer.Length, ref bytesRead);
            Int64 fourthValue = BitConverter.ToInt32(buffer, 0);

            ReadProcessMemory((int)processHandle, fourthValue, buffer, buffer.Length, ref bytesRead);
            Console.WriteLine(BitConverter.ToInt32(buffer, 0));
            Console.ReadLine();
        }
    }
}
person shiny    schedule 25.11.2017