美好的一天,我试图以某种方式阻止" 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,但为什么它会崩溃......
有人能帮助我吗?
答案 0 :(得分:0)
鉴于LdrLoadDll
是一个无证件的功能,我不确定它的作用,工作原理或内部使用的地方,但我怀疑如果你能获得很大的成功能够完全阻止它,因为它可能是Windows本身用于将DLL加载到您的进程中的...
除此之外,VirtualProtect
会影响包含指定范围的一个或多个字节的所有页面。换句话说,它提供的保护粒度就是页面的保护粒度。如果您不小心避免其他内存块位于同一页面上,则在尝试访问它们时会崩溃。
最后,对VirtualProtect
的第二次调用非常可疑。您将硬编码作为地址偏移的价值是多少?和上面提到的问题一样:VirtualProtect
提供的保护粒度就是页面的保护粒度。页面是4k字节(一般来说),因此即使您只指定了6个字节的大小,也要为整个4k页面设置PAGE_NOACCESS
,该页面至少包含部分应用程序的可执行代码。
实际上,您应该只对自己使用VirtualProtect
或VirtualAlloc
分配的内存块使用VirtualAllocEx
。其他任何事情,改变你控制之外的内存块的保护级别,只是在寻找麻烦。