Hook Win32 API 的应用研究之一:网络监控

 
      Hook Win32 API 的应用研究之一:网络监控
                绝大多数具有网络功能的软件都是基于socket(网络套接字)实现的,或者是使用了更高层的接口(例如:WinInet
            API)而最底层仍然是基于socket实现的。在大多数操作系统中都实现了socket接口,在WINDOWS操作系统中的实现称为WinSock。WinSock是以DLL的形式实现的,现在WinSock有两个版本的实现:WinSock
            1.1(winsock.dll)和WinSock 2(ws2_32.dll),ws2_32.dll既支持WinSock
            1.1的函数又支持WinSock 2规范中增加的许多额外的函数,我们可以像Win32
            API一样的使用它,只是需要额外链接一个库而已。这里不讨论具体的WinSock编程,只是让大家了解,WinSock是WINDOWS应用程序与网络打交道的接口,是我们实现网络监控这个目的的突破口。
 
               
            好了,那我们就开始吧! 网络监控 这个范围有点太泛了,我们先把范围缩小到监控网络连接请求这个具体的操作上面吧,这也就是我的作品:IPGate
            网址过滤器的核心技术。我们先来看看一个TCP/IP连接是如何建立的:
 
                客户机端               服务器端
                ========              ========
                               监听套接字      连接套接字
                               =========      =========
                socket()       socket()
                bind()         bind()
                               listen()
                connect()----->accept()------>创建连接套接字
                send()----------------------->recv()
                recv()<-----------------------send()
                          .
                          .
                          .
                closesocket() closesocket() closesocket()
 
                我们可以看出,是客户机端的connect()执行实际的连接请求动作,我们再来看看connect函数的参数:
 
            int connect(
              SOCKET s, // 指定对哪个套接字进行操作
              const struct sockaddr FAR *name, // 这是一个描述服务器IP地址的结构
              int namelen // 指明上面这个结构的大小
            );
 
            对于name参数,由于sockaddr结构内容依赖于具体的协议,所以对于TCP/IP协议,我们传递sockaddr_in这个结构,再来看看这个结构:
 
            struct sockaddr_in{
              short           sin_family; // 必须为AF_INET
              unsigned short sin_port; // IP端口号
              struct in_addr sin_addr; // 标识IP地址的一个结构体
              char            sin_zero[8]; // 为了兼容sockaddr而设置的占位空间
            };
 
               
            到这儿,我们可以看出,对于一次连接请求的目的地信息,已经全部在传入的参数中描述清楚了,接下来要做的就设置一个全局API钩子,钩住所有程序的connect()调用,在进行实际的connect()操作之前,我们先分析传入的参数,如果发现连接目的地是我们不允许访问的,就不进行连接操作,仅返回一个错误码就可以了。就这么简单,就能实现一夫当关,万夫莫开的效果。
 
               
            同样的道理,也可以Hook其它函数而实现监控整个网络通讯各方面的内容,比如说截取发送和接收的数据包进行分析等等,这就取决于设计者的意图了
 
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

hyblusea

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值