#memory #hook #disassembler #assembly #game-hacking #freebsd #linux

sys libmem-sys

高级游戏破解库 (Windows/Linux/FreeBSD)

4 个版本 (2 个稳定版)

5.0.1 2024 年 8 月 6 日
5.0.0 2024 年 6 月 12 日
5.0.0-pre62024 年 5 月 30 日
5.0.0-pre52024 年 5 月 28 日

#381 in Unix APIs

Download history 187/week @ 2024-05-24 61/week @ 2024-05-31 154/week @ 2024-06-07 40/week @ 2024-06-14 9/week @ 2024-06-21 2/week @ 2024-06-28 109/week @ 2024-08-02 15/week @ 2024-08-09

每月 124 次下载
libmem 中使用

AGPL-3.0

83KB
1K 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二进制文件下载并将在您的CMake项目中包含libmem。

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(注意:可能需要链接到其他依赖项 - 请参阅 依赖项 部分,以获取更多信息)

# 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的选项)(使用 Python 3.8.9 用于Windows 7)

  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. 继续阅读 构建和安装

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. 在您的 /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. 继续阅读 构建和安装

构建和安装

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

Windowsnmake

类Unixmake -j 4

安装libmem(以root或管理员身份运行)

Windowsnmake install

类Unixmake install

安装后,根据您的编程语言的相应 用法 部分进行操作

用法(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。如果您禁用该功能,它将在您的系统中查找 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.6MB
~18K SLoC