kvm的memory接口介绍

✅ 类构造与析构

1
2
3
4
5
6
7
Memory::Memory() { }

Memory::~Memory() {
VMMDLL_Close(this->vHandle);
DMA_INITIALIZED = false;
PROCESS_INITIALIZED = false;
}
  • 析构时关闭句柄,重置标志。
  • ✅ 建议加上 nullptr 检查或异常安全的关闭逻辑。

✅ DumpMemoryMap

1
bool Memory::DumpMemoryMap(bool debug)
  • 生成物理内存映射文件 mmap.txt 并写入临时目录(Windows 路径)。
  • ✅ 用于 -memmap 参数提升物理内存访问性能。
  • ⚠️ Windows 路径写死为 \\mmap.txt,在 Linux 下需修改为 /tmp/mmap.txt 形式,建议使用 std::filesystem::path::preferred_separator

✅ Init

1
bool Memory::Init(std::string process_name, bool memMap, bool debug)
  • 初始化 VMMDLL 连接、插件、导入 mmap.txt。
  • 自动 fallback:如果开启 memMap 初始化失败,则重试禁用 mmap。
  • ✅ 自动修复 CR3。
  • ⚠️ 参数列表太多建议结构化,长逻辑建议拆分子函数。

✅ GetPidFromName

1
DWORD Memory::GetPidFromName(std::string process_name)
  • 获取指定进程名的 PID。
  • 简洁直观 ✅

✅ GetPidListFromName

1
std::vector<int> Memory::GetPidListFromName(std::string name)
  • 支持模糊匹配多个同名进程。
  • ✅ 返回多个匹配项用于多进程游戏处理。

✅ GetModuleList

1
std::vector<std::string> Memory::GetModuleList(std::string process_name)
  • 获取进程中模块名列表。
  • 可用于检查注入模块、判断是否加载 DLL。

✅ GetProcessInformation

  • 返回当前进程的完整 VMMDLL_PROCESS_INFORMATION
  • ✅ 可拓展做模块偏移判断或附加信息展示。

✅ GetBaseDaddy / GetBaseSize

1
2
size_t GetBaseDaddy(std::string module_name)
size_t GetBaseSize(std::string module_name)
  • 获取模块基址与大小。
  • ✅ 多模块支持。
  • ⚠️ 变量命名可改为 GetModuleBaseAddress 更语义化。

✅ GetExportTableAddress / GetImportTableAddress

1
2
uintptr_t GetExportTableAddress(std::string import, std::string process, std::string module)
uintptr_t GetImportTableAddress(std::string import, std::string process, std::string module)
  • 解析模块导出 / 导入表,返回指定函数的地址。
  • ✅ 支持跨模块解析。
  • ⚠️ mem.GetPidFromName(process) 调用依赖全局对象 mem,建议改为类成员或参数传入,避免耦合。

✅ FixCr3

  • 修复 DTB / CR3,使得 memflow 能正确解析虚拟地址。
  • dtb.txt 中遍历候选项,尝试修复并检测 magic。
  • ✅ 自动化 CR3 修复。
  • ⚠️ 强依赖 procinfo 插件和其格式,建议加超时逻辑避免卡死。

✅ FindSignature

  • 签名扫描逻辑,支持通配符 ?
  • 读取整个区段内容后本地匹配。
  • ⚠️ 若 range 很大(如整个 .text 区),会造成内存消耗大,应考虑分页读取优化。

✅ Scatter API 封装

1
2
3
4
5
VMMDLL_SCATTER_HANDLE CreateScatterHandle()
AddScatterReadRequest()
AddScatterWriteRequest()
ExecuteReadScatter()
ExecuteWriteScatter()
  • 封装 Scatter 操作批处理 DMA。
  • ✅ 用于高性能读写。
  • ⚠️ 建议统一处理失败情况并暴露错误码(不是单纯 LOG)。

✅ get_base_address

1
2
uint64_t get_base_address()
uint64_t get_base_address(const char* module_name)
  • 快捷访问当前进程或指定模块的基址。
  • ✅ 可直接用于偏移计算。

总结与优化建议

类型 建议
✅ 正确性 功能完整、覆盖广,适配主流memflow接口,逻辑合理。
🧠 可读性 方法命名建议更语义化(如GetBaseDaddyGetModuleBase),参数可结构化。
🧱 模块性 避免使用全局mem,函数间解耦更好。
⚡ 性能 FindSignature建议分页查找,避免一次性读大内存;DumpMemoryMap 路径写法兼容 Linux。
🔒 稳定性 FixCr3建议加超时保护;VMMDLL_*使用需判断句柄是否有效,防止空指针。