我的最终目标很麻烦。我必须收到有关我的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
施放一些邪恶法术?
我不知道如何弄清楚该行为的真正原因以及解决方法。
答案 0 :(得分:0)
感谢您的评论!
从WSASocket
拦截ws2_32.dll
可以检测HttpWebRequest
次来电,但仍然无法接受作为解决方案。
对于类似黑盒子的组件,会出现很多不同的拦截API。
wininet.dll实现不依赖于winsock.dll ws2_32.dll,而是独立存在......
WinHTTP.dll不依赖于winsock或ws2_32,也可以独立运行。
嗯,这个API似乎是一次又一次重新发明的好轮子......
拦截一切似乎不是正确的方法。像Scott Chamberlain这样的工具进行调查可能是最好的解决方案。