Linux编程可以给你的程序开后门.doc

上传人:白大夫 文档编号:3255451 上传时间:2019-08-06 格式:DOC 页数:4 大小:23KB
返回 下载 相关 举报
Linux编程可以给你的程序开后门.doc_第1页
第1页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Linux编程可以给你的程序开后门.doc》由会员分享,可在线阅读,更多相关《Linux编程可以给你的程序开后门.doc(4页珍藏版)》请在三一文库上搜索。

1、Linux编程可以给你的程序开后门这里说的“后门”并不是教你做坏事,而是让你做好事,搭建自己的调试工具更好地进行调试开发。我们都知道,当程序发生异常错误时,我们需要定位到错误,有时我们还想,我们在不修改程序的前提下,就能通过log来定位错误呢?有人会说,我在我的程序里加多点打印就好了,程序每做一步我就加一行打印,到时一查log就知道程序在哪一步死掉的了。这个方法在小程序里也许会行得通,但是,在一个大型系统,每秒的log达到几百条,那时我们怎么能在这繁多的log里找出我们想要的那条的log的?这工作量大得夸张。工程中的解决方法就是给自己的程序开个后门专门给开发人员来调试程序。当然我们通过后门能做

2、的不仅仅是这些,具体来说,后门就是我们程序眼和跑着的程序交流的一道门。搭建这么一个程序后门主要有这么几个关键点:在进程里开一个线程用于充当debug center该线程通过fifo接收开发人员传给它的命令解析这些命令用脚本搭建简单的命令行界面一、创建debug center线程这个就没什么好说了,我使用了上篇文章Linux编程之自定义消息队列所搭建的消息队列框架,将其中的msg_sender1改造为debug_center线程,作为我们的程序后门,我们跟程序交互就是从这里开始的。if(pthread_create( return -1;二、创建FIFO为什么要创建FIFO(有名管道)?因为我们

3、需要跟我们的程序进行通信,我们需要把我们的指令告诉程序,那就需要一个通信途径,FIFO就是一个很好的选择。我们把我们的指令写进管道,程序将指令从管道出,然后执行该指令,这样子我们程序后门的通信模型就出来了。why解决了,是时候解决how了。对于管道的操作,我是这么做的:system(rm /vob/ljsdpoenew3/exercise/debug_log); /每次进入debug center我们都将原来的fifo文件删除,避免影响后面操作rc = mkfifo(/vob/ljsdpoenew3/exercise/debug_log, 0666); /创建fifoif(rc tic int

4、 get_args(FILE *inputFile) char tmpBuffer100; char *line = tmpBuffer; char separator = ,nt; char *token; int i; char eof; int num = 0; eof = !fgets(line, sizeof(tmpBuffer), inputFile); if (eof) return num; token = strtok(line, separator); while (num 字符串转化为整数 fprintf(fd, debug level change from %d to

5、 %d,global.debug_level,n); global.debug_level = n; /更改log级别 break; default: help_manual(fd); break; break; default: help_manual(fd); break; 四、搭建debug界面先上界面图:我们敲的每个命令都是通过该界面传递到程序那头的,比如“d d”就表示展示出现在系统运行时的log级别,而“s d”就是设置我们想要看的log级别,这样我们就可以实现通过程序后门动态修改程序走向了。那该如何实现这个看似简单的交互界面呢?实现该交互界面,有几个关键点:我们需将程序的打印输出

6、重定向到一个文件里使用shell脚本读出文件的内容我们输入的命令需写入到fifo中以上三点就是做成界面的最重要的技术问题。重定向输出一开始我是打算将标准输出、标准错误都重定向到文件里的额,但是想了想,还是想直接把打印内容直接输出到文件就好了。比如这样:fd = fopen(/vob/ljsdpoenew3/exercise/debug_log2, w+); if(fd = NULL) MY_LOG(DEBUG, open debug_log2 fail!n); pthread_exit(0); fprintf(fd, debug level change from %d to %d,globa

7、l.debug_level,n);这样我们在debug center产生的打印都输出到文件debug_log2上了。2.利用脚本读出内容且while true ;do read inp #循环读入用户输入 if $inp = quit ;then #quit代表结束该界面 exit 0 fi echo $inp $my_inp_fifo #写入fifo cat debug_log2.txt #显示log的内容done那看看这个命令行界面跑起来是怎么的吧!首先我们运行server进程sever进程不断产生消息并处理消息。我们打开另一个窗口,并执行脚本./test.sh,进入界面我们使用了d d命

8、令看到了程序此时的debug级别,用d q看出了程序消息队列的情况。我们使用了s d指令将debug level设置为0,此时屏幕没有任何打印输出,当我们在使用s d指令将level设置为-1(即将所有位置一),此时所有打印级别都打开了,屏幕又开始疯狂打印了。也就说,我们通过后门操控了程序,这里我们只是仅仅修改了程序的log级别,当然我们还可以做更多的事,只要依照这个框架往里面加指令,以及对应的处理操作,就可以实现了。五、总结所谓后门,就是一个可以操控程序的接口,这个接口仅仅用于开发者调试开发,不会开放给客户。所以这个后门的作用非常巨大,所以是开发者调试程序的一大利器。有人会想,我想用sock

9、et来代替fifo进行进程通信可以不,这样就可以做到远程主机操控程序了。我觉得是可以的,但是感觉利用telnet到目的主机再运行脚本操作比较安全。最后给出源代码框架1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include msg_def.h 9 #include global.h 10 11 extern Queue_t MsgQueue; 12 extern dashboard_t global; 13 14 15 #define MAX_NUM_ARGS 20 16 #de

10、fine MAX_ARGS_SIZE 56 17 18 staTIc char argsMAX_NUM_ARGSMAX_ARGS_SIZE; 19 20 staTIc int get_args(FILE *inputFile,FILE *fd) 21 22 char tmpBuffer100; 23 char tmpBuffer2100; 24 char *line = tmpBuffer; 25 char separator = ,nt; 26 char *token; 27 int i; 28 char eof; 29 30 int num = 0; 31 32 eof = !fgets(

11、line, sizeof(tmpBuffer), inputFile); 33 if (eof) 34 return num; 35 36 memcpy(tmpBuffer2,tmpBuffer,100); 37 38 39 token = strtok(line, separator); 40 while (num 0) 51 52 fprintf(fd, %s, tmpBuffer2); 53 54 55 return num; 56 57 58 59 staTIc void help_manual(FILE* fd) 60 61 fprintf(fd,nd d : display cur

12、rent debug leveln); 62 fprintf(fd,d q : display msg queue length, head and tailn); 63 fprintf(fd,s d level : set debug level n); 64 65 66 staTIc void show_MQ(FILE* fd) 67 68 fprintf(fd, msg queue length:%d head:%d tail:%d n,abs(MsgQueue.head-MsgQueue.rear),MsgQueue.head,MsgQueue.rear); 69 70 71 stat

13、ic void show_debug_level(FILE* fd) 72 73 fprintf(fd, current debug level: %dn, global.debug_level); 74 75 76 77 78 void debug_center() 79 80 int rc,num,n; 81 FILE* fp; 82 FILE* fd; 83 84 MY_LOG(DEBUG,Hi,debug!n); 85 86 87 system(rm /vob/ljsdpoenew3/exercise/debug_log); 88 system(rm /vob/ljsdpoenew3/

14、exercise/debug_log2); 89 rc = mkfifo(/vob/ljsdpoenew3/exercise/debug_log, 0666); 90 if(rc );121 num = get_args(fp,fd);122 if(num );129 switch(args00)130 131 case d: /display132 switch(args10)133 134 case q: /display queue135 show_MQ(fd);136 break;137 case d: /display debug138 show_debug_level(fd);13

15、9 break;140 141 default:142 help_manual(fd);143 break;144 145 break;146 147 case s: /set148 switch(args10)149 150 case d: /set debug level151 n = atoi(args2);152 fprintf(fd, debug level change from %d to %d,global.debug_level,n);153 global.debug_level = n;154 break;155 156 default:157 help_manual(fd);158 break;159 160 break;161 162 default:163 help_manual(fd);164 break;165 166 167 168

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1