rootkit for linux 19.山寨tcpip协议栈--连接的建立和初始化.doc

来源:互联网 发布:json解析网页 编辑:程序博客网 时间:2024/05/20 16:01

前言

 

 

 

今天上网看新闻,发现饭岛爱自杀了。顿时感慨不已。原来金融危机,不只是影响搞技术的,还影响了第三产业。

看了下她的照片,还是很不错的一个mm

鲁迅说过:有的人活着,但他却死了。有的人死了,但她却活在人们的硬盘里。

当然,本篇文章的重点不是讨论饭岛爱,或是鉴赏她的精彩影片。本文要对山寨tcpip协议的代码的连接建立和初始化部分,作一个注释。

 

数据包的接收与过滤

 

以前说过,我们的数据包截获,是在handle_incoming_skb里(文件skb.s)。在handle_incoming_skb里,我们又把数据交给函数netif_input处理(文件tcpip.s)。

netif_input的开头,我们对数据包进行了过滤。其实过滤非常简单。只是检查以太网头的协议字段是不是ipip头的协议字段是不是tcpip头的来源地址字段是不是我们规定的客户端ip地址,tcp头的目标端口字段是不是我们的rootkit所占用的端口。小学一年级的人都看得懂这段代码,对吧。

这里再说一下,我们的rootkit是只允许有一个客户端的。目前还没打算支持多个客户端。如果你的rootkit被不止一个人上过,那不成公共汽车了么,谁都可以上,多恶心啊。

 

LISTEN -> SYN_RCVD

 

spin_lock这个函数要说明一下。这函数在linux内核里是很常见的,自旋锁嘛。不过我们的rootkit里,就不是调用linux内核里的自旋锁api了,因为我们的山寨版自旋锁比较简单,这个是我自己定义的一个宏(文件asm.S)。

eth_tcpip_hdr_lock就是对应的自旋锁,实际上就是4字节的空间。

 

eth_tcpip_hdr这是一个缓冲区,用来存放以太网头+ip+tcp头的。因为我们每次给客户端发包的时候,这三个头的内容大体一样。我们就把它缓冲起来,不用每次都处理了。

 

可以看出我们对LISTEN -> SYN_RCVD的处理,只是改变了一下ack字段,然后自己设定了seq字段的内容。为什么能自己设定呢?因为,我们在wireshark里看到它显示出来的“ack=xxx”,其实是一个相对值。你留意一下各个包里面,tcp头的ack, seq字段对应的那几个字节就知道什么是相对了。

我们发送了一个seq = 0ack = 1的包。

 

netif_send_packet函数就是发送数据的函数,以后再介绍。

 

SYN_RCVD -> ESTABLISHED

 

save_eth_tcpip_hdr这个函数就是保存三个头的内容到缓冲区。

SYN_RCVD -> ESTABLISHED的时候,我们进行了相关变量的初始化。这些变量,我们要说明一下。

 

前面提到过我们对接收数据的处理比较简单,没有使用接收队列,与接收相关的变量只有next_seq_recvfirst_seq_recv

first_seq_recv是接收到的第一个数据包的seq值。是经过了big endianlittle endian的转换。那啥是big endian呢?哎,问这问题的人应该拉出去,tjjtds。前篇文章好像才提到过的。

next_seq_recv是下一个数据包的seq值。我们是可以预测到的,因为我们在接收到数据包的时候,会根据该数据包的长度,更新next_seq_recv的值。

我们将导致SYN_RCVD -> ESTABLISHED的这一个数据包看作第一个数据包。

 

前面提到过我们对发送数据的处理,就稍微麻烦点,用了发送队列。所以与发送相关的变量是netif_tx_ring数据结构,它有几个字段: send_idxsend_seqcons_idxcons_offsetcons_ackprod_idx

发送队列是一个循环队列。一般的循环队列有一个消费者指针,一个生产者指针。有的人喜欢说队首,队尾。cons_idxcons_offset就是消费者指针,prod_idx就是生产者指针。有人问,咋还多出了一个第三者send_idx呢?留点悬念,后面再说。

send_seq记录的发出去的最后一个包的seq

cons_ack这个字段,还是后面再说吧。

 

总结

 

看到这里,有人开骂了:“tmdx,你咋啥都等到后面再说啊。”

先听我讲个冷笑话:

 

从前有个精神病人,他拿着一把枪,绑架了一个医生。

他拿枪对着医生,问:“1+1等于几?”

医生颤抖着回答:“2”。

但他还是开枪了。

他说:“你知道的太多了”

 

所以,这个笑话告诉我们。有时候知道太多东西,不是件好事情。

有些东西我还是等到后面再说吧。现在正要考试呢。要考操作系统、软件建模、软件需求、数据库系统。你丫知道挂科的后果吗?你丫知道老师一个班挂多少人吗?你丫知道一个学分学校赚多少钱吗?

 

原创粉丝点击