Windows 下动态库的 DllMain 与 c++ 相关坑

17 篇文章 0 订阅
3 篇文章 0 订阅

首先推荐一系列深度剖析的文章:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值