.NET 完全使用 WSOCK32.DLL 吗?

Does .NET use WSOCK32.DLL at all?

我的最终目标有点麻烦。我必须收到有关从我的 C# 应用程序中出站的任何 Web 请求的通知,该应用程序包含一些黑盒组件。

我最初的猜测很简单:在Windows环境中WSA用于发送网络请求。这意味着如果我拦截 socket 函数调用,我将收到有关每个出站 Web 请求的通知。

我的后续步骤非常简单。 应在 socket 函数中进行注入的 C++/CLI DLL 已创建。

嗯,我是这项技术的新手,但是这一步取得了一些成功。一开始,我创建了一个简单的函数 injection_body,它将 "intercepted" 输出到控制台,而不是 return 对原始 socket 的控制。这意味着任何创建新套接字的尝试都将显示 "intercepted" 行并抛出异常,这可能是由于堆栈损坏。好吧,我可以接受一段时间。

socket注入前函数:

7635430A 8B FF                mov         edi,edi  
7635430C 55                   push        ebp  
7635430D 8B EC                mov         ebp,esp  
7635430F A1 50 A0 38 76       mov         eax,dword ptr ds:[7638A050h]  
76354314 83 EC 0C             sub         esp,0Ch  
76354317 3D 73 2D 35 76       cmp         eax,76352D73h
...

及之后

7635430A E9 61 D4 DB F8       jmp         injection_body (6F111770h)  
7635430F A1 50 A0 38 76       mov         eax,dword ptr ds:[7638A050h]  
76354314 83 EC 0C             sub         esp,0Ch  
76354317 3D 73 2D 35 76       cmp         eax,76352D73h  
...

如果 socket 直接从 C++/CLI DLL 的本机代码调用,注入将按预期工作:应用程序显示 "intercepted" 并崩溃。证明注入正确

但是这段代码

using (var reader = new StreamReader(
       HttpWebRequest.Create("http://whosebug.com/questions/ask")
       .GetResponse().GetResponseStream())
      )
      Console.WriteLine(new string(reader.ReadToEnd().Take(100).ToArray()));

正常工作,我。 e.它打印一页而不是 "intercepted" 并且不会导致任何异常。

但是,如果将相同的方法应用于 CreateFileW WinAPI 功能,它将影响应用程序的两个部分(托管和本机)。

最后我的主要问题是:为什么我不能拦截HttpWebRequest?我哪里错了?

现在我可以看到该行为的几个 'possible' 原因,但它们看起来都不成立。 HttpWebRequest 可以使用 WSOCK32.DLL 以外的东西吗?它可以使用 WSA lilrary 实例,不加载到我的地址 space 吗? MS 可以对 HttpWebRequest 施一些邪恶的咒语吗?

我不知道如何找出该行为的真正原因以及如何解决它。

感谢您的评论!

ws2_32.dll 拦截 WSASocket 允许检测 HttpWebRequest 调用,但仍然不能作为解决方案接受。

对于类似黑盒的组件,会出现很多不同的 API 拦截。

wininet.dll realization does not depend on the winsock.dll ws2_32.dll, but independent existence...

WinHTTP.dll do not depend on the winsock or ws2_32, also operate independently.

好吧,这个 API 似乎是一个可以一次又一次重新发明的好轮子...

拦截一切似乎不是正确的方法。使用 Scott Chamberlain 等工具进行调查表明可能是最好的解决方案。