DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
来源:互联网 发布:c语言中汉诺塔问题 编辑:程序博客网 时间:2024/06/06 08:33
(转载于breaksoftware的csdn博客)
前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区。这个论证非常重要,因为它是使其他线程不能进入临界区从而导致死锁的关键。我构造了在DLL被映射到进程地址空间的场景,请看死锁时加载DLL的线程的堆栈
如果仔细看过《DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2》,应该得知第14步就是进入临界区的点。
我们可以看到LdrLoadDll内部调用了LdrLockLoaderLock。LdrLockLoaderLock内部进入临界区,我们用IDA查看LdrLoadDll函数
- int __stdcall LdrLoadDll(int a1, int a2, int a3, int a4)
- {
- ……
- LdrLockLoaderLock(1, 0, &v10);
- ……
- v6 = LdrpLoadDll(v9, a1, a2, v17, a4, 1);
- ……
- if ( v8 >= 0 )
- {
- ms_exc.disabled = -1;
- sub_7C936587(ebp0, v7);
- v6 = 0;
- goto LABEL_6;
- }
- }
- int __usercall sub_7C936587<eax>(int a1<ebp>, int a2<esi>)
- {
- LdrpTopLevelDllBeingLoaded = a2;
- return LdrUnlockLoaderLock(1, *(_DWORD *)(a1 - 572));
- }
我们再看下卸载DLL时发生的进入临界区场景,请看堆栈
我们将关注FreeLibrary和LdrpCallInitRoutine之间的代码逻辑。我们用IDA查看LdrUnLoadDll
- int __stdcall LdrUnloadDll(int a1)
- {
- ……
- v73 = 0;
- v70 = *(_DWORD *)(*MK_FP(__FS__, 24) + 48);
- v71 = 0;
- ms_exc.disabled = 0;
- if ( !LdrpInLdrInit )
- RtlEnterCriticalSection(&LdrpLoaderLock);
- ++LdrpActiveUnloadCount;
- if ( !LdrpShutdownInProgress )
- {
- if ( LdrpCheckForLoadedDllHandle(a1, (int)&v78) )
- {
- if ( *(_WORD *)(v78 + 56) != -1 )
- {
- ……
- if ( (unsigned __int8)LdrpActiveUnloadCount <= 1u )
- {
- ……
- v15 = (int *)LdrpUnloadHead;
- v77 = (int *)LdrpUnloadHead;
- while ( v15 != &LdrpUnloadHead )
- {
- ……
- LdrpCallInitRoutine((int (__stdcall *)(_DWORD, _DWORD, _DWORD))v20, *(_DWORD *)(v78 + 24), 0, 0);
- ……
- v15 = (int *)LdrpUnloadHead;
- v77 = (int *)LdrpUnloadHead;
- ms_exc.disabled = 0;
- v3 = 0;
- }
- ……
- }
- }
- }
- else
- {
- v71 = 0xC0000135u;
- }
- }
- ms_exc.disabled = -1;
- sub_7C937424();
- ……
- return v71;
- }
- int __cdecl sub_7C937424()
- {
- int result; // eax@3
- --LdrpActiveUnloadCount;
- if ( !LdrpInLdrInit )
- result = RtlLeaveCriticalSection(&LdrpLoaderLock);
- return result;
- }
0 0
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- DllMain中不当操作导致死锁问题的分析--DisableThreadLibraryCalls对DllMain中死锁的影响
- DllMain中不当操作导致死锁问题的分析--DisableThreadLibraryCalls对DllMain中死锁的影响
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2
- DllMain中不当操作导致死锁问题的分析--死锁介绍
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--死锁介绍
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析
- DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析
- DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
- DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
- DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
- Apache 配置文件
- NYOJ 613 免费馅饼
- Java发送HTTP的POST请求
- X宝安全的临时解决方案
- 安卓开发日记3——IP推送器
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- Dimensionality Reduction and the Singular Value Decomposition
- 浏览器性能和稳定性分析
- VMware抢先占用即插即用的硬件怎么办???
- 问题五-实现详细信息页面(点击列表,预览窗口显示具体信息)
- debian的登录窗口和inkscape的使用.
- SQL Server 2008新特性——FILESTREAM
- 百万数据查询优化技巧三十则
- Linux SVN服务器搭建详解