C ++ VirtualProtect PAGE_NOACCESS导致崩溃

时间:2016-02-28 15:30:14

标签: c++ windows

美好的一天,我试图以某种方式阻止" dll注射"进入我的计划。 这是我到目前为止,但由于某种原因它崩溃我的.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...

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

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

鉴于LdrLoadDll是一个无证件的功能,我不确定它的作用,工作原理或内部使用的地方,但我怀疑如果你能获得很大的成功能够完全阻止它,因为它可能是Windows本身用于将DLL加载到您的进程中的...

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

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

实际上,您应该只对自己使用VirtualProtectVirtualAlloc分配的内存块使用VirtualAllocEx。其他任何事情,改变你控制之外的内存块的保护级别,只是在寻找麻烦。