科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

  另一个试验,server端创建套接字时,指定协议号为200,client端创建套接字,填充ip头时,都指定协议号为255,结果server端就收不到client端发送的数据了。

  当时试验后的笔记:"

  server端收数据

  client端发数据

  server端创建套接字时,指定协议号为255,

  client端创建套接字,填充ip头时,都指定协议号为255,

  结果server端收到了client端发送的数据。

  server端创建套接字时,指定协议号为200,

  client端创建套接字,填充ip头时,都指定协议号为255,

  结果server端就收不到client端发送的数据了。

  多个server端,都使用协议号255,

  client端也向255协议发数据,

  多个server端,都收到了数据。

  "

  还有就是,如果程序既发又收的,并且是发往本机的,那么程序会收到自己发出的内容。没说清楚好像,比如吧,一个程序,发255的数据之后,就接收255上的数据,他把数据发往本机,那么它就会收到数据。

  rclient:

  #include

  #include

  #include

  #include

  #include

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

  typedef struct ip_hdr //定义IP首部

  {

  unsigned char h_verlen; //4位首部长度,4位IP版本号

  unsigned char tos; //8位服务类型TOS

  unsigned short total_len; //16位总长度(字节)

  unsigned short ident; //16位标识

  unsigned short frag_and_flags; //3位标志位

  unsigned char ttl; //8位生存时间 TTL

  unsigned char proto; //8位协议 (TCP, UDP 或其他)

  unsigned short checksum; //16位IP首部校验和

  unsigned int sourceIP; //32位源IP地址

  unsigned int destIP; //32位目的IP地址

  }IP_HEADER, *PIP_HEADER;

  USHORT CheckSum(USHORT *buffer, int size);

  void RawClient( char *szServer );

  void main()

  {

  WSADATA wsaData;

  char ServerAddr[256];

  printf("Server Addr : ");

  scanf("%s",ServerAddr);

  printf("\n");

  WSAStartup(0x0202, &wsaData);

  RawClient(ServerAddr);

  WSACleanup();

  }

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

  USHORT CheckSum(USHORT *buffer, int size)

  {

  unsigned long cksum=0;

  while (size > 1)

  {

  cksum += *buffer++;

  size -= sizeof(USHORT);

  }

  if (size)

  {

  cksum += *(UCHAR*)buffer;

  }

  cksum = (cksum >> 16) + (cksum &0xffff);

  cksum += (cksum >>16);

  return (USHORT)(~cksum);

  }

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

  void RawClient( char *szServer )

  {

  LPHOSTENT lpHostEntry;

  lpHostEntry = gethostbyname(szServer);

  if (lpHostEntry == NULL)

  {

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

  return;

  }

  SOCKET theSocket;

  theSocket = socket(AF_INET, SOCK_RAW, 255);

  if (theSocket == INVALID_SOCKET)

  {

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

  return;

  }

  int nRet;

  BOOL optval;

  optval=TRUE;

  nRet = setsockopt(theSocket, IPPROTO_IP, IP_HDRINCL, (char*)&optval, sizeof(optval));

  if (SOCKET_ERROR == nRet)

  {

  printf("SetSockOpt Error!%d\n", WSAGetLastError());

  return;

  }

  SOCKADDR_IN saServer;

  saServer.sin_family = AF_INET;

  saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); // Let WinSock assign address

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

  char szBuf[1024];

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

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

  int IpHdrLen=0;

  int DataLen=0;

  IP_HEADER *pIpHdr=NULL;

  char* pData=NULL;

  IpHdrLen=sizeof(IP_HEADER);

  pIpHdr=(IP_HEADER*)szBuf;

  pIpHdr->h_verlen=(4<<4)| (sizeof(IP_HEADER) / sizeof(unsigned long));

  pIpHdr->tos=0;

  pIpHdr->proto=255;

  pIpHdr->ttl=128;

  pIpHdr->ident=0;

  pIpHdr->checksum=0;

  pIpHdr->frag_and_flags=0;

  pIpHdr->sourceIP=inet_addr("1.1.1.1");

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

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

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