数据包的捕获与分析 文档.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
31 接口 struct pcap_if { struct pcap_if *next; // 下一个接口 char *name; // 接口名 char *description; struct pcap_addr *addresses; bpf_u_int32 flags; // 目前只支 PCAP_IF_LOOPBACK }; 网络安全编程技术 第 3 讲:数据包的捕获与分析 任德斌 2 本讲编程训练目标 编程实现一个协议分析器。该协议分析器将包 含以下几部分功能 : 1. 数据采集 —— 捕捉 Ethernet 网络数据包; 2. 解析 Ethernet 网数据帧头部的全部信息; 3. 解析 IP 数据包的头部信息; 4. 解析 TCP 和 UDP 包的头部信息; 3 主要内容 ? 用原始 Socket 抓包 ? 进行协议分析 ? 使用开发工具包 WinPcap 抓包 4 1. 用原始 Socket 抓包流程 1. 创建原始 Socket 2. 获取一个需要监听网络接口的 ip 地址,并 绑定(必须要显示绑定) 3. 设置网卡为混杂模式 4. 开始循环接收数据 5. 关闭 Socket 5 关键代码 1 : 创建原始 Socket SnifferSocket = socket(AF_INET, SOCK_RAW , IPPROTO_IP ); if (Result == SOCKET_ERROR) { printf(socket failed with error %d\n, WSAGetLastError()); return 0; } 6 原始 socket 的特点 ? 应用程序可以收到目标是其它主机的包 ? 应用程序会收到 ip 包 ? 如果设置 IP_HDRINCL 选项,可以手动设置 发送的 ip 包的头部 ? 不能拦截数据,因为系统采用的是拷贝的方 式 ? 由于安全原因,在 xp-sp2 , windows 7 中原 始 socket 的使用有限制: ? 不能发送 tcp 包 ? 不能使用伪造的原 ip 地址 7 关键代码 2 :绑定到一个本地 IP 地址 Result = gethostname(Name, 255); pHostent = (struct hostent*)malloc(sizeof(struct hostent)); pHostent = gethostbyname(Name); SOCKADDR_IN sock; sock.sin_family = AF_INET; sock.sin_port = htons(5555); memcpy(sock.sin_addr.S_un.S_addr, pHostent-h_addr_list[0], pHostent- h_length); Result = bind(SnifferSocket, (PSOCKADDR) sock, sizeof(sock)); 想 想看 这里端 口 号 有 没有 意义 , 这 个 值合不合适 一 定是 第一个 接 口 吗? 8 获取本地接口的更好方法 1. SOCKADDR_IN input; 2. char remoteip[]=8.8.8.8;// 可以是任意地址 3. short remoteport=80; 4. char buf[1024]; 5. input.sin_family = AF_INET; 6. input.sin_addr.s_addr = inet_addr(remoteip); 7. input.sin_port = htons(remoteport); 8. 9. Result = WSAIoctl (SnifferSocket, SIO_ROUTING_INTERFACE_QUERY , input, sizeof(input), buf, 1024, dwBytesRet, NULL, NULL); 10. SOCKADDR_IN *lpIf = (SOCKADDR_IN *)buf; 11. sock.sin_addr=lpIf-sin_addr; 9 关键代码 3 :设置为混杂模式 u_lo

文档评论(0)

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

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

1亿VIP精品文档

相关文档