none
【求助】hook accept拒绝连接 RRS feed

  • 问题

  • 我需要限制程序A的网络连接(比如一天一个IP只能connect几次),无法修改程序A,于是采用了注入hook其accept,如下:

    SOCKET WSAAPI myaccept(
         SOCKET s,
         struct sockaddr FAR * addr,
         int FAR * addrlen
        )
    {
       static int count=0;
       lpfnaccept real_accept=(lpfnaccept)HookItem.pOldFunEntry;
       SOCKET sClient=((lpfnaccept)addr)(s,addr,addrlen);
       SYSTEMTIME systm;
       ::GetLocalTime(&systm);
       SOCKADDR_IN peer_addr;
       int peer_addrlen=sizeof peer_addr;
       ::getpeername(sClient,(LPSOCKADDR)&peer_addr,&peer_addrlen);
       log(systm,peer_addr);
    
      if (count>3)
      {
        count=0;
        ::closesocket(sClient);
        return INVALID_SOCKET;
      }
      else
      {
        ++count;
         return sClient;
       }
    }
    结果发现如果原本返回sClient则没有问题,如果拒绝访问return INVALID_SOCKET;一次后则后续的所有connect都会失败,并且不会写入log,也就是说没有再调用我的myaccept?


    2012年3月5日 7:25

答案

  • 1. 注入其他API看看是不是你hook API没有用对

    2. accept可以接收,还有跳过accept直接用底层API,read/write的办法,还有一些异步函数select,AcceptEx(好像叫这个)

    这种方法很不合理的,你必须把所有的情况都考虑到

    建议使用其他软件

    高级的方法有写虚拟网卡驱动,用虚拟网卡分析TCP包


    0xBAADF00D

    • 已建议为答案 Helen Zhao 2012年3月6日 8:16
    • 已标记为答案 Helen Zhao 2012年3月12日 6:26
    2012年3月6日 3:31
    版主