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 表示从被调函数返回到主调函数继续执行,返回时可附 ...
随机推荐
- jQuery数字加减插件
jQuery数字加减插件 我们在网上购物提交订单时,在网页上一般会有一个选择数量的控件,要求买家选择购买商品的件数,开发者会把该控件做成可以通过点击实现加减等微调操作,当然也可以直接输入数字件数.本文 ...
- 布尔逻辑运算,goto语句
布尔逻辑 bool类型可以有两个值:true或者false. 布尔比较需要使用布尔比较运算符(关系运算符),下图:var1为布尔类型的变量,var2,var3则可以是不同类型.
- iPhone、iPad、iPadMini界面设计标准
一个:iPhone 4.0' Display: iPhone 5.iPhone 5S.iPhone 5C. 解析度:1136 * 960 设计标准參照下图iPhone5 3.5' Display: ...
- Excel和notepad++加之更换
1. 替换文本的内容Tab长度,粘合剂Excel有效的变革在列. 2. 替换空行.这里用到回车跟换行.回车\r使光标回到最左,换行\n使光标下移一行. 版权声明:本文博客原创文章,博客,未经同意,不得 ...
- 【SSRS】入门篇(一) -- 创建SSRS项目
原文:[SSRS]入门篇(一) -- 创建SSRS项目 在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目. 报表服务器项目用于创建在报表服务器中 ...
- Ubuntu 14.04 字体设置
ubuntu 14.04消息公布后,我迫不及待地安装和使用.不知道怎么搞的,整个系统彻底改变了字体.有罪,看. 后来.听说文泉驿米黑效果不错.就试了一下,确实还行. 以下是设置方法: 1.安装文泉驿米 ...
- linux中的"32位"与"64位"
linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...
- c#winform关闭窗口时触发的事件
用户关闭软件时,软件一般会给“是否确认关闭”的提示. 通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭:否则把FormClosingEventArgs 的 Cancel 属性设置 ...
- vijos1060 隔板法
排列组合问题 之前没有学过隔板法,随便学习了一下 其实挺好理解的 附上题解: 先只考虑一种球:因为有n个盒子每个盒子可以放任意多球,还可以空出来任意多球.所以可以考虑为n+1个盒子,最后一个盒子里面是 ...
- 2013.2.A&&3.A
半期考之后,磨磨蹭蹭的刷了两套长乐的模拟题[=-=我现在实在是不敢恭维自己的刷题速度]感觉貌似很久没有来这里喂食了,就顺便yy下题解好了 2013.2.A: ice :BFS和spfa都可以,我打了个 ...