【问题标题】:C++ WriteProcessMemory makes MessageBox crash the programmC++ WriteProcessMemory 使 MessageBox 崩溃程序
【发布时间】:2015-01-24 21:45:44
【问题描述】:

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

谢谢, 呸呸呸

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

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

【问题讨论】:

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

标签: c++ memory crash release messagebox


【解决方案1】:

很简单……

调用 LoadLibrary 的人都会崩溃。为什么 MessageBox 会导致加载 DLL?不知道...也许它想为图标加载一些资源 DLL。

(帕维尔 A)


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

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

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

!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多