读书人

DllMain中不当操作导致死锁有关问题的

发布时间: 2012-11-17 11:14:15 作者: rapoo

DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2

本文介绍使用Windbg去验证《DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子》中的结论,调试对象是文中刚开始那个例子。(转载请指明出于breaksoftware的csdn博客)

1 g 让程序运行起来

2 ctrl+break 中断程序

3 ~ 查看线程数

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

其实该程序自己运行起来的线程只有ID为0、TID为afc的线程。18c4线程是我们在windbg中输入ctrl+break,导致windbg在我们调试的进程中插入的一个中断线程。以后我们看到是这个线程的操作,就可以忽略。

4 dd fs:[0] 寻找主线程TEB起始地址(7ffde000)

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

5 dt _TEB 7ffde000 查看主线程中PEB结构指针(0x7ffdc000)

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

6 dt _PEB 0x7ffdc000 寻找LoaderLock的指针(0x7c99e0174)

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

7 dt_RTL_CRITICAL_SECTION 0x7c99e174 查看临界区状态,我们看到看到LockCount值为-1,那么我们通过给它设置“写”断点,从而在每次“关键”时刻予以监控。

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

8 baw2 0x7c99e178 对LockCount设置写断点

9 g

10kb 我们看到线程号是1,即Windbg插入的线程导致的断点,我们忽略之(我们看到关闭线程时也会进入临界区)

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

11 g

12 kb 同上,忽略之

13 g

14 kb 这次是主线程(0)触发了断点,断点原因是LdrLoadDll中要加锁。

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

我们使用IDA反编译LdrLoadDll,可以看到调用的位置


DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2
17 g

18 kb 第三次进入临界区

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

19 g 主线程第一次退出临界区

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

20 kb 主线程第四次进入临界区

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

21 g 主线程第二次退出临界区

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

22 g 有线程要进入临界区

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

23 kb 这次是我们在代码中启动的工作线程(1)要尝试进入临界区

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

24 ~ 查看线程 确定有两个线程了

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

25 g

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

26 kb 工作线程(1)要进入临界区,可是它不会进去的,因为它会被挂起

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

27 g 死锁了

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

28 control+break windbg要启动一个中断线程,中断线程触发了断点

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

29 ~ 查看线程,ID为2的就是windbg插入的线程

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

30 ~0s 切换到主线程(0),发现主线程在内核态中出不来了

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

31 kb 查看主线程调用堆栈,确实是在等工作线程结束

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

32 ~1s 切换到工作线程,发现它也在内核态中出不来了

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

33 kb 查看工作线程调用堆栈

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

34 dt _RTL_CRITICAL_SECTION 0x7c99e174 查看临界区所有权,从线程TID中我们可以看到,临界区的确是被主线程占着。

DllMain中不当操作导致死锁有关问题的分析-导致DllMain中死锁的关键隐藏因子2

读书人网 >网络基础

热点推荐