【发布时间】: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