这是一个应该在内存中的特定位置(在特定进程中)修补字节的函数。
VirtualProtectEx函数实际上是做什么的?为什么需要它来修补字节?
void PatchEx(BYTE* dst, BYTE* src, unsigned int size, HANDLE hProcess)
{
DWORD oldprotect;
VirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
WriteProcessMemory(hProcess, dst, src, size, nullptr);
VirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);
}
我试着在msdn上查找它,但我真的不明白他们的描述。
我不明白为什么它是必需的。因为我认为我已经有写内存的权利了?为什么我需要给它额外的权利,DWORD oldprotect;
的意义是什么?
1条答案
按热度按时间2eafrhcq1#
正如文档所说,
VirtualProtectEx
在指定的进程中更改内存范围的内存保护设置。(与VirtualProtect
相反,它总是在当前进程上工作。)在这个特殊的例子中,第一次调用这个函数可以确保你要写的内存实际上是可写的,同时将旧的保护设置存储在
oldprotect
中。这只是做个好公民因为我认为我已经有权利写记忆?
你可能有权限访问这个进程(如果没有,函数将失败,但你实际上没有检查)。但默认情况下,进程中的代码是不可写的。如果进程运行在与你的黑客相同的特权级别和会话中,你有权限更改它。但你需要这样做。
另外,很明显你自己没有写这个函数,所以在你的特定情况下,内存甚至可能是可写的,原作者不能假设这一点。