文档详情

raw socket编程例子.pdf

发布:2018-04-08约1.27万字共11页下载文档
文本预览下载声明
rawsocket rawsocket rraawwssoocckkeett编程例子 内容安排: 1.原始套接字介绍 1.1 原始套接字工作原理与规则 1.2 简单应用 2FTP密码窃取器实现(简单的rootkit) 2.1 设计思路 2.2 实现 2.3 不足与改进之处 开始,嗯,喝口茶水先 1. (rawsocket) 1. (rawsocket) 11..原始套接字((rraawwssoocckkeett)) 1.1 1.1 11..11 原始套接字工作原理与规则 原始套接字是一个特殊的套接字类型,它的创建方式跟TCP/UDP 创建方法几乎是 一摸一样,例如,通过 CODE: int sockfd; sockfd=socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP); 这两句程序你就可以创建一个原始套接字.然而这种类型套接字的功能却与TCP 或者UDP 类型套接字的功能有很大的不同:TCP/UDP类型的套接字只能够访问传输层以及传输层以上 的数据,因为当IP层把数据传递给传输层时,下层的数据包头已经被丢掉了.而原始套接字却 可以访问传输层以下的数据,,所以使用raw套接字你可以实现上至应用层的数据操作,也可以 实现下至链路层的数据操作. 比如:通过 CODE: sock= socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)) 方式创建的raw socket就能直接读取链路层的数据. 1) 1) 11))使用原始套接字时应该注意的问题(参考unix 网络编程以及网上的优秀文档) (1):对于UDP/TCP产生的IP数据包,内核不将它传递给任何原始套接字,而只是将这些数据交 给对应的UDP/TCP数据处理句柄(所以,如果你想要通过原始套接字来访问TCP/UDP或者其 它类型的数据,调用socket 函数创建原始套接字第三个参数应该指定为htons(ETH_P_IP),也 就是通过直接访问数据链路层来实现.(我们后面的密码窃取器就是基于这种类型的). (2):对于ICMP和EGP等使用IP数据包承载数据但又在传输层之下的协议类型的IP数据包, 内核不管是否已经有注册了的句柄来处理这些数据,都会将这些IP数据包复制一份传递给协 议类型匹配的原始套接字. (3):对于不能识别协议类型的数据包,内核进行必要的校验,然后会查看是否有类型匹配的原 始套接字负责处理这些数据,如果有的话,就会将这些IP数据包复制一份传递给匹配的原始 套接字,否则,内核将会丢弃这个IP数据包,并返回一个ICMP 主机不可达的消息给源主机. (4): 如果原始套接字bind绑定了一个地址,核心只将目的地址为本机IP地址的数包传递给原 始套接字,如果某个原始套接字没有bind 地址,核心就会把收到的所有IP数据包发给这个原 始套接字. (5): 如果原始套接字调用了 connect函数,则核心只将源地址为connect连接的IP 地址的IP 数据包传递给这个原始套接字. (6):如果原始套接字没有调用bind和connect函数,则核心会将所有协议匹配的IP数据包传递 给这个原始套接字. 2).编程选项 原始套接字是直接使用IP协议的非面向连接的套接字,在这个套接字上可以调用bind和 connect函数进行地址绑定.说明如下: (1)bind 函数:调用bind 函数后,发送数据包的源IP地址将是bind 函数指定的地址。如是不调 用 bind,则内核将以发送接口的主 IP 地址填充 IP 头. 如果使用 setsockopt 设置了 IP_HDRINCL(header including)选项,就必须手工填充每个要发送的数据包的源IP地址,否则, 内核将自动创建IP首部. (2)connetc函数:调用connect函数后,就可以使用write和send函数来发送数据包,而且内核将 会用这个绑定的地址填充IP数据包的目的IP 地址,否则的话,则应使用sendto或sendmsg函 数来发送数据包,并且要在函数参数中指定对方的IP地址。 综合以上种种功能和特点,我们可以使用原始套接字来实现很多功能,比如最基本的数据包分 析,主机嗅探等.其实也可以使用原始套接字作一个自定义的传输层协议. 1.2 1.
显示全部
相似文档