https://discord.com/invite/Qw8jsPD99X
該專案已獲得GNU AGPLv3.0
許可(無更高版本)
閱讀LICENSE
以獲取更多信息
注意:子模組和外部依賴項可能有自己的許可證!也要檢查他們的許可證。
作業系統 | x86 | x64 | 手臂 | 阿爾克64 |
---|---|---|---|---|
視窗 | ✅ | ✅ | ||
Linux | ✅ | ✅ | ||
自由BSD | ✔️ | ✔️ |
地位 | 描述 |
---|---|
✅ | 100% 工作 |
✔️ | 大部分時間都在工作 |
未經測試 |
還有更多!
/* C++20 or higher */
# include < libmem/libmem.hpp >
# include < iostream >
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 ]
*/
#include
void hk_take_damage ( int amount )
{
printf ( "hooked take_damage! no damage will be takenn" );
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': %pn" , game_mod . base );
fn_take_damage = LM_FindSymbolAddress ( & game_mod , "take_damage" );
printf ( "[*] Found 'take_damage' function: %pn" , fn_take_damage );
LM_HookCode ( fn_take_damage , hk_take_damage , LM_NULLPTR );
printf ( "[*] 'take_damage' hooked, player will no longer receive damagen" );
return 0 ;
}
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 ( ) ;
}
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 的不同。
將以下命令新增至您的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.2" )
# Find libmem package
find_package (libmem CONFIG REQUIRED)
使用以下命令連結 libmem(注意:可能需要連結其他依賴項 - 請參閱Dependencies
部分以了解更多資訊):
# Link against libmem
target_link_libraries ( PRIVATE libmem::libmem)
注意:如果您在 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 建置工具。
安裝 Git Bash
以管理員身分執行 Visual Studio Developer Command Prompt
(或 64 位元x64 Native Tools Command Prompt for VS 2022
)
執行以下命令將 libmem 的目標目錄附加到您的%PATH%
用戶變數(警告- 注意您的%PATH%
大小限制!):
setx PATH "%PATH%;%ProgramFiles%libmeminclude;%ProgramFiles%libmemlib"
繼續閱讀Build and Install
注意:以下指令適用於基於 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
透過附加以下行,在/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
部分
將#include
(C/C++) 或#include
(C++) 加入原始程式碼。將產生的 libmem 函式庫連結到您的二進位檔案(對於類別 Unix 系統為liblibmem.so
,對於 Windows 系統為libmem.dll
)。對於類似 GCC 的編譯器:將標誌-llibmem
新增到您的編譯器中,它應該連結它。
#include /* C/C++ */
#include /* Force C++ */
注意:只要在 libmem 箱上啟用了fetch
功能(預設),您就不再需要安裝 libmem 來與 Rust 一起使用。如果停用該功能,它將在系統中尋找 libmem,並且您可以使用環境變數LIBMEM_DIR=
明確顯示 libmem 路徑。
將以下行加入Cargo.toml
的[dependencies]
下:
libmem = " 5 "
在 Rust 原始碼中導入 libmem:
use libmem :: * ;
注意:您不再需要安裝 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 *
全部:
視窗:
Linux/安卓:
BSD:
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 製作: