首先推荐一系列深度剖析的文章:
https://blog.csdn.net/breaksoftware/article/details/8167641
有时候需要在 DllMain 中写一些代码,比如下面这样,其中 TestAttach 等函数里面有需要的一些代码,里面的代码片在采用 DllMain 调用之前完全运行正常。
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
TestAttach();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
TestDetach();
break;
}
return TRUE;
}
使用 std::mutex 造成死锁
例如:
void TestMutex()
{
std::mutex _m;
_m.lock();
_m.unlock();
}
void TestDetach()
{
TestMutex();
}
使用 RemoteDll.exe (一款 DLL注入的简单工具,注意32和64位版本差异,也可以自己 LoadLibrary 然后卸载测试),将编译的 Dll 注入到 RemoteDll.exe (或其他程序)。发现目标程序 RemoteDll 关闭的时候,实际是执行到TestDetach 的时候出问题了
上图可看到注入成功了,然后点击关闭
使用系统相关同步机制可以实现自己的锁,简单举例如下:
class CTestLock
{
public:
CTestLock()
{
m_hdMutex = CreateMutexA(NULL, FALSE, "123");
}
~CTestLock()
{
if (NULL != m_hdMutex)
{
CloseHandle(m_hdMutex);
m_hdMutex = NULL;
}
}
void Lock()
{
if (NULL != m_hdMutex)
{
OutputDebugStringA("Lock Lock Lock");
WaitForSingleObject(m_hdMutex, INFINITY);
}
}
void UnLock()
{
if (NULL != m_hdMutex)
{
ReleaseMutex(m_hdMutex);
OutputDebugStringA("UnLock Lock Lock");
}
}
HANDLE m_hdMutex;
};
void TestMutex()
{
CTestLock _lock;
_lock.Lock();
_lock.UnLock();
}
使用 std::thread 造成死锁
例如:
void TestThreadFunc()
{
}
void TestThread()
{
auto _thread = std::thread(std::bind(TestThreadFunc));
_thread.join();
}
void TestAttach()
{
TestThread(); // LoadLibrary 时候调过来时候死锁
}
使用系统提供的接口比如 beignthread相关函数 和 CreateThread(该函数好像有安全性相关问题,另外的事情)。则没有这样的问题,例如:
void TestThreadFunc()
{
// 做点自己的事情,用类的函数一样
}
void TestThread()
{
auto _thread = std::thread(std::bind(TestThreadFunc));
_thread.join();
}
unsigned __stdcall _ThreadFunc(void* para)
{
TestThread();
return 0;
}
void TestAttach()
{
_beginthreadex(NULL, 0, _ThreadFunc, NULL, 0, NULL);
}
该问题和操纵系统版本有关系,非必现。我用的VS2013,在一台WIN7出现。相关参考:
https://stackoverflow.com/questions/22402791/visual-studio-2013-stdmutex-and-the-dreaded-windows-loader-lock
https://stackoverflow.com/questions/14711263/c11-stdmutex-in-visual-studio-2012-deadlock-when-locked-from-dllmain
https://stackoverflow.com/questions/27800412/unhandled-exception-when-using-stdmutex-instead-of-boostmutex