在Windows上拦截/重定向传出的http连接

时间:2013-06-03 14:25:59

标签: c# c++ http winsock easyhook

我希望在Windows机器上重定向传出的http连接(不使用系统代理)。

背景:

我有一些遗留软件可以与现已停止使用的Web服务进行交互。我已在一个简单的桌面应用程序中模拟该服务,并希望将传出的http请求重新路由到此应用程序。

实验上我已经使用windows hosts文件成功重定向到localhost,但这是不切实际的,因为我有其他服务需要在默认的http端口80上监听,我不想为此设置另一个物理服务器< / p>

传统软件不使用系统代理,因此像FiddlerCore这样的解决方案不会工作(不幸的是,因为这很棒!)

我注意到EasyHook在类似的问题中提到过,与winsock一起提到,但是我对低级编程的体验非常有限,在我开始漫长而混乱的旅程之前,我想检查一下我在正确的道路上!

那么,理论上是否可以通过挂钩winsock来拦截和重定向不使用系统代理的传出http流量(最好使用c#中的easyHook)?

简单的是/否答案会很好,有些推理,甚至更好的文档会很棒

1 个答案:

答案 0 :(得分:1)

我做了很多次,所以绝对有可能。使用以下步骤开始。

  1. 让您的程序使用CreateProcess启动目标应用程序,并将CREATE_SUSPENDED传递给dwCreationFlags参数。这将启动目标应用程序,但不会开始执行。
  2. 注入包含“trampoline”功能的DLL。
  3. 挂钩Winsock功能gethostbyname
  4. 在目标进程主线程上调用ResumeThread以开始执行。
  5. 在你的钩子函数中,当它返回一个指向gethostbyname结构的有效指针时,调用真正的 hostent Winsock函数,改变地址数据,使其指向你的环回设备(本地主机)。
  6. 根据目标应用程序的工作方式,您可能需要挂钩其他Winsock函数,但挂钩gethostbyname通常就足够了。

    您将需要在C ++或C中编写DLL中的钩子函数。使用C#可能不是一个选项,而且它会引入许多可能导致与目标应用程序冲突的依赖项。