托管注入深入研究
2008-12-11 13:36:11 来源:WEB开发网这样就实现了托管代码的注入。
深入话题:
通常我们会有这样的要求:在主程序中单击某个按扭,使宿主执行dll中的一段代码,多次单击就多次执行。
上面的代码无法实现这个目地,因为只有dll刚被注入到宿主时,DllMain中的DLL_PROCESS_ATTACH才会收到通知,我们自然想到:每次执行后,卸载掉dll,下次单击后,DLL_PROCESS_ATTACH又会收到通知;遗憾的是,目前我还没有办法卸载掉这个dll。
对于非托管dll,我们可以通过FreeLibrary来卸载(如果是在dll内部卸载,还必须借助FreeLibraryAndExitThread函数,关于dll的自卸载,由于没有在这个程序中使用,这里就不做介绍了)
而对于托管dll,查阅MSDN,我们得到的结论是:.Net不支持dll的卸掉,dll只能随着应用程序域的卸载而卸载。
对于混合dll,应该如何卸载呢?
我尝试用Win32 dll的方式卸载,结果也“真的”卸载了,这是因为:
1. DllMain中的DLL_PROCESS_DETACH收到了通知
2. 用模块查看工具去看,宿主中确实不存在注入的dll了
但事实上是失败了,至少有两个问题:
1. 关闭宿主时,会提示出错
2. 再次注入时,虽然DLL_PROCESS_ATTACH会收到通知,但用CreateThread创建的新线程并不被执行
既然MSDN上都说无法卸载托管dll,那这个问题就搁浅了吧。
虽然不能卸载这个dll,但并不是说就不能实现前面提到的问题。
实际上,每次主程序通过CreateRemoteThread函数在宿主创建线程时,DllMain中的DLL_THREAD_ATTACH和DLL_THREAD_DETACH也会收到通知,当然最好不要在这里直接调用CreateThread,这是因为:
1. 如果不做处理,直接在DLL_THREAD_ATTACH中调中CreateThread,显然会造成死循环:每产生一个线程,DLL_THREAD_ATTACH就会收到通知,然后又去创建线程,它又会得到通知……
- ››注入漏洞及参数化查询
- ››深入理解JAR包
- ››深入分析Volatile的实现原理
- ››深入理解Flash Player的应用程序域(Application ...
- ››深入理解flash函数(AS2)
- ››深入理解Android消息处理系统——Looper、Handler...
- ››深入理解SET NAMES和mysql(i)_set_charset的区别
- ››深入理解Mysql字符集设置
- ››深入浅出实战攻防恶意PDF文档
- ››深入剖析防火墙策略的执行过程:ISA2006系列之六
- ››深入JavaScript与.NET Framework中的日期时间(3)...
- ››深入JavaScript与.NET Framework中的日期时间(2)...
更多精彩
赞助商链接