13 个版本 (8 个稳定版)
5.0.1 | 2024年8月6日 |
---|---|
5.0.0 | 2024年6月12日 |
5.0.0-pre6 | 2024年5月30日 |
4.4.0 | 2023年12月13日 |
0.1.2 | 2023年1月19日 |
#64 in 操作系统
124 每月下载量
145KB
2.5K 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 二进制文件并将 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
添加到您的项目包含目录,并将其链接到您下载的二进制文件。
-
安装 Windows SDK:Windows 7 - Windows 10/11
-
安装 Python 3(选择将 Python 添加到 PATH)(Windows 7 使用 Python 3.8.9)
-
安装 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"
-
继续阅读
Build and Install
Linux
注意:以下命令适用于基于 Debian/Ubuntu 的发行版。请确保找到适用于您的 Linux 发行版的适当命令。
-
打开一个终端
-
安装 GCC、G++、Git、CMake、Make、Python 3 和 Linux 头文件
sudo apt install gcc g++ git cmake make python3 linux-headers
-
继续阅读
Build and Install
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
-
继续阅读
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