我希望在Windows机器上重定向传出的HTTP连接(不使用系统代理)。
背景:我有一些遗留的软件与一个现在已经不存在的web服务交互。我在一个简单的桌面应用程序中模拟了该服务,并希望将传出的http请求重新路由到该应用程序。
实验我已经使用windows主机文件重定向到本地主机成功,但这是不切实际的,因为我有其他服务需要监听默认http端口80,我不想设置另一个物理服务器只是为了这个
遗留软件不使用系统代理,所以像FiddlerCore这样的解决方案不起作用(不幸的是,因为这是了不起的!)
我注意到EasyHook在类似的问题中提到,与winsock一起,但我的低级编程经验非常有限,在我踏上漫长而令人困惑的旅程之前,我想检查一下我是在正确的道路上!
所以,理论上是否可以拦截和重定向不使用系统代理的http流量通过挂钩winsock(最好是c#中的easyHook)?
一个简单的是或否的答案就可以了,一些推理,甚至更好的文档将是非常棒的
我已经做过很多次了,所以这绝对是可能的。使用以下步骤开始。
- 让程序使用
CreateProcess
启动目标应用程序,并将CREATE_SUSPENDED
传递给dwCreationFlags
参数。这将启动目标应用程序,但不会开始执行。 - 注入包含"trampoline"函数的DLL。
- 钩子Winsock函数
gethostbyname
. - 在目标进程主线程上调用
ResumeThread
开始执行。 - 在钩子函数中调用real
gethostbyname
Winsock函数,当它返回一个指向hostent
结构的有效指针时,更改地址数据,使其指向你的环回设备(localhost)。
根据目标应用程序的工作方式,您可能需要挂钩额外的Winsock函数,但挂钩gethostbyname
通常是足够的。
你可能想用c++或C来编写DLL中的钩子函数。在这里使用c#可能不是一个选择,因为它会引入很多依赖项,可能会导致与目标应用程序的冲突。