C++ C++;虚拟保护页面\u未访问导致崩溃

C++ C++;虚拟保护页面\u未访问导致崩溃,c++,windows,C++,Windows,您好,我正在设法阻止“dll注入”到我的程序中。 这是我到目前为止所做的,但是由于某种原因它使我的.exe崩溃了。。 我正在加载此代码,并将.dll附加到我的程序 声明: LPBYTE _LdrLoadDll = (LPBYTE)GetProcAddress(GetModuleHandle("ntdll.dll"), "LdrLoadDll"); 功能: void HookNoAccess(LPVOID Offset, int size) { HMODULE ha

您好,我正在设法阻止“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...
它应该停止访问当前进程,但为什么它会崩溃


有人能帮我吗?

鉴于
LdrLoadDll
是一个没有文档记录的函数,我不知道它是做什么的,它是如何工作的,或者它是在什么地方内部使用的,但我怀疑如果你能够完全阻止它,你会获得多大的成功,因为它可能是Windows本身用来将DLL加载到进程中的东西

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

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


实际上,您应该只在分配给自己的
VirtualAlloc
VirtualAllocEx
内存块上使用
VirtualProtect
。其他任何事情,在您的控制范围之外更改内存块的保护级别,都是自找麻烦。

鉴于
LdrLoadDll
是一个未记录的函数,我不知道它是做什么的,它是如何工作的,或者它在内部的使用位置,但我怀疑,如果您能够完全阻止它,您是否会获得很大的成功,因为它可能是Windows本身用来将DLL加载到您的进程中的东西

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

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


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

谢谢@Cody Gray,但我很困惑。我不能给你一个关于这段代码的答案。。。我只知道,我需要以某种方式停止dll注入。。。我尝试过用同样的方法从kernel32.dll加载库,但它也会崩溃…谢谢@Cody Gray,但我很困惑。我不能给你一个关于这段代码的答案。。。我只知道,我需要以某种方式停止dll注入。。。我尝试过用同样的方法从kernel32.dll加载库,但它会崩溃…有权注入代码的攻击者也有权修复页面访问标志。有权注入代码的攻击者也有权修复页面访问标志。