C++ WriteProcessMemory 使 MessageBox 使程序崩溃

C++ WriteProcessMemory makes MessageBox crash the programm

我想写一点 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;
}

工作正常,但是 MessageBox(NULL, msg, "DETECTED", 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

谢谢, lolxdfly

编辑: 我发现,在 MessageBox 崩溃之前,之前的调用是 Sleep(1000);来自我的检测线程!

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

很简单...

Whoever calls LoadLibrary, will crash. Why MessageBox causes loading a DLL? No idea... maybe it wants to load some resource DLL for the icon.

(作者:Pavel A)


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

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

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

!