繁体   English   中英

Winsock使用不同的版本

[英]Winsock working with different versions

我写了一个数据包拦截器来从winsock的send / recv函数中转储信息,据我所知,这两个函数都位于ws2_32.dll中。 挂钩是通过将jmp写入一个函数来完成的,该函数会记录我需要的信息,然后调用原始函数,挂钩本身可以正常工作。

真正奇怪的是,我开始注意到我无法记录任何RECV呼叫,而SEND呼叫却被很好地拦截了。

编写钩子的函数如下:

procedure Setup;
var
  lModuleHandle : dword;
  lPlaceHolder  : dword;
begin
  lModuleHandle := LoadLibrary(MODULE_NAME);

  OriginalSend := Dword(GetProcAddress(lModuleHandle, FUNCTION_SEND));
  OriginalRecv := Dword(GetProcAddress(lModuleHandle, FUNCTION_RECV));

  VirtualProtect(Ptr(OriginalSend), 5, PAGE_EXECUTE_READWRITE, lPlaceHolder);
  VirtualProtect(Ptr(OriginalRecv), 5, PAGE_EXECUTE_READWRITE, lPlaceHolder);

  PByte(OriginalRecv)^ := $E9;
  PDword(OriginalRecv + 1)^ := Dword(@Hook_Recv) - OriginalRecv - 5;

  PByte(OriginalSend)^ := $E9;
  PDword(OriginalSend + 1)^ := Dword(@Hook_Send) - OriginalSend - 5;

  Inc(OriginalSend, 5);
  Inc(OriginalRecv, 5);
end;

我正在使用的程序(被拦截的程序)使用winsock 2,经过一些调试后,我注意到我已加载wsock32.dll,并决定在其RECV上放置一个断点,而在ws2_32.dll的SEND中有另一个断点; 两个断点都被击中。

这意味着程序正在使用ws2_32.dll进行发送,并使用wsock32.dll进行接收,这有意义吗? 这种行为是否正常?

在不同的模块中编写钩子非常容易,但是由于它们应该是不同的,因此使我相信有些问题,而且计算机中的其他一些应用程序(例如firefox本身)也具有相同的行为。

我添加此图像是为了更好地说明情况,看起来该程序链接到wsock32并最终具有一些ws2_32的功能。

可以更好地说明情况的图像

wsock32.dll适用于Winsock 1.x, ws2_32.dll适用于Winsock2.x。 大多数应用程序都链接到ws2_32.dll ,但是旧版应用程序(和配置错误的应用程序)可能仍链接到wsock32.dll 在现代系统上, wsock32.dll内部将其大多数功能重定向到ws2_32.dllmswsock.dll

您的目标应用程序链接到wsock32.dll 您改为在ws2_32.dll中挂接函数。

在内部, wsock32.send()直接映射到ws2_32.send() ,这就是send()钩子起作用的原因。 但是, wsock32.recv() 不会映射到ws2_32.recv() ,这就是为什么您的recv()钩子不起作用的原因。 wsock32.recv()实际上实际上调用了ws2_32.WSARecv()

在WinSock 2.x中,标准的BSD套接字函数仍然可用( send()recv()等),但是也有Winsock专用的扩展函数( WSASend()WSARecv()等), Winsock 2.x套接字也可以支持重叠的I / O和I / O完成端口。 因此,如果您确实想挂钩任何给定应用程序内所有可能的数据交换途径,则可能必须挂钩BSD功能,Winsock扩展功能和I / O功能。 但是,如果您仅针对一个特定的应用程序,则只需挂接它实际调用的功能(在这种情况下为send()WSARecv() )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM