C # ReadProcessMemory - PullRequest
       42

C # ReadProcessMemory

0 голосов
/ 31 декабря 2018

Я в основном пытаюсь выяснить, как искать значение в процессе без точного смещения.Процесс может быть любым (блокнот, iexplorer, msword и т. Д.).Просто искать в поиске значение между первым и последним адресом памяти процесса, а не задавать конкретное смещение, которое я должен был найти в другом приложении, например ollydbg .

Вот что яесть

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);

public static string search = "somestring";

static void Main(string[] args)
{
    Process process = Process.GetProcessById(15728);
    IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);

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

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

    Console.WriteLine(Encoding.Unicode.GetString(buffer) +
          " (" + bytesRead.ToString() + "bytes)");
    if (Encoding.Unicode.GetString(buffer).Contains(somestring))
        Console.WriteLine("Match");
    else
        Console.WriteLine("Didint Match");
    Console.ReadLine();
}

1 Ответ

0 голосов
/ 02 января 2019

Вы не можете избежать передачи адреса в ReadProcessMemory, как это требуется, и я не верю, что есть какие-либо другие API, которые позволяют вам читать память процесса.

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

Далее вам нужно найти размер памяти процесса и передать его параметру nSize.Но ... это может быть плохой идеей, потому что

  1. вы должны определить, что это за значение (я не знаю, как; вы могли бы перебрать его, выполнив бинарный поиск черезнаибольшее возможное значение и нахождение наибольшего значения, которое не заставляет ReadProcessMemory возвращать false или, возможно, с помощью счетчика производительности или какого-либо другого механизма).

  2. Обработка ограничений памяти, связанных с необходимостью выделения огромного куска памяти для вашего буфера.

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

while not an error
    read into a buffer, scanning it for your string
    if found
        return true;
    bump the offset

Если вышеуказанный цикл не находит вашу строку, вы все еще не закончили, потому что строка могла охватить границу между двумя буферами.Чтобы справиться с этим, создайте еще один цикл, который сканирует каждую границу от boundary offset - string size до boundary offset + string size, возвращая true, если найден.

...