Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Софт [Сурс] MemWar — Ультимативная библиотека для memory hacking на Rust

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
658
Реакции
18
Пока большинство по старинке мучает C++, нормальные пацаны постепенно перекатываются на Rust. Почему? Потому что меньше шансов выстрелить себе в колено при работе с памятью и зацепить BSOD на ровном месте. Наткнулся на интересный проект MemWar — это библиотека, заточенная под манипуляции с памятью в Windows-окружении специально для создания игрового софта.

Основной упор здесь сделан на удобство: поиск процессов по имени, получение базовых адресов модулей (привет, Unity и GameAssembly.dll) и работа с цепочками указателей (pointer chains).

Пожалуйста, авторизуйтесь для просмотра ссылки.


Что внутри:
  1. Абстракция над системными вызовами Windows для открытия хендлов.
  2. Удобный механизм дереференса — метод .deref_chain позволяет прокидывать офсеты одной строкой.
  3. Обработка ошибок через anyhow — забудьте про непонятные краши без логов.
  4. Типизированное чтение памяти (f32, u64 и прочее).

Пример того, как это выглядит в деле (реализация типичного изменения скорости игрока через цепочку поинтеров в Unity-движке):

Код:
Expand Collapse Copy
use anyhow::{Result, bail, anyhow};

fn sandbox() -> Result<()> {
    let wpinf = match process::get_process_by_name("Game.exe")
        .map_err(|e| anyhow!("Process not found! {e}"))?
    {
        Some((wpinf, _)) => wpinf,
        None => bail!("Window info error"),
    };

    let h_process = process::open_process_handle(wpinf.pid())?;
    let base_addr = module::get_mod_base(wpinf.pid(), "GameAssembly.dll");

    if base_addr.is_null() {
        bail!("Failed to get GameAssembly.dll base address!")
    }

    let alloc = Allocation::existing(h_process, base_addr);
   
    // Работа с цепочкой офсетов
    let player_speed_addr = alloc
        .deref_chain(offsets::LOCAL_PLAYER, offsets::PLAYER_SPEED)
        .map_err(|e| anyhow!("Pointer chain broken! {e}"))?;

    let player_speed = alloc.read_f32(player_speed_addr)?;
   
    Ok(())
}

Технические нюансы:
Библиотека идеально подойдет как база для External софта под EAC/BattlEye, если прикрутить нормальный драйверный маппер или использовать легитные хендлы через захват чужих дескрипторов. В коде нет лишнего мусора, всё структурировано под расширение функционала.

Не забудьте, что для работы напрямую с процессами вам могут понадобиться админские права или SeDebugPrivilege в манифесте приложения. Если планируете использовать это для Rust (игры), сразу думайте над обходом проверки хендлов античитом.

Лично я вижу в этом неплохой фундамент для тех, кто хочет слезть с костыльных C#-врапперов и получить нативный перформанс с безопасностью Rust.

Интересно будет посмотреть, как библиотека поведет себя при реализации полноценного DMA-фреймворка, потенциал для этого есть.
 
Последнее редактирование модератором:
Полностью согласен — Rust действительно упрощает работу с памятью без риска BSOD! MemWar выглядит перспективно: абстракция над системными вызовами и удобный .deref_chain экономят кучу времени. Обязательно попробую для своего проекта под Unity — особенно радует обработка ошибок через anyhow. Интересно, есть ли уже готовые сборки на базе этой библиотеки для популярных игр?
 
Назад
Сверху Снизу