rdbo/libmem
GitHub: rdbo/libmem
一款面向多语言、跨平台的高级游戏内存操作库,提供进程内存读写、Hook 与代码注入能力。
Stars: 1218 | Forks: 128

### 高级游戏破解库 (C/C++/Rust/Python) (Windows/Linux/FreeBSD)
### 由 rdbo 制作
## 许可证
本项目基于 `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:|未测试|
## 功能
- [x] 内部与外部
- [x] 查找和枚举进程、模块、符号、线程和段
- [x] 读取/写入内存
- [x] 分配/保护内存
- [x] 按 Pattern/Signature 扫描内存
- [x] 解析 Pointer Scans/Pointer Maps
- [x] Hook/Unhook 函数
- [x] 汇编/反汇编代码 (JIT)
- [x] VMT Hooking/Unhooking
- [x] 加载/卸载模块
- [x] 枚举进程线程
***以及更多!***
## 示例
### 现代 C++
```
/* C++20 or higher */
#include
#include
using namespace libmem;
int main()
{
Address disas_addr = reinterpret_cast(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
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)
# 解析 Cheat Engine 指针扫描
health_pointer = deep_pointer_ex(process, game_mod.base + 0xdeadbeef, [0xA0, 0x04, 0x10, 0xF0, 0x0])
# 将玩家生命值永久设置为 1337
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 的不同。
- [Nim_Libmem](https://github.com/Hypnootika/python_nim_libmem)
- [Crazymem (NodeJS)](https://github.com/karliky/Crazymem)
- [Go Libmem](https://github.com/alexanderthegreat96/libmem-go)
## CMake 使用(无需安装)
将以下命令添加到您的 `CMakeLists.txt` 中。
它们将从该存储库的根目录获取 `libmem-config.cmake`,这将为您的系统下载 libmem 二进制文件,并将 libmem 包含在您的 CMake 项目中。
```
include(FetchContent)
# 下载并设置 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.1.4")
# 查找 libmem 包
find_package(libmem CONFIG REQUIRED)
```
使用以下命令链接到 libmem(注意:可能需要链接其他依赖项 - 请转到 `依赖项` 部分获取更多信息):
```
# 链接 libmem
target_link_libraries( PRIVATE libmem::libmem)
```
## 安装
### vcpkg
[](https://vcpkg.io/en/package/libmem)
**注意**: 支持使用 vcpkg 进行包管理
1. 安装 vcpkg (https://github.com/microsoft/vcpkg)
2. 运行以下命令安装 libmem 包:
```
vcpkg install libmem
```
有关安装不同版本的详细命令及更多信息,请参考 Microsoft 官方说明 (https://learn.microsoft.com/en-us/vcpkg/get_started/overview)
### Windows
**注意**:如果您在 GitHub releases 中下载了 libmem 的二进制版本,您只需安装 Windows SDK。无需编译,只需将 `libmem/include` 添加到您项目的包含目录中,并将其与您下载的二进制文件链接即可。
1. 安装 Windows SDK:[Windows 7](https://www.microsoft.com/en-us/download/details.aspx?id=8279) - [Windows 10/11](https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/)
2. 安装 [Python 3](https://python.org/downloads)(勾选将 Python 添加到 PATH 的选项)(Windows 7 请使用 [Python 3.8.9](https://python.org/downloads/release/python-389))
3. 安装 [Visual Studio](https://visualstudio.microsoft.com/) 2022 或更高版本(包含 C++ 支持和 CMake)(旧版本可能也可以,但未经测试)。注意:如果您不需要整个 IDE,可以只安装 Visual Studio Build Tools。
4. 安装 [Git Bash](https://git-scm.com/downloads)
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 headers:
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 -DCMAKE_CXX_FLAGS=-fpermissive -DCMAKE_EXPORT_COMPILE_COMMANDS=1
```
编译 libmem:
*Windows*: `nmake`
*Unix-like*: `make -j 4`
安装 libmem(以 root 或管理员身份运行):
*Windows*: `nmake install`
*Unix-like*: `make install`
安装完成后,请按照适用于您编程语言的具体 `使用方法` 部分进行操作
## 使用方法 (C/C++)
将 `#include ` (C/C++) 或 `#include ` (C++) 添加到您的源代码中。
将生成的 libmem 库与您的二进制文件链接(类 Unix 系统为 `liblibmem.so`,Windows 为 `libmem.dll`)。
*对于类似 GCC 的编译器*:将 `-llibmem` 标志添加到您的编译器中,它就会进行链接。
```
#include /* C/C++ */
#include /* Force C++ */
```
## 使用方法 (Rust)
**注意**:只要在 libmem crate 上启用了 `fetch` 特性(默认启用),您就不再需要安装 libmem 即可使用 Rust。如果禁用该特性,它将在您的系统中查找 libmem,并且您可以使用环境变量 `LIBMEM_DIR=` 来显式指定 libmem 路径。
在 `[dependencies]` 下的 `Cargo.toml` 中添加以下行:
```
libmem = "5"
```
在您的 Rust 源代码中导入 libmem:
```
use libmem::*;
```
## 使用方法 (Python)
**注意**:您不再需要安装 libmem 即可在 Python 中使用。如果未找到安装,该包将为您无缝获取并链接 libmem。您可以使用 `LIBDIR=` 环境变量来告诉 libmem 包在哪里查找您的安装(如果您已经安装了它)。
确保已激活 Python >= 3.6
通过运行以下命令从 PyPi 安装 `libmem` 包:
```
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 (user32.lib, psapi.lib, ntdll.lib, shell32.lib)
Linux/Android:
- libdl (-ldl)
BSD:
- libdl (-ldl)
- libkvm (-lkvm)
- libprocstat (-lprocstat)
- libelf (-lelf)
## API 概览
```
** Process APIs **
LM_EnumProcesses
LM_GetProcess
LM_GetProcessEx
LM_GetCommandLine
LM_FreeCommandLine
LM_FindProcess
LM_IsProcessAlive
LM_GetBits
LM_GetSystemBits
** Thread APIs **
LM_EnumThreads
LM_EnumThreadsEx
LM_GetThread
LM_GetThreadEx
LM_GetThreadProcess
** Module APIs **
LM_EnumModules
LM_EnumModulesEx
LM_FindModule
LM_FindModuleEx
LM_LoadModule
LM_LoadModuleEx
LM_UnloadModule
LM_UnloadModuleEx
** Symbol APIs **
LM_EnumSymbols
LM_FindSymbolAddress
LM_DemangleSymbol
LM_FreeDemangledSymbol
LM_EnumSymbolsDemangled
LM_FindSymbolAddressDemangled
** Memory Segment APIs **
LM_EnumSegments
LM_EnumSegmentsEx
LM_FindSegment
LM_FindSegmentEx
** Memory APIs **
LM_ReadMemory
LM_ReadMemoryEx
LM_WriteMemory
LM_WriteMemoryEx
LM_SetMemory
LM_SetMemoryEx
LM_ProtMemory
LM_ProtMemoryEx
LM_AllocMemory
LM_AllocMemoryEx
LM_FreeMemory
LM_FreeMemoryEx
** Scanning APIs **
LM_DeepPointer
LM_DeepPointerEx
LM_DataScan
LM_DataScanEx
LM_PatternScan
LM_PatternScanEx
LM_SigScan
LM_SigScanEx
** Assembler APIs **
LM_GetArchitecture
LM_Assemble
LM_AssembleEx
LM_FreePayload
LM_Disassemble
LM_DisassembleEx
LM_FreeInstructions
LM_CodeLength
LM_CodeLengthEx
** Hooking APIs **
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](https://github.com/rdbo/AssaultCube-Multihack)
- [X-Inject](https://github.com/rdbo/x-inject)
- [DirectX9 BaseHook](https://github.com/rdbo/DX9-BaseHook)
- [DirectX11 BaseHook](https://github.com/rdbo/DX11-BaseHook)
- [OpenGL BaseHook](https://github.com/rdbo/GL-BaseHook)
- [Counter-Strike 1.6 BaseHook](https://github.com/rdbo/cstrike-basehook)
标签:云资产清单, 内存修改, 函数Hook, 客户端加密, 汇编与反汇编, 游戏开发, 跨平台, 逆向工程