托管注入深入研究
2008-12-11 13:36:11 来源:WEB开发网核心提示: 也许你还会想到下面的方法: 定义一个类,在其构造函数里调用托管代码,托管注入深入研究(2),然后在全局域里定义这个类的一个变量,当我们这样做了后会发现,我又觉得全局变量是多余的了:既然我能够使宿主调用dll中的一个特定函数,为什么不直接把托管代码放到这个函数中呢? 我马上进行了测试,注入后
也许你还会想到下面的方法:
定义一个类,在其构造函数里调用托管代码,然后在全局域里定义这个类的一个变量,当我们这样做了后会发现,注入后,什么也没有执行。
查阅MSDN,我们找到了答案:
DllMain不能直接或间接地调用托管代码,并且全局变量不会进行初始化。
这样的结果让人非常沮丧!
难道真的就没有办法了吗?
网友CiCi给出了一个解决方案:
写一个混合dll,在其中定义一个导出函数,在这个导出函数里可以调用托管代码。
然后写一个非托管dll(也就是Win32 dll),在其DllMain函数里调用前面那个混合dll的导出函数。
这个方案能够解决问题,并且我在一段时间里,也一直使用这个方法。但总觉得不完美:必须使用两个dll。
有没有办法用一个dll就解决问题呢?答案是肯定的。
我在一次偶然的机会中,发现了一个现象:
如里用钩子来实现注入,则全局变量会得到初始化。这个发现让我非常困惑:为什么远程线程注入就不会初始化呢?
我考虑这两种方法的区别:钩子注入时,宿主会调用dll中的钩子回调函数。
于是我大胆设想,只要宿主调用了dll中的任意一个函数,全局变量就会得到初始化。
于是我在dll中定义了一个空实现的函数(因为我的目地是迫使全局变量初始化,而不是去执行这个函数)
结果正如我所料,全局变量被初始化了,其构造函数中的托管代码被调用了!
这里其实已经实现了托管代码的注入,当然,还远远不够完善。
这时候,我又觉得全局变量是多余的了:既然我能够使宿主调用dll中的一个特定函数,为什么不直接把托管代码放到这个函数中呢?
我马上进行了测试,也成功了。
[]
- ››深入理解Android消息处理系统——Looper、Handler...
- ››深入理解SET NAMES和mysql(i)_set_charset的区别
- ››深入理解Mysql字符集设置
- ››深入浅出实战攻防恶意PDF文档
- ››深入剖析防火墙策略的执行过程:ISA2006系列之六
- ››深入JavaScript与.NET Framework中的日期时间(3)...
- ››深入JavaScript与.NET Framework中的日期时间(2)...
- ››深入JavaScript与.NET Framework中的日期时间(1)...
- ››深入理解Javascript闭包
- ››深入学习JavaScript中的函数
- ››深入探讨 Android 传感器
- ››深入CSocket编程之阻塞和非阻塞模式
更多精彩
赞助商链接