1

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

背景:

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

实验上,我已经使用 Windows 主机文件成功重定向到本地主机,但这不切实际,因为我有其他服务需要在默认 http 端口 80 上侦听,我不想为此设置另一个物理服务器

旧版软件不使用系统代理,因此像 FiddlerCore 这样的解决方案将无法工作(不幸的是,因为这太棒了!)

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

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

一个简单的是/否的答案就可以了,一些推理,甚至更好的文档会很棒

4

1 回答 1

1

我已经做过很多次了,所以这是绝对可能的。使用以下步骤开始。

  1. 让您的程序启动目标应用程序CreateProcess并传递CREATE_SUSPENDEDdwCreationFlags参数。这将启动目标应用程序,但不会开始执行。
  2. 注入包含“蹦床”函数的 DLL。
  3. 挂钩 Winsock 函数gethostbyname
  4. 调用ResumeThread目标进程主线程开始执行。
  5. 在您的钩子函数中调用真正的 gethostbynameWinsock 函数,当它返回一个指向hostent结构的有效指针时,更改地址数据以使其指向您的环回设备 (localhost)。

根据目标应用程序的工作方式,您可能需要挂钩其他 Winsock 函数,但挂钩gethostbyname通常足以满足这种情况。

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

于 2013-06-03T14:47:30.843 回答