rdbo/libmem

GitHub: rdbo/libmem

一款面向多语言、跨平台的高级游戏内存操作库,提供进程内存读写、Hook 与代码注入能力。

Stars: 1218 | Forks: 128

![libmem-logo](https://static.pigsec.cn/wp-content/uploads/repos/cas/49/49b6c43c7f54c7323d1565a4cfdfae3bcfe925ed50dc7e7d9678e105f241103a.png) ### 高级游戏破解库 (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 [![vcpkg](https://img.shields.io/vcpkg/v/libmem)](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, 客户端加密, 汇编与反汇编, 游戏开发, 跨平台, 逆向工程