【问题标题】:Does .NET use WSOCK32.DLL at all?.NET 是否完全使用 WSOCK32.DLL?
【发布时间】:2015-04-17 16:20:42
【问题描述】:

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

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

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

嗯,我是这项技术的新手,但是这一步取得了一些成功。一开始,我创建了一个简单的函数injection_body,它将"intercepted" 输出到控制台,并且不会将控制权返回到原始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  
...

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

但是这段代码

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

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

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

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

现在我可以看到导致这种行为的几个“可能”原因,但所有这些看起来都不是有效的。 HttpWebRequest 可以使用 WSOCK32.DLL 以外的其他东西吗?它可以使用未加载到我的地址空间的 WSA lilrary 实例吗? MS可以对HttpWebRequest施一些邪恶的咒语吗?

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

【问题讨论】:

  • .NET 可能将 ws2_32.dll 用于套接字函数,并且可能使用 WSASocket() 超过 socket()HttpWebRequest 可能不会直接实现 HTTP -- WinHTTP 是可能的。
  • 它甚至可能在某些部分使用http.sys 之类的东西。为什么不直接使用 Wireshark 之类的东西来监控通信呢?
  • @CoryNelson 谢谢!我会试一试。
  • @Luaan 感谢您的回复,但 Wireshark 似乎是一个独立的应用程序,而我需要以编程方式处理请求。
  • 我过去曾使用过一个很好的工具来弄清楚程序实际上在做什么 API 调用是一个名为 API Monitor 的免费软件工具(不要害怕 Alpha 标签,该程序是稳定,只是作者想在“发布”之前添加更多功能)。当您不知道是否引用了 dll(如您的情况)时,另一个有用的方法是 Dependency Walker。它将向您显示在程序运行时加载到内存中的所有 Dll。

标签: .net sockets intercept


【解决方案1】:

感谢你们的cmets!

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

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

wininet.dll的实现不依赖于winsock.dll ws2_32.dll,而是独立存在...

WinHTTP.dll不依赖winsock或ws2_32,也独立运行。

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

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

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多