Кросс-платформенная библиотека для манипуляций с памятью процессов (Windows, Linux, macOS, FreeBSD). API: чтение/запись памяти, поиск паттернов (сигнатур), хуки функций через trampoline/detour, инъекция кода и DLL/SO-библиотек, перечисление модулей и символов, разбор PE/ELF-заголовков. Работает как внутри процесса, так и с внешними процессами. Биндинги для C, C++, Rust и Python.
# 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)
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: | Не тестировалось |
И многое другое!
/* 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 ]
*/
#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;
}
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();
}
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.
Эти привязки сделаны сообществом/сторонними разработчиками и не связаны с проектом libmem или его автором.
Их код может иметь собственные лицензии, отличные от лицензии libmem.
Добавьте следующие команды в ваш 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)
Примечание: Если вы скачиваете бинарную версию libmem из релизов GitHub, вам нужно установить только Windows SDK. Сборка не необходима, просто добавьте libmem/include в каталоги включения вашего проекта и свяжите его с скачанным бинарным файлом.
Установите Windows SDK: Windows 7 - Windows 10/11
Установите Python 3 (Установите галочку, чтобы добавить Python в PATH) (Используйте Python 3.8.9 для Windows 7)
Установите Visual Studio 2022 или новее (с поддержкой C++ и CMake) (старые версии могут работать, но они не тестировались). ПРИМЕЧАНИЕ: Вы можете установить только Visual Studio Build Tools, если вам не нужна полная IDE.
Установите Git Bash
Запустите Developer Command Prompt от Visual Studio (или x64 Native Tools Command Prompt for VS 2022 для 64 бит) от имени администратора
Запустите следующую команду, чтобы добавить каталог назначения libmem в вашу пользовательскую переменную %PATH% (ВНИМАНИЕ — следите за лимитом размера вашей переменной %PATH%):
setx PATH "%PATH%;%ProgramFiles%\libmem\include;%ProgramFiles%\libmem\lib"
Продолжайте чтение в разделе Сборка и установка
Примечание: Следующие команды предназначены для дистрибутивов на основе Debian/Ubuntu. Убедитесь, что нашли подходящие команды для вашего дистрибутива Linux.
Откройте терминал
Установите GCC, G++, Git, CMake, Make, Python 3 и заголовки Linux:
sudo apt install gcc g++ git cmake make python3 linux-headers
Продолжайте чтение в разделе Сборка и установка
Добавьте точку монтирования для файловой системы procfs в ваш /etc/fstab, дописав следующую строку:
proc /proc procfs rw 0 0
Вручную смонтируйте procfs. Это потребуется только в том случае, если вы не перезагружаетесь. Если вы перезагрузитесь, она будет смонтирована автоматически благодаря строке в /etc/fstab. Выполните следующую команду (от root):
mount -t procfs proc /proc
Установите Git, CMake и Python3 (выполняйте от root) (clang, clang++ и make, вероятно, уже установлены):
pkg install git cmake python3
Продолжайте чтение в разделе Сборка и установка
Примечание: Выполняйте следующие команды в 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
После установки следуйте соответствующему разделу Использование для вашего языка программирования
Добавьте #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++ */
ПРИМЕЧАНИЕ: Вам больше не нужно устанавливать libmem для использования с Rust, при условии, что возможность fetch включена в crate libmem (по умолчанию). Если вы отключите эту возможность, Rust будет искать libmem в вашей системе, и вы можете явно указать путь к libmem, используя переменную окружения LIBMEM_DIR=<путь к каталогу libmem>.
Добавьте следующую строку в ваш Cargo.toml в секцию [dependencies]:
libmem = "5"
Импортируйте libmem в вашем исходном коде на Rust:
use libmem::*;
ПРИМЕЧАНИЕ: Вам больше не нужно устанавливать 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)
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