libmem

Exploitation v4.1.0 · 24.01.2023 не обновлялся >2 лет

Кросс-платформенная библиотека для манипуляций с памятью процессов (Windows, Linux, macOS, FreeBSD). API: чтение/запись памяти, поиск паттернов (сигнатур), хуки функций через trampoline/detour, инъекция кода и DLL/SO-библиотек, перечисление модулей и символов, разбор PE/ELF-заголовков. Работает как внутри процесса, так и с внешними процессами. Биндинги для C, C++, Rust и Python.

v4.1.0
24.01.2023 current
Добавлен 16.07.2026 · Обновлён 16.07.2026 · Exploitation
Установка
# Python (pip)
pip install libmem

# Rust (Cargo.toml)
# [dependencies]
# libmem = "5"

# C/C++ через CMake FetchContent (рекомендуется)
# Добавить в CMakeLists.txt:
# include(FetchContent)
# FetchContent_Declare(libmem-config
#   URL "https://raw.githubusercontent.com/rdbo/libmem/config-v1/libmem-config.cmake"
#   DOWNLOAD_NO_EXTRACT TRUE)
# FetchContent_MakeAvailable(libmem-config)
# target_link_libraries(<TARGET> PRIVATE libmem::libmem)

# Python — пример: чтение памяти процесса
# import libmem as lm
# proc = lm.find_process("target")
# mod = lm.find_module_ex(proc, "libssl.so")
# data = lm.read_memory_ex(proc, mod.base, 16)
переведено ИИ

libmem-logo

Продвинутая библиотека для хакинга игр (C/C++/Rust/Python) (Windows/Linux/FreeBSD)

Сделано rdbo

Сервер Discord

https://discord.com/invite/Qw8jsPD99X

Лицензия

Проект лицензирован под лицензией GNU AGPLv3.0 (без более поздних версий)

Чтобы узнать больше, прочитайте файл LICENSE

ПРИМЕЧАНИЕ: Подмодули и внешние зависимости могут иметь собственные лицензии! Проверьте и их лицензии.

Платформы

ОС x86 x64 ARM Aarch64
Windows :white_check_mark: :white_check_mark: :warning: :warning:
Linux :white_check_mark: :white_check_mark: :warning: :warning:
FreeBSD :heavy_check_mark: :heavy_check_mark: :warning: :warning:
Статус Описание
:white_check_mark: Работает на 100%
:heavy_check_mark: Работает в большинстве случаев
:warning: Не тестировалось

Возможности

  • [x] Внутреннее и внешнее использование
  • [x] Поиск и перечисление процессов, модулей, символов, потоков и сегментов
  • [x] Чтение/Запись памяти
  • [x] Выделение/Изменение защиты памяти
  • [x] Сканирование памяти по паттерну/сигнатуре
  • [x] Разрешение сканирования указателей/карт указателей
  • [x] Подмена/Восстановление функций (хук)
  • [x] Ассемблирование/Дизассемблирование кода (JIT)
  • [x] Хук/Анхук VMT
  • [x] Загрузка/Выгрузка модулей
  • [x] Перечисление потоков процесса

И многое другое!

Примеры

Современный C++

/* C++20 or higher */
#include <libmem/libmem.hpp>
#include <iostream>

using namespace libmem;

int main()
{
    Address disas_addr = (Address)main;

    // Disassemble function 'main' until a 'ret' is found
    for (;;) {
        auto inst = Disassemble(disas_addr).value();
        std::cout << inst.to_string() << std::endl;
        if (inst.mnemonic == "ret")
            break;
        disas_addr += inst.bytes.size();
    }

    return 0;
}

/*
Output:
0x55b1a3259275: push rbp -> [ 55 ]
0x55b1a3259276: mov rbp, rsp -> [ 48 89 e5 ]
...
0x55b1a325941a: leave  -> [ c9 ]
0x55b1a325941b: ret  -> [ c3 ]
*/

C/C++

#include <libmem/libmem.h>

void hk_take_damage(int amount)
{
  printf("hooked take_damage! no damage will be taken\n");
  return;
}

int main()
{
    lm_module_t game_mod;
    lm_address_t fn_take_damage;

    LM_FindModule("game.dll", &game_mod);
    printf("[*] Base address of 'game.dll': %p\n", game_mod.base);

    fn_take_damage = LM_FindSymbolAddress(&game_mod, "take_damage");
    printf("[*] Found 'take_damage' function: %p\n", fn_take_damage);

    LM_HookCode(fn_take_damage, hk_take_damage, LM_NULLPTR);
    printf("[*] 'take_damage' hooked, player will no longer receive damage\n");

    return 0;
}

Rust

use libmem::*;

fn godmode() -> Option<()> {
    let game_process = find_process("game_linux64")?;
    let client_module = find_module_ex(&game_process, "libclient.so")?;

    let fn_update_health = sig_scan_ex(
        &game_process,
        "55 48 89 E5 66 B8 ?? ?? 48 8B 5D FC",
        client_module.base,
        client_module.size,
    )?;
    println!(
        "[*] Signature scan result for 'update_health' function: {}",
        fn_update_health
    );

    let shellcode = assemble_ex("mov rbx, 1337; mov [rdi], rbx; ret", Arch::X64, 0)?;
    write_memory_ex(&game_process, fn_update_health + 8, &shellcode.as_slice())?;
    println!("[*] Patched 'update_health' function to always set health to 1337!");

    Some(())
}

fn main() {
    godmode();
}

Python

from libmem import *
import time

process = find_process("game.exe")
game_mod = find_module_ex(process, process.name)

# Resolve a Cheat Engine pointer scan
health_pointer = deep_pointer_ex(process, game_mod.base + 0xdeadbeef, [0xA0, 0x04, 0x10, 0xF0, 0x0])

# Set player health to 1337 forever
while True:
    write_memory_ex(process, health_pointer, bytearray(int(1337).to_bytes(4)))
    time.sleep(0.2)

Документация

Основная документация по libmem находится в файле include/libmem.h. Все API задокументированы и содержат подробную информацию о каждой функции, её параметрах и возвращаемом значении. Она расположена в комментариях непосредственно над кодом, поэтому вы должны иметь возможность видеть её, наведя курсор в вашем текстовом редакторе/IDE.

Аналогично, документация по привязкам (bindings) встроена в их пакеты, поэтому ваш текстовый редактор/IDE должен иметь возможность получить доступ к документации для каждого API.

Неофициальные привязки (Bindings)

Эти привязки сделаны сообществом/сторонними разработчиками и не связаны с проектом libmem или его автором.

Их код может иметь собственные лицензии, отличные от лицензии libmem.

Использование через CMake (без установки)

Добавьте следующие команды в ваш CMakeLists.txt.

Они загрузят libmem-config.cmake из корня этого репозитория, который скачает бинарные файлы libmem для вашей системы и подключит libmem в ваш проект CMake.

include(FetchContent)

# Download and set up libmem
FetchContent_Declare(libmem-config URL "https://raw.githubusercontent.com/rdbo/libmem/config-v1/libmem-config.cmake" DOWNLOAD_NO_EXTRACT TRUE)
FetchContent_MakeAvailable(libmem-config)
set(CMAKE_PREFIX_PATH "${libmem-config_SOURCE_DIR}" "${CMAKE_PREFIX_PATH}")
set(LIBMEM_DOWNLOAD_VERSION "5.0.0")

# Find libmem package
find_package(libmem CONFIG REQUIRED)

Используйте следующее для связывания (линковки) с libmem (ПРИМЕЧАНИЕ: может потребоваться связывание с другими зависимостями — перейдите в раздел Зависимости для получения дополнительной информации):

# Link against libmem
target_link_libraries(<YOUR_TARGET_NAME> PRIVATE libmem::libmem)

Установка

Windows

Примечание: Если вы скачиваете бинарную версию libmem из релизов GitHub, вам нужно установить только Windows SDK. Сборка не необходима, просто добавьте libmem/include в каталоги включения вашего проекта и свяжите его с скачанным бинарным файлом.

  1. Установите Windows SDK: Windows 7 - Windows 10/11

  2. Установите Python 3 (Установите галочку, чтобы добавить Python в PATH) (Используйте Python 3.8.9 для Windows 7)

  3. Установите Visual Studio 2022 или новее (с поддержкой C++ и CMake) (старые версии могут работать, но они не тестировались). ПРИМЕЧАНИЕ: Вы можете установить только Visual Studio Build Tools, если вам не нужна полная IDE.

  4. Установите Git Bash

  5. Запустите Developer Command Prompt от Visual Studio (или x64 Native Tools Command Prompt for VS 2022 для 64 бит) от имени администратора

  6. Запустите следующую команду, чтобы добавить каталог назначения libmem в вашу пользовательскую переменную %PATH% (ВНИМАНИЕ — следите за лимитом размера вашей переменной %PATH%):

    setx PATH "%PATH%;%ProgramFiles%\libmem\include;%ProgramFiles%\libmem\lib"
    
  7. Продолжайте чтение в разделе Сборка и установка

Linux

Примечание: Следующие команды предназначены для дистрибутивов на основе Debian/Ubuntu. Убедитесь, что нашли подходящие команды для вашего дистрибутива Linux.

  1. Откройте терминал

  2. Установите GCC, G++, Git, CMake, Make, Python 3 и заголовки Linux:

    sudo apt install gcc g++ git cmake make python3 linux-headers
    
  3. Продолжайте чтение в разделе Сборка и установка

FreeBSD

  1. Добавьте точку монтирования для файловой системы procfs в ваш /etc/fstab, дописав следующую строку:

    proc        /proc       procfs  rw  0   0
    
  2. Вручную смонтируйте procfs. Это потребуется только в том случае, если вы не перезагружаетесь. Если вы перезагрузитесь, она будет смонтирована автоматически благодаря строке в /etc/fstab. Выполните следующую команду (от root):

    mount -t procfs proc /proc
    
  3. Установите Git, CMake и Python3 (выполняйте от root) (clang, clang++ и make, вероятно, уже установлены):

    pkg install git cmake python3
    
  4. Продолжайте чтение в разделе Сборка и установка

Сборка и установка

Примечание: Выполняйте следующие команды в Git Bash (Windows) или в терминале (Linux/FreeBSD).

Клонируйте репозиторий:

git clone --recursive --depth 1 https://github.com/rdbo/libmem

Сгенерируйте кэш CMake:

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

Компилируйте libmem:

Windows: nmake

Unix-подобные: make -j 4

Установите libmem (выполняйте от root или от администратора):

Windows: nmake install

Unix-подобные: make install

После установки следуйте соответствующему разделу Использование для вашего языка программирования

Использование (C/C++)

Добавьте #include <libmem/libmem.h> (C/C++) или #include <libmem/libmem.hpp> (C++) в ваш исходный код. Свяжите (линкуйте) скомпилированную библиотеку libmem с вашим бинарным файлом (liblibmem.so для Unix-подобных систем или libmem.dll для Windows). Для компиляторов, подобных GCC: добавьте флаг -llibmem к компилятору, и он должен выполнить связывание.

#include <libmem/libmem.h> /* C/C++ */
#include <libmem/libmem.hpp> /* Force C++ */

Использование (Rust)

ПРИМЕЧАНИЕ: Вам больше не нужно устанавливать libmem для использования с Rust, при условии, что возможность fetch включена в crate libmem (по умолчанию). Если вы отключите эту возможность, Rust будет искать libmem в вашей системе, и вы можете явно указать путь к libmem, используя переменную окружения LIBMEM_DIR=<путь к каталогу libmem>.

Добавьте следующую строку в ваш Cargo.toml в секцию [dependencies]:

libmem = "5"

Импортируйте libmem в вашем исходном коде на Rust:

use libmem::*;

Использование (Python)

ПРИМЕЧАНИЕ: Вам больше не нужно устанавливать libmem для использования с Python. Если установленная версия не найдена, пакет автоматически скачает и свяжет libmem для вас. Вы можете использовать переменную окружения LIBDIR=<путь к каталогу libmem>, чтобы указать пакету libmem, где искать вашу установку (если вы её выполняли).

Убедитесь, что Python >= 3.6 активен
Либо установите пакет libmem из PyPi, выполнив следующую команду:

pip install --upgrade libmem

Либо соберите и установите его вручную, выполнив следующие команды:

cd libmem-py
python configure.py
python setup.py install

Теперь, чтобы импортировать libmem, просто выполните следующее в вашем Python-коде:

from libmem import *

Зависимости

Все: - capstone (включена в корневой проект) - keystone (включена в корневой проект) - LIEF (включена в корневой проект) - libstdc++ (используется в keystone, LIEF и LLVM) - libmath (используется в keystone)

Windows:
- Windows SDK (-luser32, -lpsapi, -lntdll)

Linux/Android:
- libdl (-ldl)

BSD:
- libdl (-ldl)
- libkvm (-lkvm) - libprocstat (-lprocstat)
- libelf (-lelf)

Обзор API

LM_EnumProcesses
LM_GetProcess
LM_GetProcessEx
LM_FindProcess
LM_IsProcessAlive
LM_GetBits
LM_GetSystemBits

LM_EnumThreads
LM_EnumThreadsEx
LM_GetThread
LM_GetThreadEx
LM_GetThreadProcess

LM_EnumModules
LM_EnumModulesEx
LM_FindModule
LM_FindModuleEx
LM_LoadModule
LM_LoadModuleEx
LM_UnloadModule
LM_UnloadModuleEx

LM_EnumSymbols
LM_FindSymbolAddress
LM_DemangleSymbol
LM_FreeDemangledSymbol
LM_EnumSymbolsDemangled
LM_FindSymbolAddressDemangled

LM_EnumSegments
LM_EnumSegmentsEx
LM_FindSegment
LM_FindSegmentEx

LM_ReadMemory
LM_ReadMemoryEx
LM_WriteMemory
LM_WriteMemoryEx
LM_SetMemory
LM_SetMemoryEx
LM_ProtMemory
LM_ProtMemoryEx
LM_AllocMemory
LM_AllocMemoryEx
LM_FreeMemory
LM_FreeMemoryEx
LM_DeepPointer
LM_DeepPointerEx

LM_DataScan
LM_DataScanEx
LM_PatternScan
LM_PatternScanEx
LM_SigScan
LM_SigScanEx

LM_GetArchitecture
LM_Assemble
LM_AssembleEx
LM_FreePayload
LM_Disassemble
LM_DisassembleEx
LM_FreeInstructions
LM_CodeLength
LM_CodeLengthEx

LM_HookCode
LM_HookCodeEx
LM_UnhookCode
LM_UnhookCodeEx

LM_VmtNew
LM_VmtHook
LM_VmtUnhook
LM_VmtGetOriginal
LM_VmtReset
LM_VmtFree

Участие в разработке

Прочитайте файл CONTRIBUTING.md в корневом каталоге этого репозитория

Проекты

Сделано с помощью libmem:
- AssaultCube Multihack
- X-Inject
- DirectX9 BaseHook
- DirectX11 BaseHook
- OpenGL BaseHook
- Counter-Strike 1.6 BaseHook

Комментарии
Войдите, чтобы оставить комментарий