gpt4 book ai didi

C++ VirtualProtect PAGE_NOACCESS 导致崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:01 28 4
gpt4 key购买 nike

美好的一天,我正在尝试以某种方式防止“dll 注入(inject)”到我的程序中。这是我到目前为止所拥有的,但由于某种原因它使我的 .exe 崩溃了。我正在加载这段代码,我的程序附加了一个 .dll。

声明:

LPBYTE _LdrLoadDll = (LPBYTE)GetProcAddress(GetModuleHandle("ntdll.dll"), "LdrLoadDll");

功能:

   void HookNoAccess(LPVOID Offset, int size)
{
HMODULE hand = GetModuleHandle("MYPROGRAM.exe");
DWORD OldProtect;
VirtualProtect(Offset, size, PAGE_NOACCESS, &OldProtect);
VirtualProtect((LPVOID)((DWORD)hand + (DWORD)0x12d1), 6, PAGE_NOACCESS, &OldProtect);
}

调用它:

HookNoAccess(_LdrLoadDll, 2); // tried any size...

它应该停止访问当前的进程,但为什么它会崩溃......

有人可以帮帮我吗?

最佳答案

鉴于 LdrLoadDll 是一个未记录的函数,我不确定它的作用、工作原理或内部使用位置,但我怀疑如果您能够完全阻止它,因为它可能是 Windows 本身用来将 DLL 加载到您的进程中的工具……

除此之外,VirtualProtect 影响所有 包含指定范围的一个或多个字节的页面。换句话说,它提供的保护粒度是页面的粒度。如果您不小心避免其他内存块位于同一页上,您将在尝试访问它们时崩溃。

最后,对 VirtualProtect 的第二次调用是极度可疑的。您硬编码为地址偏移量的值是多少?和上面提到的同样的问题:VirtualProtect 提供的保护粒度是页面的粒度。页面为 4k 字节(一般来说),因此即使您只指定 6 字节的大小,您也是在为至少包含应用程序可执行代码的一部分的整个 4k 页面设置 PAGE_NOACCESS

实际上,您应该只在使用 VirtualAllocVirtualAllocEx 分配给自己的内存块上使用 VirtualProtect。任何其他的,改变你无法控制的内存块的保护级别,都是在自找麻烦。

关于C++ VirtualProtect PAGE_NOACCESS 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684408/

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