C++ WriteProcessMemory 使 MessageBox 使程序崩溃

C++ WriteProcessMemory makes MessageBox crash the programm

本文关键字:崩溃 程序 MessageBox C++ WriteProcessMemory      更新时间:2023-10-16

我想写一点AntiHack,但我对其中的一部分有问题。这个想法是通过从NTDLL.DLL挂接LdrLoadDll来防止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;
}

它工作正常,但是消息框(空,消息,"检测到",MB_OK); 如果在 BlockApi(..) 之后执行,则会崩溃;

Ausnahme (erste Chance) bei 0x75312113 (user32.dll) in DLLTester.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000002D Unbehandelte Ausnahme bei 0x75312113 (user32.dll) in DLLTester.exe: 0xC000041D: Ausnahmefehler während eines Benutzerrückrufs

谢谢棒棒虻

编辑:我发现,在消息框崩溃发生之前,上一个调用是睡眠(1000);来自我的检测线程!

旧问题(发布模式下崩溃)已修复!

这很简单...

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

(作者:帕维尔·


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

编辑:对于那些想知道的人:消息框(...);负荷

"C:\WINDOWS\system32\uxtheme.dll"