科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道木马隐藏端口的一种方法(3)

木马隐藏端口的一种方法(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这是一种很特殊的方法,使用它通讯没有端口,而且由于它的特殊性,也许会带来一些其他的优点。它不使用tcp协议,也不使用udp协议,也不使用icmp协议。
  • 评论
  • 分享微博
  • 分享邮件

  pIpHdr->destIP=(unsigned int)saServer.sin_addr.s_addr;

  pData=(szBuf+IpHdrLen);

  printf("Type a String :");

  scanf("%s",pData);

  DataLen=strlen(pData);

  pIpHdr->total_len=IpHdrLen+DataLen;

  //////////////////////////////////////////////////////////////////

  nRet = sendto(theSocket, // Socket

  szBuf, // Data buffer

  IpHdrLen+DataLen, // Length of data

  0, // Flags

  (LPSOCKADDR)&saServer, // Server address

  sizeof(struct sockaddr)); // Length of address

  if(nRet!=SOCKET_ERROR)

  {

  printf("Client send: %s\n",pData);

  }

  getch();

  closesocket(theSocket);

  return;

  }

  rserver:

  #include

  #include

  #include

  #include

  #include

  #pragma comment(lib,"ws2_32.lib")

  void RawServer();

  void main()

  {

  WSADATA wsaData;

  WSAStartup(0x0202, &wsaData);

  RawServer();

  WSACleanup();

  }

  //////////////////////////////////////////////////////////

  void RawServer()

  {

  int nRet;

  SOCKET theSocket;

  theSocket = socket(AF_INET, SOCK_RAW, 255);

  if (theSocket == INVALID_SOCKET)

  {

  printf("socket() error\n");

  return;

  }

  SOCKADDR_IN saServer;

  saServer.sin_family = AF_INET;

  saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock assign address

  saServer.sin_port = 0; // Use port passed from user

  nRet = bind(theSocket, // Socket deScriptor

  (LPSOCKADDR)&saServer, // Address to bind to

  sizeof(struct sockaddr) // Size of address

  );

  if (nRet == SOCKET_ERROR)

  {

  printf("bind() error\n");

  closesocket(theSocket);

  return;

  }

  ///////////////////////////////////////////////////

  int nLen;

  nLen = sizeof(SOCKADDR);

  char szBuf[1024];

  nRet = gethostname(szBuf, sizeof(szBuf));

  if (nRet == SOCKET_ERROR)

  {

  printf("gethostname() error\n");

  closesocket(theSocket);

  return;

  }

  LPHOSTENT lpHostEntry;

  lpHostEntry = gethostbyname(szBuf);

  printf("Server named %s addr %s \n\n",

  szBuf, inet_ntoa(*(LPIN_ADDR)lpHostEntry->h_addr));

  ///////////////////////////////////////////////////

  SOCKADDR_IN saClient;

  memset(szBuf, 0, sizeof(szBuf));

  nRet = recvfrom(theSocket, // Bound socket

  szBuf, // Receive buffer

  sizeof(szBuf), // Size of buffer in bytes

  0, // Flags

  (struct sockaddr*)&saClient, // Buffer to receive client address

  &nLen); // Length of client address buffer

  if(nRet!=SOCKET_ERROR)

  {

  printf("Server recv: %s\n",szBuf+20);

  }

  else

  {

  printf("recv error: %d\n",WSAGetLastError());

  closesocket(theSocket);

  return;

  }

  getch();

  closesocket(theSocket);

  return;

  }

  使用Jiurl255进行数据传输明显是没有tcp和udp的端口的,这样也就不会被 netstat -an 之类的命令看到。这和利用icmp传输数据很象,但是我觉得Jiurl255比用icmp传数据要来的好一些。它还有个比较大的缺点就是,由于直接使用的是ip,所以传输的数据是有可能丢失的,这是我观察后写的笔记:"使用ip,ip头字段中的上层协议填255,这是一个还没有人用的协议号。然后在网络中两个主机上分别运行c,s程序,c发送ip255报文,内容hello n,共发50个,每秒发一个。s收ip255报文,确实收到,一次测试中,50个报文,收到了49个,也确实存在ip报丢失的情况。两个方向上都试了,是可行的。"

  因此用此方法隐藏端口是要多费不少力气的,我自己写的一个程序中,传送文件使用了一些简单的等待ack,超时重发的机制保证数据不会丢失和发生错误,传送命令,没有保证不会丢失。有时间的话,准备写个保证不丢失,不错误的收发函数。传送文件用的那些机制,参考了使用udp协议进行文件可靠传输的tftp协议。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章