C # ReadProcessMemory - доступ / чтение указателей - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть код для чтения значения из памяти, который работает, когда адрес памяти указывает на статическое 4-байтовое значение, но я пытаюсь получить доступ к 4-байтовому значению, которое находится в динамическом местоположении, и поэтому мне нужно найти сначала указатель, затем поиск, чтобы получить 4-байтовое значение.

Ниже приведен код, который должен возвращать адрес указателя, но он просто выводит 0 ...

bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50)
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW);
output = BitConverter.ToInt32(buffer, 0);
txtOutput.Text = output.ToString();

Псевдокод, который я вижу, работает как:

bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50)
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW);
output = BitConverter.ToInt32(buffer, 0);
bAddr = (IntPtr)output; // Should now contain the address 0x00267A50
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW);
output = BitConverter.ToInt32(buffer, 0);
txtOutput.Text = output.ToString();

Может ли кто-нибудь пролить свет на то, что мне нужно сделать, чтобы найти адрес, а затем найти этот адрес, чтобы найти значение?

1 Ответ

4 голосов
/ 01 апреля 2012

Это довольно классическая ошибка, когда при использовании pinvoke для выполнения функций Win32 вы не проверяете ошибки. Таким образом, любой сбой не поддается диагностике. Сначала убедитесь, что вы объявили это правильно:

[DllImport("user32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, 
    [In, Out] byte[] buffer, IntPtr size, out IntPtr lpNumberOfBytesRead);

Затем выполните это так:

bool ok = ReadProcessMemory(...);
if (!ok) throw new System.ComponentModel.Win32Exception();

Теперь вы будете знать, почему это не работает. Иначе мы не сможем помочь вам понять, что идет не так, пока вы, по крайней мере, не проверили это таким образом. Самая основная проблема - угадать адрес, конечно. ReadProcessMemory не имеет достаточных привилегий по понятным причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...