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

托管注入深入研究

 2008-12-11 13:36:11 来源:WEB开发网   
核心提示: 也许你还会想到下面的方法: 定义一个类,在其构造函数里调用托管代码,托管注入深入研究(2),然后在全局域里定义这个类的一个变量,当我们这样做了后会发现,我又觉得全局变量是多余的了:既然我能够使宿主调用dll中的一个特定函数,为什么不直接把托管代码放到这个函数中呢? 我马上进行了测试,注入后

也许你还会想到下面的方法:

定义一个类,在其构造函数里调用托管代码,然后在全局域里定义这个类的一个变量,当我们这样做了后会发现,注入后,什么也没有执行。

查阅MSDN,我们找到了答案:

DllMain不能直接或间接地调用托管代码,并且全局变量不会进行初始化。

这样的结果让人非常沮丧!

难道真的就没有办法了吗?

网友CiCi给出了一个解决方案:

写一个混合dll,在其中定义一个导出函数,在这个导出函数里可以调用托管代码。

然后写一个非托管dll(也就是Win32 dll),在其DllMain函数里调用前面那个混合dll的导出函数。

这个方案能够解决问题,并且我在一段时间里,也一直使用这个方法。但总觉得不完美:必须使用两个dll。

有没有办法用一个dll就解决问题呢?答案是肯定的。

我在一次偶然的机会中,发现了一个现象:

如里用钩子来实现注入,则全局变量会得到初始化。这个发现让我非常困惑:为什么远程线程注入就不会初始化呢?

我考虑这两种方法的区别:钩子注入时,宿主会调用dll中的钩子回调函数。

于是我大胆设想,只要宿主调用了dll中的任意一个函数,全局变量就会得到初始化。

于是我在dll中定义了一个空实现的函数(因为我的目地是迫使全局变量初始化,而不是去执行这个函数)

结果正如我所料,全局变量被初始化了,其构造函数中的托管代码被调用了!

这里其实已经实现了托管代码的注入,当然,还远远不够完善。

这时候,我又觉得全局变量是多余的了:既然我能够使宿主调用dll中的一个特定函数,为什么不直接把托管代码放到这个函数中呢?

我马上进行了测试,也成功了。

上一页  1 2 3 4 5  下一页

Tags:托管 注入 深入

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