Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1911471
  • 博文数量: 376
  • 博客积分: 2147
  • 博客等级: 大尉
  • 技术积分: 3642
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-06 10:47
文章分类

全部博文(376)

文章存档

2019年(3)

2017年(28)

2016年(15)

2015年(17)

2014年(182)

2013年(16)

2012年(115)

我的朋友

分类: LINUX

2012-03-09 11:41:00

  telnetd是一个telnet服务端程序

 

下载地址:

解压缩后进入busybox目录

make defconfig

make

make install

然后会生成 _install 目录,里面就是编译好的可执行文件

源码位于 ./networking/telnetd.c

 

程序流程图:

 

程序中非常重要的就是2个buf,位于struct tsession结构体之后


 socket接收到远端的数据,写入count个字节到buf1中从rdidx1开始的空闲区域,然后size1 += count;rdidx1 += count;
pty可以写,从buf1中读取count个字节写入pty,然后size1 -= count;wridx1 += count;
pty可以读,写入count个字节到buf2中从rdidx2开始的空闲区域,然后size2 += count;rdidx2 += count;
socket可以发送数据到远端,从buf2中wridx2开始的位置读取count个字节,通过socket发送出去,然后size2 -= count;wridx2 += count;


make_new_session函数非常关键,它调用xgetpty打开一个伪终端,调用vfork创建一个子进程,父进程保存打开的伪终端和相关句柄
后返回,子进程调用setsid,关闭标准输入,打开伪终端,然后将0重定向到标准输出和标准错误,然后执行/bin/login,login执行
验证过程后启动shell程序。
以后只要父进程往获得的伪终端句柄里面写数据,就是把输入写到子进程启动的shell里面,shell执行之后,父进程通过read读取伪
终端句柄,就可以读取到shell的标准输出。

static struct tsession * make_new_session { struct tsession *ts = xzalloc fd = xgetpty(tty_name); ts->ptyfd = fd; pid =vfork(); if(pid > 0) { //父进程 return ts; } //子进程 setsid(); //设置SID close(0); //关闭标准输入 xopen(tty_name, O_RDWR); //打开伪终端,注意这个时候默认返回的是数字号最小的句柄,也就是0 dup2(0,1); //将伪终端句柄重定向到标准输出 dup2(0,2); //将伪终端句柄重定向到标准错误 execvp("/bin/login",); //执行/bin/login _exit(EXIT_FAILURE); //之后直接退出 }
阅读(10456) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~