Linux编程之给你的程序开后门
- 在进程里开一个线程用于充当debug center
- 该线程通过fifo接收开发人员传给它的命令
- 解析这些命令
- 用脚本搭建简单的命令行界面
- if(pthread_create(&debug_thread_id, NULL, (void*)debug_center, NULL))
- {
- MY_LOG(FATAL,"create debug center fail!\n");
- return -;
- }
- system("rm /vob/ljsdpoenew3/exercise/debug_log"); //每次进入debug center我们都将原来的fifo文件删除,避免影响后面操作
- rc = mkfifo("/vob/ljsdpoenew3/exercise/debug_log", ); //创建fifo
- if(rc < )
- {
- MY_LOG(DEBUG, "make fifo fail!\n");
- pthread_exit();
- }
- fp = fopen("/vob/ljsdpoenew3/exercise/debug_log", "r"); //打开fifo,读取指令
- if(fp == NULL)
- {
- MY_LOG(DEBUG, "open debug_log fail!\n");
- pthread_exit();
- }
读fifo我们解决了,那怎么将我们的指令写进fifo呢?这里我打算使用shell的read指令,文章后面会解释如何实现。
- 将从fifo取得数据进行格式解析,比如我定义了d d的意思是display debug,即显示现在的debug级别,那么我们程序就得首先对原始数据进行格式处理。
- 将指令进行命令解析,执行相应操作。
- static int get_args(FILE *inputFile)
- {
- char tmpBuffer[];
- char *line = tmpBuffer;
- char separator[] = " ,\n\t";
- char *token;
- int i;
- char eof;
- int num = ;
- eof = !fgets(line, sizeof(tmpBuffer), inputFile);
- if (eof)
- return num;
- token = strtok(line, separator);
- while (num < MAX_NUM_ARGS && token)
- {
- strcpy(args[num], token);
- num++;
- token = strtok(NULL, separator);
- }
- for (i = num; i < MAX_NUM_ARGS; i++)
- args[i][] = ;
- return num;
- }
- switch(args[][]) //解析指令,看每个指令对应哪些意思
- {
- case 'd': //display
- switch(args[][])
- {
- case 'q': //display queue
- show_MQ(fd);
- break;
- case 'd': //display debug
- show_debug_level(fd);
- break;
- default:
- help_manual(fd);
- break;
- }
- break;
- case 's': //set
- switch(args[][])
- {
- case 'd': //set debug level
- n = atoi(args[]); //将字符串转化为整数
- fprintf(fd," debug level change from %d to %d",global.debug_level,n);
- global.debug_level = n; //更改log级别
- break;
- default:
- help_manual(fd);
- break;
- }
- break;
- default:
- help_manual(fd);
- break;
- }
- 我们需将程序的打印输出重定向到一个文件里
- 使用shell脚本读出文件的内容
- 我们输入的命令需写入到fifo中
- 重定向输出
一开始我是打算将标准输出、标准错误都重定向到文件里的额,但是想了想,还是想直接把打印内容直接输出到文件就好了。比如这样:
- fd = fopen("/vob/ljsdpoenew3/exercise/debug_log2", "w+");
- if(fd == NULL)
- {
- MY_LOG(DEBUG, "open debug_log2 fail!\n");
- pthread_exit();
- }
- fprintf(fd," debug level change from %d to %d",global.debug_level,n);
2.利用脚本读出内容且将内容写入fifo
- #!/bin/bash
- my_inp_fifo=/vob/ljsdpoenew3/exercise/debug_log # 指定fifo文件
- stty erase ^H
- while [ true ];
- do
- read inp #循环读入用户输入
- if [ "$inp" == "quit" ];then #quit代表结束该界面
- exit
- fi
- echo $inp > $my_inp_fifo #写入fifo
- cat debug_log2.txt #显示log的内容
- done






- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/prctl.h>
- #include "msg_def.h"
- #include "global.h"
- extern Queue_t MsgQueue;
- extern dashboard_t global;
- #define MAX_NUM_ARGS 20
- #define MAX_ARGS_SIZE 56
- static char args[MAX_NUM_ARGS][MAX_ARGS_SIZE];
- static int get_args(FILE *inputFile,FILE *fd)
- {
- char tmpBuffer[];
- char tmpBuffer2[];
- char *line = tmpBuffer;
- char separator[] = " ,\n\t";
- char *token;
- int i;
- char eof;
- int num = ;
- eof = !fgets(line, sizeof(tmpBuffer), inputFile);
- if (eof)
- return num;
- memcpy(tmpBuffer2,tmpBuffer,);
- token = strtok(line, separator);
- while (num < MAX_NUM_ARGS && token)
- {
- strcpy(args[num], token);
- num++;
- token = strtok(NULL, separator);
- }
- for (i = num; i < MAX_NUM_ARGS; i++)
- args[i][] = ;
- if(num > )
- {
- fprintf(fd, "%s", tmpBuffer2);
- }
- return num;
- }
- static void help_manual(FILE* fd)
- {
- fprintf(fd,"\nd d : display current debug level\n");
- fprintf(fd,"d q : display msg queue length, head and tail\n");
- fprintf(fd,"s d [level] : set debug [level] \n");
- }
- static void show_MQ(FILE* fd)
- {
- fprintf(fd," msg queue length:%d head:%d tail:%d \n",abs(MsgQueue.head-MsgQueue.rear),MsgQueue.head,MsgQueue.rear);
- }
- static void show_debug_level(FILE* fd)
- {
- fprintf(fd," current debug level: %d\n", global.debug_level);
- }
- void debug_center()
- {
- int rc,num,n;
- FILE* fp;
- FILE* fd;
- MY_LOG(DEBUG,"Hi,debug!\n");
- system("rm /vob/ljsdpoenew3/exercise/debug_log");
- system("rm /vob/ljsdpoenew3/exercise/debug_log2");
- rc = mkfifo("/vob/ljsdpoenew3/exercise/debug_log", );
- if(rc < )
- {
- MY_LOG(DEBUG, "make fifo fail!\n");
- pthread_exit();
- }
- fp = fopen("/vob/ljsdpoenew3/exercise/debug_log", "r");
- if(fp == NULL)
- {
- MY_LOG(DEBUG, "open debug_log fail!\n");
- pthread_exit();
- }
- fd = fopen("/vob/ljsdpoenew3/exercise/debug_log2", "w+");
- if(fd == NULL)
- {
- MY_LOG(DEBUG, "open debug_log2 fail!\n");
- pthread_exit();
- }
- //freopen("/vob/ljsdpoenew3/exercise/debug_log2.txt", "w+", fd);
- fprintf(fd," \n==================================================\n");
- fprintf(fd," Welcme to Debug Center!");
- fprintf(fd," \n==================================================\n\n");
- help_manual(fd);
- //fflush(fd);
- while()
- {
- fflush(fd);
- fprintf(fd,"\n\nmy_diag>");
- num = get_args(fp,fd);
- if(num < )
- {
- freopen("/vob/ljsdpoenew3/exercise/debug_log", "r", fp);
- fflush(fd);
- continue;
- }
- fprintf(fd,"\n\nmy_diag>");
- switch(args[][])
- {
- case 'd': //display
- switch(args[][])
- {
- case 'q': //display queue
- show_MQ(fd);
- break;
- case 'd': //display debug
- show_debug_level(fd);
- break;
- default:
- help_manual(fd);
- break;
- }
- break;
- case 's': //set
- switch(args[][])
- {
- case 'd': //set debug level
- n = atoi(args[]);
- fprintf(fd," debug level change from %d to %d",global.debug_level,n);
- global.debug_level = n;
- break;
- default:
- help_manual(fd);
- break;
- }
- break;
- default:
- help_manual(fd);
- break;
- }
- }
- }
Linux编程之给你的程序开后门的更多相关文章
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为 ...
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- linux编程获取本机网络相关参数
getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程 ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...
- 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- Linux编程简介
Linux编程可以分为Shell(如BASH.TCSH.GAWK.Perl.Tcl和Tk等)编程和高级语言(C语言,C++语言,java语言等)编程,Linux程序需要首先转化为低级机器语言即所谓的二 ...
- 在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
- Linux编程return与exit区别
Linux编程return与exit区别 exit 是用来结束一个程序的执行的,而return只是用来从一个函数中返回. return return 表示从被调函数返回到主调函数继续执行,返回时可附 ...
随机推荐
- CSS学习笔记:利用border绘制三角形
在前端的笔试.面试过程中,经常会出现一些不规则图形的CSS设置,基本上多是矩形外加一个三角形.利用CSS属性可以实现三角形的生成,主要利用上下左右的边距的折叠. 1.第一种图形: .box { wid ...
- 增加 Java 有几个好习惯表现
以下是一些参考网络资源中的摘要Java编程在一些地方尽可能做. 1. 尝试使用单个例如在合适的场合 使用单例可以减轻负荷的负担,缩短加载时间.提高装载效率,但并不是所有的地方都适合一个案例.简单的说, ...
- 关于Java String对象创建的几点疑问
我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...
- leetcode第28题--Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...
- 【本·伍德Lua专栏】补充的基础06:简单的错误处理
昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后-然后就没有看书了.(小若:借口!借口! ) 今天来聊聊错误处理吧.只是毕竟这仅仅是前面的章节.书上的内容似乎有点一笔带过的味道. 没关系,简单更 ...
- 《STL源代码剖析》---stl_hash_set.h阅读笔记
STL仅仅规定接口和复杂度,对于详细实现不作要求.set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现.hash_set的接口,hash_tabl ...
- NHibernate 数据查询之QueryOver<T>
NHibernate 数据查询之QueryOver<T> 一.限制运算符 Where:筛选序列中的项目WhereNot:反筛选序列中的项目 二.投影运算符 Select:创建部分序列的 ...
- ASP.NET MVC IOC之Unity攻略
ASP.NET MVC IOC之Unity攻略 一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先 ...
- 根据首尾字节的tcp分包断包算法
这个算是我的一点小总结吧,放出来分享给大家,原来在网上找这种算法都找了N久没找到,自己写也是走了许多弯路,就放出来遛一遛吧 大家将就这个看看, 这是其中的一个主要的方法,其余的我就不放出来了,其中的I ...
- Java基础之集合:概览
Java Basic->Collections->Overview 先抛一个问题,用一个类似树形的结构,介绍下 Java 的集合类数据结构:有哪些,从简单到复杂,有怎么样的继承关系. 下面 ...