.NET完全使用WSOCK32.DLL吗?

时间:2015-04-17 16:20:43

标签: .net sockets intercept

我的最终目标很麻烦。我必须收到有关我的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()));

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

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

最后我的主要问题是:为什么我无法拦截HttpWebRequest?我哪里出错?

现在我可以看到几个可能的'这种行为的原因,但他们都看起来没有效果。 HttpWebRequest可以使用WSOCK32.DLL以外的其他内容吗?它可以使用WSA lilrary实例,不加载到我的地址空间吗? MS能否在HttpWebRequest施放一些邪恶法术?

我不知道如何弄清楚该行为的真正原因以及解决方法。

1 个答案:

答案 0 :(得分:0)

感谢您的评论!

WSASocket拦截ws2_32.dll可以检测HttpWebRequest次来电,但仍然无法接受作为解决方案。

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

  

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

     

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

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

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