跳转至

编写模板化的内存访问函数

当然,清单 6-4 中的示例假设你已经知道要处理的内存类型,并把类型硬编码为 DWORD。要成为多才多艺的黑客,最好在工具箱里有一些通用代码,避免为不同类型重复编写代码。支持不同类型的通用内存读写函数可能看起来像清单 6-5。

template<typename T>
T readMemory(HANDLE proc, LPVOID adr) {
    T val;
    ReadProcessMemory(proc, adr, &val, sizeof(T), 
NULL);
    return val;
template<typename T>
void writeMemory(HANDLE proc, LPVOID adr, T val) {
    WriteProcessMemory(proc, adr, &val, sizeof(T), 
NULL);
}

清单 6-5:通用内存函数

这些函数使用 C++ 模板接受任意类型作为参数。它们允许你以非常干净的方式用任何喜欢的类型访问内存。例如,有了我刚展示的 readMemory() 和 writeMemory() 模板,你可以像清单 6-6 那样调用。

DWORD value = readMemory<DWORD>(proc, adr); // 读取
writeMemory<DWORD>(proc, adr, value++); // 递增并写入

清单 6-6:调用模板化的内存访问函数

把它与清单 6-4 中对 WriteProcessMemory() 和 ReadProcessMemory() 的调用比较。这段代码仍然读取一个值、递增它,并把新值写入内存。但由于模板化函数让你在调用时指定类型,你不需要为可能要处理的每种数据类型编写新的 readMemory() 和 writeMemory() 函数。这干净得多,因为你经常要处理各种数据。