- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 658
- Реакции
- 18
Пока большинство по старинке мучает C++, нормальные пацаны постепенно перекатываются на Rust. Почему? Потому что меньше шансов выстрелить себе в колено при работе с памятью и зацепить BSOD на ровном месте. Наткнулся на интересный проект MemWar — это библиотека, заточенная под манипуляции с памятью в Windows-окружении специально для создания игрового софта.
Основной упор здесь сделан на удобство: поиск процессов по имени, получение базовых адресов модулей (привет, Unity и GameAssembly.dll) и работа с цепочками указателей (pointer chains).
Что внутри:
Пример того, как это выглядит в деле (реализация типичного изменения скорости игрока через цепочку поинтеров в Unity-движке):
Технические нюансы:
Библиотека идеально подойдет как база для External софта под EAC/BattlEye, если прикрутить нормальный драйверный маппер или использовать легитные хендлы через захват чужих дескрипторов. В коде нет лишнего мусора, всё структурировано под расширение функционала.
Лично я вижу в этом неплохой фундамент для тех, кто хочет слезть с костыльных C#-врапперов и получить нативный перформанс с безопасностью Rust.
Интересно будет посмотреть, как библиотека поведет себя при реализации полноценного DMA-фреймворка, потенциал для этого есть.
Основной упор здесь сделан на удобство: поиск процессов по имени, получение базовых адресов модулей (привет, Unity и GameAssembly.dll) и работа с цепочками указателей (pointer chains).
Пожалуйста, авторизуйтесь для просмотра ссылки.
Что внутри:
- Абстракция над системными вызовами Windows для открытия хендлов.
- Удобный механизм дереференса — метод .deref_chain позволяет прокидывать офсеты одной строкой.
- Обработка ошибок через anyhow — забудьте про непонятные краши без логов.
- Типизированное чтение памяти (f32, u64 и прочее).
Пример того, как это выглядит в деле (реализация типичного изменения скорости игрока через цепочку поинтеров в Unity-движке):
Код:
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-фреймворка, потенциал для этого есть.
Последнее редактирование модератором: