gpt4 book ai didi

c++ - 虚拟保护大小

转载 作者:行者123 更新时间:2023-11-28 01:39:53 26 4
gpt4 key购买 nike

所以我在 Windows 上玩函数 Hook ,一切都按预期工作。通过用 jmp 指令覆盖我的 LoadLibrary 指针指向的值和我的 Hook 函数的偏移量,我能够在每次调用 LoadLibrary 时执行我自己的代码。要覆盖内存中的字节,我显然需要更改特定内存的保护标志。尽管这工作正常,但我得到了意想不到的结果。

HMODULE APIENTRY hLoadLibrary(LPCWSTR lpFileName) {
MessageBox(NULL, "NOT LOADING A LIBRA1RY!", "YO", MB_OK);

return NULL;
};

BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
DWORD* hookPointer = (DWORD*)&hLoadLibrary;
DWORD* originPointer = (DWORD*)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW");

DWORD offset = (DWORD)hookPointer - (DWORD)originPointer - 5;

DWORD oldProtect;
VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, PAGE_EXECUTE_READWRITE, &oldProtect);

char* p = (char*)originPointer;
*p = '\xE9';
p++;
DWORD* q = (DWORD*)p;
*q = offset;

VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, oldProtect, &oldProtect);

return TRUE;
}

这是哪里

VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, PAGE_EXECUTE_READWRITE, &oldProtect);

是我期望的工作

这个

VirtualProtect((LPVOID)originPointer, 0, PAGE_EXECUTE_READWRITE, &oldProtect);

显然失败了

但是这个

VirtualProtect((LPVOID)originPointer, 1, PAGE_EXECUTE_READWRITE, &oldProtect);

我发现它也可以工作,即使我只更改了一个字节的保护。

谁能解释一下为什么会这样?

最佳答案

页面保护属性的粒度必须等于页面的大小。 4096 字节。你永远不应该在你需要的大小上撒谎,如果你传递的地址恰好位于页面末尾附近,那就太糟糕了。

关于c++ - 虚拟保护大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47693688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com