Так что все, что я просто хочу сделать, это написать программу Ruby, которая считывает некоторые значения из известного адреса памяти в виртуальной памяти другого процесса. Благодаря моим исследованиям и базовым знаниям о шестнадцатеричном редактировании сборки x86 запущенного процесса в памяти, я нашел базовый адрес и смещения для значений в памяти, которые мне нужны. я не хочу их менять; Я просто хочу их прочитать. Я спросил разработчика редактора памяти, как подойти к этой абстракции языка и предполагая платформу Windows. Он сказал мне, что вызовы Win32API для OpenProcess, CreateProcess, ReadProcessMemory и WriteProcessMemory — это путь использования C или C++. Я думаю, что можно было бы просто использовать класс Win32API и сопоставить два его экземпляра; Один для OpenProcess или CreateProcess, в зависимости от того, запущен ли уже процесс у пользователя, а другой экземпляр будет сопоставлен с ReadProcessMemory. Вероятно, мне все еще нужно найти функцию для получения списка запущенных процессов, чтобы я знал, какой запущенный процесс мне нужен, если он уже запущен.
Это потребует некоторой работы, чтобы собрать все вместе, но я полагаю, что было бы неплохо написать код. Для меня это просто новая область программирования, поскольку я никогда не работал на таком низком уровне с языком высокого уровня (ну, в любом случае, более высокого уровня, чем C). Мне просто интересно, как подойти к этому. Я мог бы просто использовать связку или вызовы Win32API, но это означает, что мне придется иметь дело с кучей пакетов строк и массивов и распаковкой, зависящей от системы. Я хочу в конечном итоге сделать эту работу кросс-платформенной, поскольку процесс, из которого я читаю, создается из исполняемый файл, который имеет несколько сборок платформы (я знаю, что адрес памяти меняется от системы к системе. Идея состоит в том, чтобы иметь плоский файл, содержащий все сопоставления памяти, чтобы программа Ruby могла просто сопоставить текущую среду платформы с соответствующим сопоставлением памяти. ), но, судя по всему, мне просто нужно создать класс, который обертывает любые вызовы функций, связанные с памятью общей библиотеки текущей платформы.
Насколько я знаю, уже может существовать драгоценный камень Ruby, который позаботится обо всем этом для меня, но я просто не могу его найти. Я также мог бы попытаться отредактировать исполняемые файлы для каждой сборки, чтобы всякий раз, когда значения памяти, которые я хочу прочитать, записывались процессом, он также записывал копию нового значения в пространство в общей памяти, которое у меня каким-то образом есть. Ruby создает экземпляр класса, который под капотом является указателем на этот адрес общей памяти и каким-то образом сигнализирует программе Ruby, что значение было обновлено и должно быть перезагружено. В принципе, система, основанная на прерываниях, была бы хороша, но поскольку цель чтения этих значений — просто отправить на табло, транслируемое с центрального сервера, я мог бы просто придерживаться системы, основанной на опросе, которая отправляет обновления через фиксированные интервалы времени. Я также мог бы вообще отказаться от Ruby и перейти на C или C++, но я почти не знаю их. На самом деле я знаю больше x86, чем C++, и я знаю C только настолько, насколько независимый от системы ANSI C, и никогда раньше не имел дело с разделяемыми системными библиотеками.
Итак, есть ли гем или менее известный модуль, который уже сделал это? Если нет, то было бы неплохо получить любую дополнительную информацию о том, как это сделать. Я думаю, короче говоря, как мне все это сделать?
Заранее спасибо, гр.
PS: Также было бы неплохо подтвердить, что эти вызовы Win32API должны быть направлены на библиотеку kernel32.dll.