美好的一天,我试图以某种方式阻止“ 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

确实,您应该只在使用VirtualProtectVirtualAlloc分配了内存的内存块上使用VirtualAllocEx。改变存储块的保护级别超出您的控制范围的其他任何事情都只是在问麻烦。

10-06 04:10