📎 Больше информации, примеры и скрипты — здесь
DMA (Direct Memory Access) — это технология, которая позволяет считывать или записывать данные напрямую в оперативную память компьютера, минуя CPU и операционную систему. Это делает возможным доступ к памяти любого процесса, даже если он защищён античитами и механизмами вроде Kernel Patch Protection (KPP), Hypervisor Protected Code Integrity (HVCI), User-mode hooks и т.д.
В EyeAuras используется LeechCore — открытая библиотека от Ulf Frisk, признанная стандартом в области работы с PCIe/Thunderbolt/FPGA DMA-устройствами. Она лежит в основе популярных проектов вроде PCILeech и используется для создания отладчиков, исследовательских утилит, форензики и автоматизации.
С DMA ты получаешь:
ReadProcessMemory
, но за кулисами идёт работа с реальной шиной PCIe.Это основной сетап, в котором игра и бот запущены на разных ПК, он ориентирован на безопасность и в целом с ним сложно бороться разработчикам античитов - на том компьютере где запущена игра нет ничего инкрементирующего, кроме самой подключенной платы, которая мимикрирует под SSD/WiFi-карту или любое другое PCI-E устройство.
Этот сетап не гарантирует безопасность, так как античит может задетектить как EyeAuras, так и наличие платы/драйверов к ней. НО! Во многих играх DMA находится настолько за пределами досягаемости разработчиков игры и античита, что об этом даже никто не думает. И тогда такой сетап становится вполне приемлимым.
С точки зрения скрипта, всё выглядит так же, как при использовании обычного IMemory
интерфейса. Пример:
using EyeAuras.Memory; //required for Memory-related operations
using EyeAuras.Memory.MPFS; //required for DMA
var processList = LCProcess.FPGA().GetProcesses(); //get list of processes by reading it via DMA device
Log.Info($"Processes: \n\t{processList.DumpToTable()}"); // dump process list to the log
А вот так можно открыть процесс и вычитать какое-то значение из памяти посредством DMA.
using EyeAuras.Memory; //required for Memory-related operations
using EyeAuras.Memory.MPFS; //required for DMA
var process = LCProcess.FPGA().ByProcessName("game.exe");
var playerHp = process.Memory.Read<int>(process.Memory.BaseAddress + 0x1C4);
if (playerHp < 30)
{
Log.Warn($"Low HP: {playerHp}");
}
Для полноценной работы потребуется FPGA-плата, совместимая с LeechCore - в наше время 99% плат совместимы с LC, так что промазать сложно.
EyeAuras реализует интеграцию с LeechCore через изолированный слой IMemoryBackend
, который поддерживает: