DMALibrary Memory类API参考手册:核心接口参数与返回值完整清单
【免费下载链接】DMALibrarySimple but extensive library for DMA users, made for gamehacking项目地址: https://gitcode.com/gh_mirrors/dm/DMALibrary
DMALibrary 是一款面向 DMA(直接内存访问)用户的开发库,核心Memory类封装了 DMA 内存读写、签名扫描、Scatter 批量读写等全部基础操作。本文为 DMALibrary Memory 类 API 参考手册,完整梳理每个接口的参数与返回值,帮助新手快速上手 DMA 内存读写开发。
💡 适合人群:刚接触 DMA 开发、想快速掌握 Memory 类接口用法的开发者。
认识 DMALibrary:Memory 类能做什么
DMALibrary 将vmm.dll、FTD3XX.dll、leechcore.dll三个底层库封装成易用的 C++ 接口,开箱即用的能力包括:
- ⚡ 签名扫描(Sig Scanning)
- ⚡ 内存读写(Read / Write)
- ⚡ Scatter 批量读写
- ⚡ 物理内存地图转储(Dump Memory Map)
- ⚡ 模块内存转储(Dumping Memory)
- ⚡ EAC 的 CR3 修复(Fix CR3)
- ⚡ 目标机键盘状态读取
- ⚡ PID、基础地址、模块列表等实用工具
Memory 类的定义位于DMALibrary/Memory/Memory.h,并提供了全局单例mem,所有接口都通过它直接调用。
快速上手:3 步完成 DMA 初始化
📌 使用任何接口前,先完成这三步:
第 1 步:准备依赖文件
把vmm.dll、FTD3XX.dll、leechcore.dll(由 DMA 设备供应商提供)放到程序根目录。若使用 CR3 修复功能,还需symsrv.dll、dbghelp.dll与info.db(项目内提供了DMALibrary/info.db与Example/info.db)。
第 2 步:调用 Init 初始化
bool Init(std::string process_name, bool memMap = true, bool debug = false)
| 参数 | 说明 |
|---|---|
| process_name | 目标进程名,如 "explorer.exe" |
| memMap | 为 true 时先转储物理内存地图到临时目录,提升 DMA 读取速度 |
| debug | 为 true 时输出底层调试日志 |
返回值:true成功 /false失败(常见原因:设备未连接、进程不存在)。Init 内部会自动完成 PID 获取、CR3 修复、基础地址与大小获取,示例见Example/Example.cpp。
第 3 步:获取模块基础地址,开始读写内存
核心接口清单一:初始化与进程信息
| 接口 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| Init | 进程名、memMap、debug | bool | 初始化 DMA 与目标进程 |
| GetPidFromName | 进程名 | DWORD | 获取进程 PID,0 表示失败 |
| GetPidListFromName | 进程名 | std::vector<int> | 获取所有匹配进程的 PID 列表 |
| GetModuleList | 进程名 | std::vector<std::string> | 获取目标进程的模块名列表 |
| GetProcessInformation | 无 | VMMDLL_PROCESS_INFORMATION | 获取进程详细信息,失败返回空结构 |
| GetProcessPeb | 无 | PEB | 读取进程的 PEB 结构 |
| FixCr3 | 无 | bool | 修复 EAC 造成的 CR3 异常,需依赖符号文件 |
💡 FixCr3 已在 Init 中自动调用;若进程重启后需要重新修复,可手动再调一次。
核心接口清单二:基础地址、导入导出表与内存转储
| 接口 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| GetBaseDaddy | 模块名(可传进程名取主模块) | size_t | 模块基础地址,0 表示失败 |
| GetBaseSize | 模块名 | size_t | 模块映像大小 |
| GetExportTableAddress | 导出名、进程名、模块名 | uintptr_t | 目标进程中导出函数的内存地址 |
| GetImportTableAddress | 导入名、进程名、模块名 | uintptr_t | 目标进程中导入函数(IAT)的地址 |
| DumpMemory | PE 基础地址、保存路径 | bool | 将模块内存转储为 PE 文件 |
💡 DumpMemory 注意事项:地址必须指向有效 PE 头;转储出的文件不会重建导入表(IAT),导入信息会缺失。
核心接口清单三:内存读写(最常用)
读写接口分两种风格:底层缓冲区风格与高层模板风格。
底层(缓冲区风格)
| 接口 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| Read | 地址、目标缓冲区、大小 | bool | 读取目标进程内存 |
| Read(带 pid 重载) | 上述参数 + 指定 PID | bool | 读取指定进程的内存 |
| Write | 地址、源缓冲区、大小 | bool | 写入目标进程内存 |
| Write(带 pid 重载) | 上述参数 + 指定 PID | bool | 写入指定进程的内存 |
高层(模板风格)
| 接口 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| Read<T> | 地址 | 类型为 T 的值 | 直接读出指定类型的值,如 Read<int>、Read<uint64_t> |
| Read<T>(带 pid) | 地址 + PID | 类型为 T 的值 | 从指定进程读取 |
| Write<T> | 地址、值 | 无 | 直接写入指定类型的值 |
| ReadChain | 基础地址 + 偏移链 vector | 链末端的值 | 一次调用读完整条指针偏移链 |
🎯 示例:mem.Read<int>(base + 0x66)即从基础地址偏移 0x66 处直接读出 4 字节整数;模板重载的内联实现可见DMALibrary/Memory/Memory.h。
核心接口清单四:签名扫描
uint64_t FindSignature(const char* signature, uint64_t range_start, uint64_t range_end, int PID = 0)
| 参数 | 说明 |
|---|---|
| signature | 字节签名,支持通配符 ?,如 "48 ? ? ?" |
| range_start | 扫描起始地址 |
| range_end | 扫描结束地址 |
| PID | 可选,默认使用当前目标进程 |
返回值:第一个匹配位置的地址;返回 0 表示无匹配或参数无效(签名空、范围倒置等)。
💡 建议:先用 GetBaseDaddy 定位模块范围再扫描,范围过大时 DMA 扫描会非常缓慢。
核心接口清单五:Scatter 批量读写(高频场景必备)
每帧需要读取大量分散地址时(如批量读取游戏对象数据),逐次 Read 效率较低。Scatter 接口把多个请求攒批后一次性提交,可显著提升吞吐。
| 接口 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| CreateScatterHandle | 无 / pid | VMMDLL_SCATTER_HANDLE | 创建散读散写句柄 |
| AddScatterReadRequest | 句柄、地址、缓冲区、大小 | 无 | 追加一个读请求(另有模板重载自动推导大小) |
| AddScatterWriteRequest | 句柄、地址、缓冲区、大小 | 无 | 追加一个写请求 |
| ExecuteReadScatter | 句柄、pid(可选) | 无 | 执行全部读请求并清空队列 |
| ExecuteWriteScatter | 句柄、pid(可选) | 无 | 执行全部写请求并清空队列 |
| CloseScatterHandle | 句柄 | 无 | 关闭句柄,务必调用以免内存泄漏 |
使用流程:创建句柄 → 追加请求 → 执行 → 关闭句柄,完整示例见Example/Example.cpp。
核心接口清单六:获取子模块
Memory 类还封装了 3 个子模块,通过以下接口获取:
| 接口 | 返回值 | 说明 |
|---|---|---|
| GetRegistry | c_registry | 注册表读取,QueryValue 支持 REG_SZ、REG_DWORD 等类型 |
| GetKeyboard | c_keys* | 目标机键盘模块:InitKeyboard 初始化,IsKeyDown(虚拟键码) 检测按键按下 |
| GetShellcode | c_shellcode | 注入工具:find_codecave 找代码洞,call_function 注入并调用函数 |
子模块定义分别在DMALibrary/Memory/InputManager.h、DMALibrary/Memory/Registry.h、DMALibrary/Memory/Shellcode.h。
常见问题 FAQ
Q:Init 返回 false,先检查什么?
依次确认:三个 DLL 是否在根目录、DMA 设备是否已连接、进程名是否正确。若 memMap 为 true 时初始化失败,会自动降级为无内存地图重试。
Q:Read 返回成功但值总是 0?
检查地址是否有效(GetBaseDaddy 是否为 0)、类型大小是否正确、CR3 是否已修复(观察 FixCr3 日志)。
Q:FixCr3 失败?
确认运行目录下存在symsrv.dll、dbghelp.dll和info.db。
Q:为什么 Scatter 执行后读到的是旧值?
请求只是入队,必须调用 ExecuteReadScatter 之后缓冲区里才是新数据。
总结
DMALibrary 的 Memory 类把 DMA 开发的繁琐流程封装成一套即用型 C++ 接口:Init 初始化 → GetBaseDaddy 取基础地址 → Read/Write 读写 → FindSignature 定位特征 → Scatter 高频批量读写。本文已列出全部核心接口的参数与返回值,对照上文清单即可快速完成 DMA 内存读写开发。
【免费下载链接】DMALibrarySimple but extensive library for DMA users, made for gamehacking项目地址: https://gitcode.com/gh_mirrors/dm/DMALibrary
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考