C++ C++;WriteProcessMemory使MessageBox使程序崩溃
我想写一篇反黑客的文章,其中有一部分我有问题。 其思想是通过将LdrLoadDll与NTDLL.dll挂钩来防止dll注入。我通过谷歌搜索找到了一个函数,它可以执行以下操作:C++ C++;WriteProcessMemory使MessageBox使程序崩溃,c++,memory,crash,release,messagebox,C++,Memory,Crash,Release,Messagebox,我想写一篇反黑客的文章,其中有一部分我有问题。 其思想是通过将LdrLoadDll与NTDLL.dll挂钩来防止dll注入。我通过谷歌搜索找到了一个函数,它可以执行以下操作: // function call: BlockAPI(m_hProc, "NTDLL.DLL", "LdrLoadDll"); bool zProtect::BlockAPI(HANDLE hProcess, char* libName, char* apiName) { BYTE pRet[]={ 0x3
// 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(..)之后执行时崩溃
DLLTester.exe中的Ausnahme(erste Chance)bei 0x75312113(user32.dll):0xC0000005:Zugriffsverletzung beim Lesen位置0x0000002D
在DLLTester.exe:0xc00041d:Ausnahmefehler während中取消对Ausnahme bei 0x75312113(user32.dll)的绑定
谢谢,
棒蝇
编辑:
我发现,在MessageBox崩溃之前,前一个调用是Sleep(1000);从我的探测线
旧问题(释放模式下崩溃)已修复 这很简单
无论谁调用LoadLibrary,都将崩溃。为什么MessageBox会导致加载DLL?不知道。。。也许它想为图标加载一些资源DLL
(帕维尔A)
我将尝试用一个函数替换LdrLoadDll函数,该函数将检查每个加载的dll。(我不知道这是否可行!) 编辑: 对于那些想知道的人: MessageBox(…);装载 “C:\WINDOWS\system32\uxtheme.dll”
! 这绝对不是绕道函数的方式。。另外,请确保您的释放模式为32位。在代码块中,DebugMode可以是32位,ReleaseMode可以是64位。这可能是您的代码存在的问题。。无论如何,您可能应该正确绕行
LdrLoadDll
。您还没有对VirtualProtect
应用正确的写入权限。。永远不要假设您可以自动写入不属于您自己进程的内存。好的。我不熟悉挂钩功能。我使用Visual Studio,两种模式(调试和松弛)都设置为Win32。我将更改为上面的代码并添加VirtualProtect。。我希望我能正确地实施这一点。