尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

DMALibrary底层原理:vmm.dll与LeechCore如何驱动FPGA读取物理内存

DMALibrary底层原理:vmm.dll与LeechCore如何驱动FPGA读取物理内存 DMALibrary底层原理vmm.dll与LeechCore如何驱动FPGA读取物理内存【免费下载链接】DMALibrarySimple but extensive library for DMA users, made for gamehacking项目地址: https://gitcode.com/gh_mirrors/dm/DMALibraryDMALibrary 是一款面向 DMA 用户的 C 库封装了 FPGA 读取物理内存所需的全部能力信号扫描、内存读写、Scatter 批量读写、进程信息获取、CR3 修复等。本文带你从 FPGA 硬件一路讲清楚 vmm.dll 与 LeechCore 是如何协同工作、把目标进程的内存数据读出来的。一、DMA 与 FPGA为什么能直接读物理内存普通程序想读别的进程内存必须经过操作系统内核很容易被检测。而 DMADirect Memory Access走的是另一条路一张FPGA 开发板通过PCIe 插槽插入主机板上的 FPGA 芯片拥有独立的 DMA 引擎可以直接寻址主板的物理内存完全绕过 CPU 和操作系统的权限检查上位机程序通过 PCIe 寄存器读写 FPGAFPGA 再把物理内存中的数据搬回来。DMALibrary 做的事就是把这条硬件链路包装成一个几行代码就能用的 C 接口。二、核心架构三个 DLL 各司其职打开项目可以看到 DMALibrary/Memory/Memory.cpp构造函数里一次性加载了三个关键 DLL它们构成了一条清晰的调用链层级DLL职责① 设备驱动层FTD3XX.dllFPGA 厂商FTDI的底层驱动负责 PCIe 寄存器的读写② 设备抽象层leechcore.dllLeechCore 统一 DMA 设备接口屏蔽硬件差异头文件 DMALibrary/libs/leechcore.h③ 虚拟内存机vmm.dllVMMDLL建立在 LeechCore 之上的虚拟内存机实现 进程虚拟地址 → 物理内存 的自动翻译头文件 DMALibrary/libs/vmmdll.h 简单理解LeechCore 负责够到内存vmm.dll 负责翻译地址。前者是物理层面的搬运工后者是操作系统层面的解析器。三、初始化流程一条命令打开 DMA 设备调用mem.Init(进程名)实现见 DMALibrary/Memory/Memory.cpp#L128-L197时内部依次完成四件事导出物理内存映射DumpMemoryMap()先建一个临时句柄用VMMDLL_Map_GetPhysMem获取整机物理内存分布写入%temp%\mmap.txtMemory.cpp#L34-L92。这样后续读取时可以跳过无效区域大幅提速。初始化 VMMDLL核心是这一行参数——VMMDLL_Initialize(argc, args) // args 含 -device, fpga://algo0-device fpga://algo0告诉 LeechCore用 FPGA 设备、算法 0设备句柄就此打通。若第一步拿到了映射文件还会追加-memmap mmap.txt参数。配置 FPGASetFPGA()通过VMMDLL_ConfigGet查询 FPGA ID 与固件版本对较新的 FPGAv4/5.7会调用LcCreate(existing)LcCommand(LC_CMD_FPGA_CFGREGPCIE_MARKWR)清除 PCIe 中止寄存器避免后续 DMA 传输被误打断Memory.cpp#L96-L126。定位目标进程VMMDLL_PidGetFromName拿到 PIDVMMDLL_Map_GetModuleFromNameW拿到模块基址与大小随后尝试FixCr3()。四、关键原理CR3 与虚拟地址翻译FPGA 读到的是物理地址的数据而游戏进程用的是虚拟地址中间隔着页面表。vmm.dll 的魔法就在于你只需传入 PID 虚拟地址它会自动沿着CR3DTB→ 页表逐级翻译到物理地址再通过 LeechCore 从 FPGA 读回数据。但 EAC 等反作弊会把目标进程的 CR3 替换成假值让页表翻译彻底失效。DMALibrary 的FixCr3()Memory.cpp#L439-L518是这样破解的先通过VMMDLL_InitializePlugins加载解析插件等进度 100% 后从内置虚拟文件系统的\misc\procinfo\dtb.txt读出全系统所有进程的 DTB 表收集两类嫌疑 DTBPID 为空的条目被 EAC 清空的痕迹和进程名匹配的条目逐个用VMMDLL_ConfigSet(handle, VMMDLL_OPT_PROCESS_DTB | PID, dtb)强制指定直到能成功解析出模块表为止——此时正确的页表就被修复回来了。⚠️ 该功能依赖info.db、symsrv.dll与dbghelp.dll做内核符号解析三者需放在程序根目录。五、内存读写Read/Write 与 Scatter 批量加速初始化完成后日常操作只剩几个简洁接口封装见 DMALibrary/Memory/Memory.h#L220-L231ReadT(地址)/WriteT(地址, 值)内部走VMMDLL_MemReadEx并带上VMMDLL_FLAG_NOCACHE标志Memory.cpp#L710-L731——每次都强制从 FPGA 现读保证数据新鲜不依赖缓存。Scatter 批量读写FPGA 单次传输有固定开销逐字节来回取数据太慢。Scatter 机制允许先批量挂起请求CreateScatterHandle→AddScatterReadRequest再一次性执行ExecuteReadScatter把 N 次 PCIe 往返压缩成尽量少的批次Memory.cpp#L733-L800这是外挂追求高帧率读取的关键。进阶能力ReadChain按偏移链连续解引用、FindSignature基于VMMDLL_MemReadEx的信号扫描Memory.cpp#L654-L688、DumpMemory直接导出整个模块内存Memory.cpp#L520-L629。完整调用顺序可参考示例工程 Example/Example.cppInit → FixCr3 → GetBaseDaddy → Read/Write → Scatter。六、运行与依赖清单 把项目跑起来需要准备这些文件文件用途放置位置FTD3XX.dll、leechcore.dll、vmm.dll运行时三件套来自 DMA 供应商或自行编译程序根目录leechcore.lib、vmm.lib编译期链接库DMALibrary/libs/info.db、symsrv.dll、dbghelp.dllCR3 修复的符号解析程序根目录克隆仓库即可开始阅读源码git clone https://gitcode.com/gh_mirrors/dm/DMALibrary小结回顾整条链路DMALibrary 的底层原理可以浓缩为一句话LeechCore 通过 FTD3XX 驱动操控 FPGA从物理内存搬运原始字节vmm.dll 在其上实现 CR3 页表翻译让你用进程 虚拟地址的直觉直接读写内存——而Init、FixCr3、Scatter 这些接口分别解决打开设备、找回被反作弊隐藏的页表、批量传输提速三个核心问题。理解这三点你就掌握了绝大多数 DMA 读内存方案的设计骨架。【免费下载链接】DMALibrarySimple but extensive library for DMA users, made for gamehacking项目地址: https://gitcode.com/gh_mirrors/dm/DMALibrary创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表