Memory API нужен, когда вы хотите читать не экран, а реальные данные из памяти процесса: entity list, структуры игрока, координаты, HP, target id, view matrix и похожие вещи. Если нужен быстрый игровой контекст, посмотрите Aimbot и ESP у Game Hacking Academy.
Главная идея EyeAuras не в том, что это "ещё один reader памяти". Главное здесь в том, что поверх разных способов доступа к памяти лежит один и тот же верхний слой:
MemoryOfModule(...)ReadImports() и ReadExports()pattern scanningcode cavesТо есть вы меняете backend, а большая часть инструментов остаётся прежней.
LocalProcess — обычный локальный процесс через WinAPI. Это нормальная первая точка входа. С защищёнными процессами он не подходит. Подробнее: LocalProcess.NativeLocalProcess — тот же локальный сценарий, но поверх handle, который вы уже получили своим способом.LCProcess — backend через MemProcFS и LeechCore. Основной сценарий здесь это DMA, обычно через FPGA. Подробнее: LCProcess. По теме полезны Ulf Frisk, LeechCore, MemProcFS и PCILeech.KDProcess — backend через kernel driver. Нужен там, где обычного WinAPI уже мало.
KernelDriverсейчас в закрытом бета-тесте. Если вы автор пака и вам нужен доступ, напишите мне отдельно.FPGAиDMAсценарии уже доступны всем желающим.
Если у вас свой драйвер или свой способ чтения памяти, его тоже можно встроить в Memory API. Для этого есть отдельные точки расширения: Кастомный IProcess и Кастомные memory backend.
Если вам нужна не только базовая работа с LocalProcess, а более конкретный сценарий, удобнее всего идти так:
DMA, MemProcFS и LeechCore: LCProcessIProcessЕсли коротко, interface в C# здесь означает не "сложную внутренность", а просто контракт.
IProcess — объект, который представляет процессIProcessMemory — объект, через который вы работаете с памятью процессаЕсли вы читаете эту страницу именно как автор интеграции, дальше обычно полезно смотреть две статьи:
Для старта достаточно помнить простую связку:
LocalProcess открывает процессprocess.Memory даёт доступ к памятиСамый безопасный стартовый сценарий это открыть текущий процесс EyeAuras, взять модуль и прочитать его экспорты.
using System.Diagnostics;
using EyeAuras.Memory;
using EyeAuras.Memory.Scaffolding;
using var process = LocalProcess.ByProcessId(Process.GetCurrentProcess().Id);
using var kernel32 = process.MemoryOfModule("kernel32.dll");
Log.Info($"Process: {process.ProcessName} ({process.ProcessId})");
Log.Info($"Modules: {process.GetProcessModules().Count}");
Log.Info($"kernel32 exports: {kernel32.ReadExports().Count}");
Этот пример хорош тем, что в нём уже есть вся базовая модель: процесс, модуль и работа не с "магическим адресом", а с нормальным окном на память модуля.
Обычно работа выглядит так:
MemoryOfModule(...)Если хотите лучше понять, почему так надёжнее, чем просто хранить один жёсткий адрес, очень помогают Game Fundamentals, Dynamic Memory Allocation и Pattern Scanner.
Здесь есть простое правило:
Почти любой backend хорошо покрывает:
MemoryOfModule(...)А вот вещи вроде заморозки процесса, выделения памяти, смены protection, DLL inject, APC, remote thread или manual mapping доступны не везде.
LocalProcess и NativeLocalProcess подходят и для чтения, и для обычного user-mode контроля процесса.LCProcess в первую очередь про внешнее чтение и анализ памяти. Для активного управления процессом он обычно не используется.KDProcess нужен там, где нужен более глубокий контроль и обычный WinAPI уже не справляется.ProtectMemory(...) и FreeMemory(...)В свежих версиях у IProcessControlApi появились явные методы для полного цикла работы с выделенным регионом:
AllocateMemory(...) выделяет память и возвращает IMemoryRegionIMemoryRegion хранит Address и SizeProtectMemory(...) меняет protection и возвращает предыдущее значениеFreeMemory(...) явно освобождает ранее выделенный регионЭто удобно в сценариях, где нужно:
Простейший маршрут выглядит так:
using System.Diagnostics;
using EyeAuras.Memory;
using var process = LocalProcess.ByProcessId(Process.GetCurrentProcess().Id);
var control = (IProcessControlApi) process;
var region = control.AllocateMemory(
IntPtr.Zero,
4096,
MemoryAllocationType.Commit | MemoryAllocationType.Reserve,
MemoryProtectionType.ReadWrite);
try
{
var oldProtection = control.ProtectMemory(
region.Address,
region.Size,
MemoryProtectionType.ExecuteRead);
// Здесь можно писать данные, делать patching или готовить payload.
control.ProtectMemory(region.Address, region.Size, oldProtection);
}
finally
{
control.FreeMemory(region);
}
Важно помнить:
ProtectMemory(...) и FreeMemory(...) относятся к активному управлению процессом, а не просто к чтению памятиLocalProcess, NativeLocalProcess и KDProcessNotSupportedExceptionDLL injectПока вы читаете память снаружи, вы в основном наблюдаете за процессом. DLL inject нужен, когда код должен выполняться уже внутри целевой программы: вызывать её внутренние функции, ставить хуки, делать code cave, строить internal-логику. Отдельная статья с разбором вариантов, manual mapping и особенностей запуска здесь: DLL inject. Если нужен внешний фон, полезны DLL Memory Hack, DLL Injector, Code Caves & DLL's и Triggerbot.