C++ VirtualProtect PAGE_NOACCESS会导致崩溃
C++ VirtualProtect PAGE_NOACCESS causes crash
美好的一天,我正在尝试以某种方式防止"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_NOACCESS
。
实际上,您应该只在为自己分配了VirtualAlloc
或VirtualAllocEx
的内存块上使用VirtualProtect
。其他任何事情,更改您无法控制的内存块的保护级别,都只是自找麻烦。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃