简单的双向通信DLL注入库:VinjEx

这个小坑本来早就要填的,但是因为之前用的库VInjDn还能用,就一直拖着。最近我发现VInjDn在.NET4以上已经不太稳定了,于是花了两天研究把坑填上了。目前VinjEx的效果比起VInj/VInjDn来说还是要稳定很多的(要归功于EasyHook)。

 

VinjEx

by Ulysses

地址:OSChina   GitHub
(对于国内访问,oschina的速度当然比github快很多。不过如果你要为我捧场,github的star比oschina可是要好看很多……)
一个用于注入DLL的.NET类库,基于EasyHook。特点是可以双向通信。
 
上面的项目库中已经附带了一个演示IPC双向通信的例子。(IPCExample,跟此项目其实无关,但是是学习.NET Remoting的好例子)
VinjEx具体的使用方法也可以参见项目库中的另一个例子。(InjectTest)
 
几年前我就一直在用VInj/VInjDn,神奇的是虽然这个库流传还算久远,但是网上一直搜不到这个库的网站或是作者。
最近因为都升级.NET4以上了,发现VInjDn已经不稳定了,而Easyhook通信又麻烦,于是写了这个简化一下。
 

为什么要双向通信?

 
在VInj/VInjDn中,host(将DLL注入到别的程序的程序)可以给client(注入的DLL)发命令,client收到后执行命令,但host收不到client的反馈。
 
在Easyhook中,client可以通过interface执行host端实现的方法,即client到host的单向通信,host无法向client发命令。
EasyHook本身提供的示例中都只有单向通信的例子,客户端通过IpcConnectClient取得interface,从而调用服务端实现的方法,服务端反过来却看不到客户端,这其中跟他们的IPC方面的实现很有关系。
 
在VinjEx中,两者都可以实现,host可以发送命令给client,client也可以发送反馈给host。这是通过IPC通信中共享对象的双向事件绑定实现的。在一个host和client共享的interface对象中有两个事件,一个事件绑定到client的事件处理方法,但是由host触发(即SendCommand)。另一个事件绑定到host的事件处理方法,但是由client触发(即SendResponse)。这样两者即可实现互相通信。由于Easyhook开通IPC Channel的方法有问题,是无法实现这种双向事件绑定的。所以IPC的部分不能使用Easyhook提供的IpcCreateServer和IpcConnectClient。这也是VinjEx主要做的事情。
 
这个过程中在百度和bing查了好多的东西。(其实用bing查的更多。百度在查外文资料方面还是太弱)
 
这个帖子分析了Easyhook中为何不能在host和client之间共享interface,并且提出了解决方案。不过我下载的比较新的源码当中,似乎已经应用了他的解决方案。然而这个方案还是有问题的,虽然可以共享变量和属性,但并不能实现事件的绑定。
这个帖子即是IPCExample的来历。
 
这个帖子讲述了.NET Remoting中的事件必须通过Wrapper来中转,并演示了Wrapper的结构。
同上一个一样是讲.NET Remoting中的事件处理。这篇是中文的,是张逸老师写的,也很不错。

添加评论

Loading