记一次代码导致loader lock的问题
项目中原有dll用于注入到目标进程并执行detours或hook等操作,在Dllmain中DLL_PROCESS_ATTACH处理了用于detours的模块拦截函数地址获取工作,使用的是loadlibrary,getprocaddress的方式。
现有一新需求,希望通过在dll中加载自己的另外一个dll(暂命名为mydll),并在mydll中进行一些其他工作,于是仍然按照之前逻辑在dll的DLL_PROCESS_ATTACH中使用了loadlibrary加载mydll。<—就是这里导致了loader lock。原因是,主进程加载dll时已经加锁,在Dllmain未退出之前依然处于加锁状态,而此时再调用loadlibrary来加载mydll,要进入mydll的Dllmain则需要获得锁,而上一个锁未解开,导致了死锁异常。之所以起它模块使用loadlibrary未出现这个问题,是因为起它模块都是进程依赖的,在dll注入之前已经加载过了,对于加载过的模块再次使用loadlibrary只会返回一个句柄但并不会再次调用Dllmain,所以不会产生死锁问题。
以上,记录一次开发中遇到的问题。
参考链接:https://blog.csdn.net/cjf_iceking/article/details/40043569