.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 等工具进行调查表明可能是最好的解决方案。
我的最终目标有点麻烦。我必须收到有关从我的 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 等工具进行调查表明可能是最好的解决方案。