2016-02-28 129 views
1

美好的一天,我试图以某种方式阻止“dll注入”进入我的程序。 这是我到目前为止,但它崩溃我的.exe出于某种原因。 我正在加载此代码,并将.dll附加到我的程序。C++ VirtualProtect PAGE_NOACCESS导致崩溃

声明:

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,但为什么它崩溃...

有人可以帮我吗?

+0

有权注入代码的攻击者也有权修复页面访问标志。 –

回答

0

鉴于LdrLoadDll是一个未公开的函数,我不确定它是干什么用的,它是如何工作的,或者它在内部使用的地方,但是我怀疑如果你能够完全阻塞它,因为它可能是Windows本身用来将DLL加载到你的进程中的…

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

最后,那第二次致电VirtualProtect的是极其嫌疑人。你将硬编码作为地址偏移量的价值是什么?和上面提到的相同的问题:VirtualProtect提供的保护的粒度是页面的。一个页面是4k字节(一般来说),所以即使只指定了6个字节的大小,对于包含至少部分应用程序可执行代码的整个4k页面,您也可以设置为PAGE_NOACCESS

真的,你只应该在你自己分配的内存块上使用VirtualProtect或者VirtualAllocVirtualAllocEx。除此之外,更改内存块的保护级别超出了你的控制范围,只是在寻求麻烦。

+0

谢谢@Cody Gray,但我很困惑。我不能给你这段代码的答案......我所知道的是,我需要以某种方式停止dll注入...我已经尝试使用相同的方法从kernel32.dll中LoadLibrary,但它会崩溃。 。 –