13 个版本 (8 个稳定版)

5.0.1 2024年8月6日
5.0.0 2024年6月12日
5.0.0-pre62024年5月30日
4.4.0 2023年12月13日
0.1.2 2023年1月19日

#64 in 操作系统

Download history 15/week @ 2024-05-20 173/week @ 2024-05-27 14/week @ 2024-06-03 174/week @ 2024-06-10 22/week @ 2024-06-17 6/week @ 2024-07-01 124/week @ 2024-08-05

124 每月下载量

AGPL-3.0

145KB
2.5K SLoC

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 ⚠️ ⚠️
Linux ⚠️ ⚠️
FreeBSD ✔️ ✔️ ⚠️ ⚠️
状态 描述
100% 正常工作
✔️ 大部分正常工作
⚠️ 未测试

功能

  • 内部和外部
  • 查找和枚举进程、模块、符号、线程和段
  • 读取/写入内存
  • 分配/保护内存
  • 按模式/签名扫描内存
  • 解析指针扫描/指针映射
  • 钩/卸钩函数
  • 汇编/反汇编代码(JIT)
  • VMT 钩/卸钩
  • 加载/卸载模块
  • 枚举进程线程

等等!

示例

现代C++

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

using namespace libmem;

int main()
{
	Address disas_addr = reinterpret_cast<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上悬停来查看它们。

同样,绑定文档嵌入到它们的包中,因此您的文本编辑器/IDE应该能够访问每个API的文档。

非官方绑定

这些绑定由社区/第三方完成,与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.1")

# Find libmem package
find_package(libmem CONFIG REQUIRED)

使用以下方法链接到 libmem(注意:可能需要链接到其他依赖项 - 有关更多信息,请参阅 Dependencies 部分)

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

安装

Windows

注意:如果您在 GitHub 发布中下载了 libmem 的二进制版本,您只需安装 Windows SDK。不需要构建,只需将 libmem/include 添加到您的项目包含目录,并将其链接到您下载的二进制文件。

  1. 安装 Windows SDK:Windows 7 - Windows 10/11

  2. 安装 Python 3(选择将 Python 添加到 PATH)(Windows 7 使用 Python 3.8.9

  3. 安装 Visual Studio 2022 或更高版本(带 C++ 支持和 CMake)(较旧版本可能可行,但未经过测试)。注意:如果您不需要整个 IDE,可以仅安装 Visual Studio Build Tools。

  4. 安装 Git Bash

  5. 以管理员身份运行 Visual Studio Developer Command Prompt(或 64 位版本的 x64 Native Tools Command Prompt for VS 2022

  6. 运行以下命令将 libmem 的目标目录添加到您的 %PATH% 用户变量(警告 - 注意您的 %PATH% 大小限制!)

     setx PATH "%PATH%;%ProgramFiles%\libmem\include;%ProgramFiles%\libmem\lib"
    
  7. 继续阅读 Build and Install

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. 继续阅读 Build and Install

FreeBSD

  1. 在您的 /etc/fstab 中添加一个用于 procfs 文件系统的挂载点,追加以下行

     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. 继续阅读 Build and Install

构建和安装

注意:在 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

安装后,请参阅您编程语言的适当 Usage 部分

用法(C/C++)

在源代码中添加 #include <libmem/libmem.h> (C/C++) 或 #include <libmem/libmem.hpp> (C++)。将生成的libmem库链接到您的二进制文件(Unix-like 系统为 liblibmem.so,Windows 系统为 libmem.dll)。对于 GCC-like 编译器:在编译器中添加标志 -llibmem 应该会进行链接。

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

使用方法(Rust)

注意:只要在libmem crate中启用了 fetch 功能(默认),您就不再需要安装libmem来与Rust一起使用。如果您禁用了该功能,它将在您的系统中查找libmem,并且您可以通过使用环境变量 LIBMEM_DIR=<path to libmem's directory> 来明确指定libmem的路径。

Cargo.toml 中的 [dependencies] 下添加以下行

libmem = "5"

在您的Rust源代码中导入libmem

use libmem::*;

使用方法(Python)

注意:您不再需要安装libmem来与Python一起使用。如果没有找到安装,该包将无缝为您获取并链接libmem。您可以使用环境变量 LIBDIR=<path to libmem's directory> 来告诉libmem包您的安装位置(如果已安装)。

请确保Python版本大于等于3.6
可以通过运行以下命令从PyPi安装 libmem

pip install --upgrade libmem

或通过运行以下命令自行构建和安装它

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

现在要在Python代码中导入libmem,只需按以下步骤操作

from libmem import *

依赖项

所有

  • capstone(包含在根项目中)
  • keystone(包含在根项目中)
  • LIEF(包含在根项目中)
  • libstdc++(在keystone、LIEF和LLVM中使用)
  • libmath(在keystone中使用)

Windows

  • Windows SDK(user32.lib、psapi.lib、ntdll.lib、shell32.lib)

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制作

依赖项

~0–1.5MB
~19K SLoC