WEB开发网
开发学院网络安全安全技术 托管注入深入研究 阅读

托管注入深入研究

 2008-12-11 13:36:11 来源:WEB开发网   
核心提示: 这样就实现了托管代码的注入, 深入话题: 通常我们会有这样的要求:在主程序中单击某个按扭,托管注入深入研究(4),使宿主执行dll中的一段代码,多次单击就多次执行,显然会造成死循环:每产生一个线程,DLL_THREAD_ATTACH就会收到通知, 上面的代码无法实现这个目地,因为只有dll

这样就实现了托管代码的注入。

深入话题:

通常我们会有这样的要求:在主程序中单击某个按扭,使宿主执行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就会收到通知,然后又去创建线程,它又会得到通知……

上一页  1 2 3 4 5  下一页

Tags:托管 注入 深入

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接