EasyHook和沟通

时间:2017-06-08 14:42:02

标签: c# dll easyhook

使用EasyHook我设置了以下结构:

APP< - >接口< - > DLL

当我按下APP中的按钮时,我正在尝试在注入的DLL中运行一些代码。

我设法让DLL使用以下代码发送消息:

((EntryPoint)HookRuntimeInfo.Callback).Interface.WriteLine("");

但是如何让代码在注入的DLL中运行呢?

1 个答案:

答案 0 :(得分:2)

您需要配置双向IPC接口。有许多不同的方法可以实现这一点。以下是使用.NET Remoting的一个示例。

首先看一下EasyHook remote file monitor tutorial作为创建界面的起点,将DLL中的消息发送回APP,即 APP< - interface< - DLL

允许来自 APP - >的消息界面 - > DLL ,需要在DLL IEntryPoint constructor中配置新通道:例如

    #region Allow client event handlers (bi-directional IPC)
    // Attempt to create a IpcServerChannel so that any event handlers on the client will function correctly
    System.Collections.IDictionary properties = new System.Collections.Hashtable();
    properties["name"] = channelName;
    properties["portName"] = channelName + Guid.NewGuid().ToString("N"); // random portName so no conflict with existing channels of channelName

    System.Runtime.Remoting.Channels.BinaryServerFormatterSinkProvider binaryProv = new System.Runtime.Remoting.Channels.BinaryServerFormatterSinkProvider();
    binaryProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

    System.Runtime.Remoting.Channels.Ipc.IpcServerChannel _clientServerChannel = new System.Runtime.Remoting.Channels.Ipc.IpcServerChannel(properties, binaryProv);
        System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(_clientServerChannel, false);
    #endregion

APP - >实施IPC界面 - > DLL 查看Direct3DHook projectDisconnectDisconnected的“客户端事件”中的CaptureInterface.Disconnect方法和CaptureInterface.Disconnected事件和ClientCaptureInterfaceEventProxy.Disconnected,全部在CaptureInterface.cs。除了接口类之外,此方法还使用继承自MarshalByRefObject的客户端事件代理类,并允许在DLL中的其他位置调用事件处理程序以响应APP调用方法。您需要仔细查看链接的代码,还有一些需要考虑的其他兴趣点(例如事件处理程序生存期),接口实现了每个事件的包装,以“安全”的方式触发它

最后,Disconnected事件的处理程序附加在DLL的IEntryPoint运行方法中:

    _interface.Disconnected += _clientEventProxy.DisconnectedProxyHandler;

    _clientEventProxy.Disconnected += () =>
            {
                // This code in the DLL will run when APP calls CaptureInterface.Disconnect
            };