C++ C++;WriteProcessMemory使MessageBox使程序崩溃

C++ C++;WriteProcessMemory使MessageBox使程序崩溃,c++,memory,crash,release,messagebox,C++,Memory,Crash,Release,Messagebox,我想写一篇反黑客的文章,其中有一部分我有问题。 其思想是通过将LdrLoadDll与NTDLL.dll挂钩来防止dll注入。我通过谷歌搜索找到了一个函数,它可以执行以下操作: // function call: BlockAPI(m_hProc, "NTDLL.DLL", "LdrLoadDll"); bool zProtect::BlockAPI(HANDLE hProcess, char* libName, char* apiName) { BYTE pRet[]={ 0x3

我想写一篇反黑客的文章,其中有一部分我有问题。 其思想是通过将LdrLoadDll与NTDLL.dll挂钩来防止dll注入。我通过谷歌搜索找到了一个函数,它可以执行以下操作:

// function call: BlockAPI(m_hProc, "NTDLL.DLL", "LdrLoadDll");    
bool zProtect::BlockAPI(HANDLE hProcess, char* libName, char* apiName)
{
    BYTE pRet[]={ 0x31, 0xC0, // XOR eax, eax
                    0xC3 };    // RET
    HINSTANCE hLib = NULL;
    VOID *pAddr = NULL;
    bool bRet = FALSE;
    DWORD dwRet = 0;


    hLib = LoadLibrary(libName);
    if(hLib) 
    {
        pAddr = (VOID*)GetProcAddress(hLib, apiName);
        if(pAddr) 
    {
        DWORD dwback;
        if(!VirtualProtectEx(hProcess, (LPVOID)pAddr, sizeof(pRet), PAGE_EXECUTE_READWRITE, &dwback))
            return false;
        if(WriteProcessMemory(hProcess, (LPVOID)pAddr, &pRet, sizeof (pRet), &dwRet)) 
        {
            if(dwRet)
                bRet = TRUE;
        }
        if(!VirtualProtectEx(hProcess, (LPVOID)pAddr, sizeof(pRet), dwback, &dwback))
            return false;
    }
        FreeLibrary(hLib);
   }
   return bRet;
}
它工作正常,但是MessageBox(NULL,msg,“DETECTED”,MB_OK);在BlockApi(..)之后执行时崩溃

DLLTester.exe中的Ausnahme(erste Chance)bei 0x75312113(user32.dll):0xC0000005:Zugriffsverletzung beim Lesen位置0x0000002D 在DLLTester.exe:0xc00041d:Ausnahmefehler während中取消对Ausnahme bei 0x75312113(user32.dll)的绑定

谢谢, 棒蝇

编辑: 我发现,在MessageBox崩溃之前,前一个调用是Sleep(1000);从我的探测线

旧问题(释放模式下崩溃)已修复

这很简单

无论谁调用LoadLibrary,都将崩溃。为什么MessageBox会导致加载DLL?不知道。。。也许它想为图标加载一些资源DLL

(帕维尔A)


我将尝试用一个函数替换LdrLoadDll函数,该函数将检查每个加载的dll。(我不知道这是否可行!)

编辑: 对于那些想知道的人: MessageBox(…);装载

“C:\WINDOWS\system32\uxtheme.dll”


!

这绝对不是绕道函数的方式。。另外,请确保您的释放模式为32位。在代码块中,DebugMode可以是32位,ReleaseMode可以是64位。这可能是您的代码存在的问题。。无论如何,您可能应该正确绕行
LdrLoadDll
。您还没有对
VirtualProtect
应用正确的写入权限。。永远不要假设您可以自动写入不属于您自己进程的内存。好的。我不熟悉挂钩功能。我使用Visual Studio,两种模式(调试和松弛)都设置为Win32。我将更改为上面的代码并添加VirtualProtect。。我希望我能正确地实施这一点。