首页
社区
课程
招聘
[原创]dll注入死锁问题的探究
发表于: 2020-5-22 11:32 7839

[原创]dll注入死锁问题的探究

2020-5-22 11:32
7839

                                                                                                   Dll注入死锁问题的探究

   Dll注入的方法很多,可以参考https://bbs.pediy.com/thread-253918.htmhttps://bbs.pediy.com/thread-75887.htm这里不再说明。

笔者是在进程里创建一条线程,线程里调用LdrLoadDll函数加载的dll。代码在附件里,采用的是内核注入,适应windows7、win10所有版本,应用层注入原理也一样。

注入成功后会弹出对话框:

                                    


   但注入时有时候会卡死,被注入进程和我是注入的dll界面显示不出来。

上调试器,我是往计算器(calc.exe)里注入一个名为Test.dll的dll。!Process 0 0遍历所有进程后,记录下calc.exe的Eprocess。


                                            

使用.process /i 命令切换到计算器进程

                                            

使用!process fffffa80039aeb30 7观察计算器进程详细信息。

                



发现计算器有两个线程,两个线程最后一个栈帧符号没有显示出来。于是加载应用层符号:


再敲入命令 !process fffffa80039aeb30 7



  于是应用层符号显示出来了。

  观察两条线程,都调用了ntdll!RtlEnterCriticalSection进入nt!KeWaitForSingleObject进行等待。

  分别观察两个线程调用RtlpWaitOnCriticalSection的第四个参数,是个锁对象:

                                                   


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-5-22 11:42 被yirucandy编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 3246
活跃值: (374)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
2
分析得很好

DllMain(或者严格点说,在DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH的执行路径中)中很多操作/API是不能执行的,非常容易出现交叉加锁导致死锁,因为此时持有loader锁。

交叉加锁的情况:

线程1:
在DllMain中,所以此时已经持有loader锁;
请求某个别的锁(比如调用某个COM API而去请求COM锁);

线程2:
持有某个锁(比如COM锁)
请求loader锁(因为执行了LoadLibrary/GetProcAddress/GetModuleHandle等API去加载/释放COM DLL,这些API内部会请求loader锁)
2020-6-4 10:09
1
游客
登录 | 注册 方可回帖
返回
//