4 个版本 (2 个稳定版)
5.0.1 | 2024 年 8 月 6 日 |
---|---|
5.0.0 | 2024 年 6 月 12 日 |
5.0.0-pre6 | 2024 年 5 月 30 日 |
5.0.0-pre5 | 2024 年 5 月 28 日 |
#381 in Unix APIs
每月 124 次下载
在 libmem 中使用
83KB
1K SLoC
高级游戏破解库 (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
添加到项目包含目录中,并将其链接到您下载的二进制文件。
-
安装Windows SDK:Windows 7 - Windows 10/11
-
安装 Python 3(勾选将Python添加到PATH的选项)(使用 Python 3.8.9 用于Windows 7)
-
安装 Visual Studio 2022或更高版本(带有C++支持和CMake)(旧版本可能也能工作,但尚未测试)。注意:如果您不想安装整个IDE,可以仅安装Visual Studio Build Tools。
-
安装 Git Bash
-
以管理员身份运行Visual Studio
Developer Command Prompt
(或64位版本的x64 Native Tools Command Prompt for VS 2022
) -
运行以下命令将libmem的目标目录追加到您的
%PATH%
用户变量中(警告 - 注意您的%PATH%
大小限制!)setx PATH "%PATH%;%ProgramFiles%\libmem\include;%ProgramFiles%\libmem\lib"
-
继续阅读
构建和安装
Linux
注意:以下命令适用于基于Debian/Ubuntu的发行版。请确保找到适合您的Linux发行版的相应命令。
-
打开一个终端
-
安装GCC、G++、Git、CMake、Make、Python 3和Linux头文件
sudo apt install gcc g++ git cmake make python3 linux-headers
-
继续阅读
构建和安装
FreeBSD
-
在您的
/etc/fstab
中添加一个用于procfs
文件系统的挂载点,通过追加以下行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
安装后,根据您的编程语言的相应 用法
部分进行操作
用法(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