我写了以下函数:
template <typename T> void SetPointer(DWORD64 base, vector<DWORD>Offsets, T value){
base = *reinterpret_cast<DWORD64*>(base);
for (int i = 0; i < Offsets.size() - 1; i++){
base = *reinterpret_cast<DWORD64*>(base + Offsets[i]);
}
*reinterpret_cast<T*>(base + Offsets[Offsets.size() - 1]) = value;
}
它完美无缺,除了我想要检查以确保地址有效并且它不会导致崩溃,但我还没有找到任何有效的方法要做到这一点。实现这一目标的最佳方式是什么?
编辑: 这就是我需要的技巧:
template <typename T> void SetPointer(DWORD64 base, vector<DWORD>Offsets, T value){
if (base == 0) return;
base = *reinterpret_cast<DWORD64*>(base);
for (int i = 0; i < Offsets.size() - 1; i++){
base = *reinterpret_cast<DWORD64*>(base + Offsets[i]);
if (base == Offsets[i] || base == 0) return;
}
*reinterpret_cast<T*>(base + Offsets[Offsets.size() - 1]) = value;
}
答案 0 :(得分:1)
tl;博士:这是不可能的。
长版:
Windows具有名为IsBadXxxPtr
的功能,这是着名的Microsoft程序员对它们及其功能所说的话: