应用程序挂钩(winsock)来自c ++ / c#

时间:2010-11-17 08:39:53

标签: c# hook winsock easyhook

我有一个调用winsocket函数的(旧)应用程序:

struct hostent* FAR gethostbyname(
  __in  const char *name
);

它目前将其导入为 ws32_dll。#52 ,而不是正常的名称调用。

我的目的只是为了能够在主机搜索发生时打开一个消息框(应该在应用程序启动时)。

我尝试创建一个c ++ dll,其中pragma注释指向#52并将其放在app dir上(包括“exe.local”和“exe.manifest”文件以尝试重定向它)但是它加载了c:\ windows \ system32而不是。

之后,我创建了一个c#项目启动进程本身(因此从Process对象获取PID),将easyhook dll添加到它。

我在http://www.codeproject.com/KB/DLL/EasyHook64.aspx

检查了示例

将通话更改为:

    FileMon.FileMonInterface Interface;
    LocalHook CreateFileHook;
    Stack<String> Queue = new Stack<String>();

    public Main(
        RemoteHooking.IContext InContext,
        String InChannelName)
    {
        // connect to host...

        Interface = 
          RemoteHooking.IpcConnectClient<FileMon.FileMonInterface>(InChannelName);
    }

    public void Run(
        RemoteHooking.IContext InContext,
        String InChannelName)
    {
        // install hook...
        try
        {
            CreateFileHook = LocalHook.Create(
                LocalHook.GetProcAddress("ws2_32.dll", "gethostbyname"),
                new DCreateFile(GetHostByName_Hooked),
                this);

            CreateFileHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
        }
        catch (Exception ExtInfo)
        {
            Interface.ReportException(ExtInfo);

            return;
        }

        Interface.IsInstalled(RemoteHooking.GetCurrentProcessId());

        // wait for host process termination...
        try
        {
            while (true)
            {
                Thread.Sleep(500);

                // transmit newly monitored file accesses...
                if (Queue.Count > 0)
                {
                    String[] Package = null;

                    lock (Queue)
                    {
                        Package = Queue.ToArray();

                        Queue.Clear();
                    }

                    Interface.OnCreateFile(RemoteHooking.GetCurrentProcessId(), Package);
                }
                else
                    Interface.Ping();
            }
        }
        catch
        {
            // NET Remoting will raise an exception if host is unreachable
        }
    }


    [UnmanagedFunctionPointer(CallingConvention.StdCall,
        CharSet = CharSet.Auto,
        SetLastError = true)]
    delegate IntPtr DGetHostByName(
        String name);

    // just use a P-Invoke implementation to get native API access
    // from C# (this step is not necessary for C++.NET)
    [DllImport("ws2_32.dll",
        CharSet = CharSet.Auto,
        SetLastError = true,
        CallingConvention = CallingConvention.StdCall)]
    static extern IntPtr gethostbyname(
        String name);

    // this is where we are intercepting all file accesses!
    static IntPtr GetHostByName_Hooked(
        String name)
    {
        try
        {
            Main This = (Main)HookRuntimeInfo.Callback;
            MessageBox.Show("hi!");


        }
        catch
        {
        }

        // call original API...
        return GetHostByName(
            name);
    }
}

}

(可能在这里写了一个拼写错误,但项目成功编译@ home)。

问题是,我不知道我需要做什么来挂钩这个方法&lt; - &gt;应用程序本身。

我的意思是......用c#easyhook挂钩(假设应用程序是“foo.exe”)是什么左派? 我是否需要为easyhook创建自定义dll?(在这种情况下,我需要在内部定义哪些内容?)

我发现它有点......对于一个helloworld钩子来说“复杂”,呵呵。

提前致谢;)

1 个答案:

答案 0 :(得分:0)

最后,使用“Grey hack python”这本书教会了我如何使用更少的线条来制作所有这些,并且就像我想要的一样。

还没有exe,但......就是这样。

使用pydbg + hooks。