设计Unix下木马程序

简介:
不拘一个遍程序系列程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。
我的诗歌:都是我的打油诗,但是很值得一读。不要工作还衣食无忧之四难歌   香格里拉美人图
宝宝图片:超可爱的小宝宝 博客
考试培训:主要是关于考研、软考和等级的相关题解。2009考研试题分析   2008年12月程序员试题分析    2009年软考备考全攻略    2008年5月程序员试题解析  轻松写系分论文
 
 
 
 

精通Unix下C语言编程与项目实践之

19 分布式应用技术之远程调用模型

作者:朱云翔,胡平
 
在网络时代的生产实践中,提供服务往往是分布式地,而单个主机系统,也经常需要调用其它主机系统的服务。比如出于安全性考虑,某些数据库系统常常被限制为只能在某台(几台)主机上直接访问,这样就只有部分主机(暂时称之为数据库主机)能够访问和操作数据库。其它主机(暂时称之为远程主机)就必须调用数据库主机提供的服务才能完成数据库操作,这个远程调用的流程一般为:向数据库主机建立套接字连接,并发送访问申请。数据库主机接收这些申请,并校验远程主机的合法性,再向数据库转发操作请求,最后把数据库操作结果返回给远程主机。整个过程对于用户来说是透明的,就好像远程主机直接访问了数据库一样。
远程调用就是指本地主机运行网络中另外一台计算机上某程序、函数或服务,就如同在本机上运行一样,以上关于数据库的访问就是远程调用的一个例子。远程调用也使用了客户机-服务器模型,发送本地请求的主机是客户机,网络中另外一台实际运行进程或服务的主机就是服务器。
本章将设计一个远程调用的模型,在服务器端运行一个进程,这个进程接收客户端发送的shell请求,通过安全性验证后在服务器端运行这个shell,并将输出结果转发到客户端。

19.1 系统分析

本项目实际上是运行在服务器端的一个程序,它接收客户申请、执行shell命令、将shell输出结果转发到客户端,那么在设计项目前必须解决如下问题:

1. 接收客户端请求

服务器端如何接收并处理客户申请,包括采用什么样的通信发送,选择并发处理流程还是串行处理流程等。

2. 执行shell命令

服务器端如何运行客户请求的shell命令,选择何种方式在进程中执行其它的程序,供选择的答案有systemfork-execpopen

3. 获取运行的shell输出结果

由于服务器需要把进程运行时的输出结果返回给客户端,那么就必须考虑如何获取正在运行的shell进程的输出结果。
事实上新进程的执行可以选择以下两种方案:
(1) systemfork-exec
在此方案下,服务进程无法交互式的获取shell进程的输出信息,但可以通过输入输出重定向,将shell进程的输出写入到一个文件中,待shell进程执行完毕后读取该文件,并将其内容发送给客户端即可。
(2) popen
以管道的方式创建新进程执行shell命令,设置函数popen的参数type为“r”,就可以及时获取shell进程的输出信息了。
1. popen执行命令szCmd,并将命令szCmd的输出结果打印到stderr中。
FILE *pfile;                       
char szLine[8192 + 1];
pfile = popen(szCmd, "r");          /* 创建管道、执行shell命令 */
while (fgets(szLine, sizeof(szLine), pfile) != NULL)    /* 读取输出结果 */
{
    PrintLog(stderr, szLine);       /* 打印输出结果 */
}
pclose(pfile);                      /* 结束shell进程,关闭管道 */
与采用systemfork-exec方式相比,采用popen方式执行shell命令不但设计简单,而且可以直接、及时地读取到命令的输出结果。因此,本项目以多进程并发套接字模式接收客户端的请求,并采用popen交互地执行新进程。
 

 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/142510,如需转载请自行联系原作者



相关文章
|
监控 网络协议 Unix
go程序报错Unix syslog delivery error
记录一下问题出错原因

相关课程

更多