网站大量收购独家精品文档,联系QQ:2885784924

raw soct编程.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
raw soct编程

前几天看了看第一卷,为了加深理解,便写了几个简单的程式,最近好忙,不过又怕忘记前面所学的知识,就粗糙的整理了一下,贴出来,希望能给初学者以指导,同时借助CU的论坛做个备份,呵呵. 内容安排: 1.原始套接字介绍 ??1.1 原始套接字工作原理和规则 ??1.2 简单应用 2 FTP密码窃取器实现(简单的rootkit) ??2.1 设计思路 ??2.2 实现 ??2.3 不足和改进之处 开始,嗯,喝口茶水先........... 1.原始套接字(raw socket) ??1.1 原始套接字工作原理和规则 ? ?? ?? ?原始套接字是个特别的套接字类型,他的创建方式跟TCP/UDP创建方法几乎是 一摸相同,例如,通过 CODE: [Copy to clipboard] ? ?? ? int sockfd; ? ?? ? sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);这 两句程式你就能创建一个原始套接字.然而这种类型套接字的功能却和TCP或UDP类型套接字的功能有非常大的不同:TCP/UDP类型的套接字只能够访 问传输层及传输层以上的数据,因为当IP层把数据传递给传输层时,下层的数据包头已被丢掉了.而原始套接字却能访问传输层以下的数据,,所以使用 raw套接字你能实现上至应用层的数据操作,也能实现下至链路层的数据操作. ? ?? ?? ?比如:通过 CODE: [Copy to clipboard] sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))方式创建的raw socket就能直接读取链路层的数据. 1)使用原始套接字时应该注意的问题(参考及网上的优秀文件) (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一个简单的应用 ? ? 下面的代码创建一个直接读取链路层数据包的原始套接字,并从中分析出源MAC地址和目的MAC地址,源IP和目的IP,及对应的传输层协议,如果是TCP/UDP协议的话,打印其目的和源端口.为了方便阅读,程式中避免了使用所有和协议有关的数据结构,如 struct ether_header ,struct iphdr??等

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档