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