使用DLPI来编写协议分析工具

合集下载

DLP数据防泄密使用说明

DLP数据防泄密使用说明

DLP数据防泄密使用说明DLP(Data Loss Prevention)是一种数据防泄密工具,用于保护组织的机密和敏感数据免受不当披露和丢失。

本文将提供有关DLP的详细说明,包括其功能、实施步骤和最佳实践。

I.功能DLP工具主要有以下功能:1.数据识别:通过扫描文档、电子邮件、数据库等存储库,DLP可以识别和分类机密和敏感数据,如财务数据、个人身份信息(PII)和知识产权。

2.数据监控:DLP可以实时监控数据传输,包括传入和传出的数据流量,以检测潜在的数据泄露或非授权访问。

3.数据屏蔽:DLP可以使用加密、模糊或脱敏等技术,对敏感数据进行保护,以防止未经授权的访问或使用。

4.数据审计与报告:DLP可以生成详细的数据使用和访问报告,以便管理人员跟踪数据的流向和使用情况,并及时发现潜在的安全风险。

II.实施步骤实施DLP需要经过以下步骤:1.风险评估:评估组织的数据资产、业务流程和潜在的安全风险,以制定适合的DLP策略。

2.策略定义:定义DLP策略,包括识别敏感数据的规则和条件、监控数据传输的策略和行为响应机制。

3.系统部署:将DLP工具部署到组织的网络环境中,并与其他安全系统(如防火墙和入侵检测系统)集成。

4.数据分类:对组织的数据进行分类和标记,以便DLP能够识别并监测敏感数据的流动。

5.定期维护与更新:定期更新DLP策略,并对系统进行维护和升级,以适应新的数据和安全要求。

III.最佳实践下面是一些使用DLP的最佳实践:1.全面覆盖:将DLP应用于组织的所有数据传输通道,包括电子邮件、文件共享、云存储和移动设备等。

2.定期教育培训:提供员工关于数据保护和安全意识的培训,并定期进行测试和评估。

3.多层次防护:与其他安全控制措施(如防火墙、入侵检测系统和网络安全扫描器)结合使用,形成多层次的防护。

4.网络和终端保护:在网络边界和终端设备上同时部署DLP,以确保数据在不同环境中的保护。

5.持续监测与优化:定期监测DLP系统的性能和准确性,并对策略进行修订和改进,以适应不断变化的威胁环境。

数据防泄密技术(DLP)

数据防泄密技术(DLP)

数据防泄密技术(DLP)1.DLP解决方案的类型与防护目标(1)DLP解决方案的类型数据泄漏防护(Data Leakage Prevention,DLP)指的是用于监控、发现和保护数据的一组新技术。

数据泄漏防护又称为数据泄密防护、数据防泄密技术。

目前各种DLP解决方案,通常分为3种类型:1)网络DLP:通过假设网络设备于主要网络边界之间,最常见的是企业网络和互联网之间,像一个数据网关。

网络DLP监控通过网关的流量,检测敏感数据或者与之相关的事情,发现异常时,阻止数据离开网络。

2)存储DLP:通过软件运行在一台设备上或直接运行在文件服务器上,执行类似网络DLP的功能。

存储DLP扫描存储系统寻找敏感数据。

发现异常时,可以删除、隔离数据或通知管理员。

3)终端DLP:软件运行在终端系统上监控操作系统活动和应用程序,观察内存和网络流量,以检测使用不当的敏感信息。

(2)DLP的防护目标网络DLP、存储DLP和终端DLP都有相当的防护作用,也有各自的局限性,最终的解决方案经常是混合使用,来满足以下部分或全部目标:1)监控:被动监控,报告网络流量和其他信息通信通道,如将文件复制到附加的存储。

2)发现:扫描本地或远程数据存储,对数据存储或终端上的信息进行分类。

3)捕获:捕获异常情况,并存储,以便事后分析和分类,或优化策略。

4)防护/阻塞:根据监控和发现组件的信息,阻止数据传输,或者通过中断网络会话或中断本地代理与计算机交互来阻断信息流。

DLP解决方案需要混合以上技术,还需要管理配置策略集中服务器,来定义哪些数据需要保护及如何保护。

2.DLP解决方案所面临的挑战在实际业务中,如果DLP解决方案没有监控到特定的存储设备或网段,或者某种特定的文件没有关联合适的策略,DLP解决方案便不能执行正确的保护,这意味着DLP技术的组件必须覆盖每个网段文件服务器、每个内容管理系统和每个备份系统,这显然不是容易的事情。

另外,配置DLP环境和策略是项艰巨的任务,忽视任何一个方面,都可能会导致整体DLP解决方案的失效。

基于DPI的应用层协议解析

基于DPI的应用层协议解析

基于DPI的应用层协议解析基于DPI(Deep Packet Inspection,深度数据包检测)的应用层协议解析是指通过深度分析网络流量数据包的内容,识别和解析传输协议的过程。

DPI能够深入到网络数据包的应用层,并且通过解析数据包的负载来识别不同的应用层协议。

这种技术被广泛应用于网络安全、网络优化和数据监控等领域。

本文将介绍基于DPI的应用层协议解析的原理、方法和应用。

一、基于DPI的应用层协议解析原理基于DPI的应用层协议解析是通过深度分析网络数据包,提取和解析数据包负载中的字节流,进而识别和解析传输协议的一种技术。

它可以识别和解析常见的Web协议(如HTTP、HTTPS)、FTP、SMTP、POP3、DNS、IMAP等应用层协议。

DPI技术可以通过以下几个步骤来实现应用层协议解析:1.数据包捕获:通过网络设备(如路由器、交换机)或专门的捕获设备(如网络监控器)捕获网络数据包。

2.数据包过滤:根据预设规则或特定的过滤条件,对捕获的数据包进行过滤,筛选出需要分析的数据包。

3.数据包重组:将网络数据包中的分片数据包重新组装成完整的数据包。

4.数据包解析:对重组后的数据包进行解析,提取数据包的头部信息和负载数据。

5.应用层协议识别:通过解析数据包的负载,提取特定的特征信息,并与预设的规则或特征进行匹配,识别出应用层协议。

6.协议解析:对识别出的协议进行进一步的解析,提取协议的参数、字段和状态信息。

二、基于DPI的应用层协议解析方法1.签名匹配:通过预设规则或特定的特征,将应用层协议的特征信息与数据包负载进行匹配,从而识别出应用层协议。

通常使用的是字符串匹配、正则表达式匹配等方法。

2.流量统计:通过统计数据包的流量特征,如数据包长度、频率、传输速率等指标,来推测和识别出应用层协议。

例如,HTTP协议通常使用明文传输,数据包长度较小;而视频流协议通常具有较大的数据包长度和较高的传输速率。

3.机器学习:通过构建机器学习模型,对数据包进行训练和分类,实现应用层协议的自动识别和解析。

五款常用协议分析处理工具推荐

五款常用协议分析处理工具推荐

五款常⽤协议分析处理⼯具推荐⼯欲善其事,必先利其器,⼀款好的⼯具,能取到事半功倍的效果。

进⾏协议分析,好的辅助⼯具必不可少,本⽂推荐五款最常⽤且易⽤的协议分析⼯具给⼤家,包括两款综合抓包及分析⼯具,⼀款协议重放⼯具,⼀款pcap编辑⼯具以及⼀款HTTP抓包分析⼯具,并附上了各⾃的下载地址,如果需要,可前往下载。

1、WireSharkWireShark 是⼀款免费开源的协议分析及抓包⼯具,带图形界⾯,原名Ethereal,⽬前版本为V2.4.2。

在⽹络协议抓包及分析中被⼴泛使⽤,可下载到windows、Linux、Unix及maxcOS等版本,当然也可以⾃⼰编译需要的版本。

WireShark ⽀持数百种协议的识别及解析,具备强⼤的过滤、统计及分析功能,并且有丰富的说明⽂档及技术资料供查阅和学习。

2、tcpdumptcpdump 是⼀个在命令⾏下使⽤的抓包⼯具,当前版本V4.9.2,⽤于Linux、Unix及maxcOS等系统下抓包,并且在当前流⾏的智能终端设备,包括Android及iOS⼿机中,也可使⽤,tcpdump可以使⽤各项参数进⾏抓包条件的设置,其语法与wireshark相同。

tcpdump同样具备丰富的帮助⽂档。

3、tcpreplaytcpreplay是⼀款开源的pcap包重放⼯具,当前版本V4.2.5,⽽不是抓包⼯具, 它可以将⽤wireshark等⼯具抓下来的包原样或经过任意修改后重放出去。

它可以根据要求对报⽂做任意的修改, 指定重放报⽂的速度等,从⽽复现抓包的情景以定位bug, 或者快速重放以进⾏压⼒测试。

tcpreplay包括⼀系列⼯具,如:tcpprep、tcprewrite、tcpreplay、tcpliveplay、tcpreplay-edit、tcpbridge、tcpcapinfo。

它们每个有不同功能,可以配合使⽤,以达到更好的使⽤效果。

4、WireEditWireEdit是omnipacket开发的⼀款可视化pcap报⽂编辑⼯具,⽀持windows、linux、macOS等操作系统,当前版本V1.10.118。

网络协议分析软件编写

网络协议分析软件编写

网络协议分析软件编写前一阵子要写一个简单的arp协议的分析程序,在翻阅了一些资料以后,决定使用libpcap库来实现,但是后来涉及到写链路层数据的缘故(另外一个程序,这个程序就是发送一个假冒的arp request,在本文没有实现,今后有空再吧),所以放弃了libpcap。

由于本人使用的是solaris环境,所以无法使用bpf,但是sun公司仍然为开发者提供了一个与设备底层无关的接口DLPI,DLPI的全称是Data Link Provider Interface,通过DLPI开发者可以访问数据链路层的数据包,在早期的sunos系统中基本上采用的是NIT设备,但是现在solaris系统都使用了DLPI.关于DLPI的具体介绍大家可以访问网站.opengroup/pubs/catalog/c811.htm,我这里就不多说了。

在搜索了许多资料之后发现目前关于DLPI的编程资料不多,没有具体的过程,后来翻阅了Neal Nuckolls写的一篇文章How toUse theSTREAMS DataLinkProviderInterface(DLPI),根据例子做了修改(主要是提供了协议分析的部分),现在把编写一个DLPI过程共享一下,希望能对大家有所帮助。

建议大家可以先看看Neal Nuckolls的文章,其中有部分涉及到流编程的,可以参考docs.sun./app/docs/doc/816-4855的streams programmingguide(不过这不是必须的)。

使用DLPI来访问数据链路层有几个步骤1、打开网络设备2、将一个流attach到一个特定的设备上,这里就是我们刚才打开的设备3、将设备设置为混杂模式(可选)4、把数据链路层sap绑定到流5、调用ioctl,设置raw模式6、配置其他模块(可选)7、刷新缓存8、接收数据进入分析阶段第一步,我们首先打开一个网络设备,在本例中我们打开的是/dev/bge设备,这是本机的网络接口,注意不是/dev/bge0,通过open调用打开,并且返回一个描述符fd=open(device,2)第二步,attach一个流到设备上,这是通过发送DL_ATTACH_REQ原语来完成的dlattachreq(fd,ppa)int fd;u_long ppa;{dl_attach_req_t attach_req;struct strbufctl;intflags;attach_req.dl_primitive=DL_ATTACH_REQ;attach_req.dl_p pa=ppa;ctl.maxlen=0;ctl.len=sizeof(attach_req);ctl.buf=(cha r*)&attach_req;flags=0;if(putmsg(fd,&ctl,(structstrbuf*)NULL,flags)使用DLPI编程并不难,关键在于大家要了解它的框架,没必要非得自己去写一个框架来,本文就是利用了Michael R.Widner的代码,今后如果要增加功能只需要往这个框架里填就可以了。

DLP技术及产品概述

DLP技术及产品概述

DLP技术及产品概述背景介绍数据泄漏(Data Leakage)是指在未经授权的情况下,敏感信息从一处或多处转移到未经授权的接收方,这可能导致重大的风险和损失。

随着企业面临越来越多的信息安全威胁,数据泄漏防护变得尤为重要。

因此,数据泄漏防护技术(Data Loss Prevention, DLP)应运而生。

DLP技术旨在通过监控、检测和阻止敏感数据的非法传输和使用,保护企业的敏感信息。

本文将介绍DLP技术的原理、功能和常见的产品。

DLP技术原理DLP技术主要基于以下几个原理:1.内容过滤:通过分析文本、图像和其他文件类型的内容,识别出敏感信息。

内容过滤可以基于关键字、正则表达式、机器学习等多种方式进行。

2.上下文识别:通过分析数据传输的上下文环境,如用户身份、传输渠道、目标系统等,来判断数据传输的合法性。

例如,在阻止公司员工将机密数据发送到个人电子邮件地址时,DLP可以分析发件人和收件人的身份,并根据事先设定的策略进行决策。

3.行为分析:通过分析用户的行为模式,检测出异常活动和数据泄漏行为。

当用户异常地大量复制、下载或转移敏感数据时,DLP可以发出警报或自动阻止这些活动。

DLP技术功能DLP技术通常包含以下核心功能:1.数据发现和分类:通过扫描企业网络和存储设备,发现、识别并分类敏感数据。

这些数据可以是个人身份信息(如身份证号码、银行账号)、公司内部机密文件或其他敏感信息。

2.数据监控与阻止:对数据传输进行实时监控,并识别传输中的敏感数据。

一旦发现违规传输,DLP可以立即采取行动,如阻止传输、发送警报或记录日志。

3.数据加密和解密:DLP系统可以对敏感数据进行加密,确保在传输过程中即使被截获,也无法被恶意使用者解读。

4.网络流量分析:通过监控网络流量,识别潜在的数据泄漏风险和异常活动。

5.安全策略和访问控制:DLP系统可以根据企业设定的安全策略,对用户和系统进行访问控制。

这有助于减少内部威胁和未经授权的数据访问。

用协议P分析工具学习TCP-I

用协议分析工具学习TCP/IP一、前言目前,网络的速度发展非常快,学习网络的人也越来越多,稍有网络常识的人都知道TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天。

目前号称搞网的人非常多,许多人就是从一把夹线钳,一个测线器联网开始接触网络的,如果只是联网玩玩,知道几个Ping之类的命令就行了,如果想在网络上有更多的发展不管是黑道还是红道,必须要把TCP/IP协议搞的非常明白。

学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了。

下面将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体传输过程。

为了更容易理解,将搭建一个最简单的网络环境,不包含子网。

二、试验环境1、网络环境图1如图1所示,为了表述方便,下面208号机即指地址为192.168.113.208的计算机,1号机指地址为192.168.113.1的计算机。

2、操作系统两台机器都为Windows 2000 ,1号机机器作为服务器,安装FTP服务3、协议分析工具Windows环境下常用的工具有:Sniffer Pro、Natxray、Iris以及windows 2000自带的网络监视器等。

下面选用Iris作为协议分析工具,在客户机208号机安装IRIS软件。

三、测试过程1、测试例子:将1号机计算机中的一个文件通过FTP下载到208号机中。

2、IRIS的设置。

由于IRIS具有网络监听的功能,如果网络环境中还有其它的机器将抓很多别的数据包,这样为学习带来诸多不便,为了清楚地看清楚上述例子的传输过程首先将IRIS设置为只抓208号机和1号机之间的数据包。

设置过程如下:1)用热键CTRL+B弹出如图所示的地址表,在表中填写机器的IP地址,为了对抓的包看得更清楚不要添主机的名字(name),设置好后关闭此窗口。

图22)用热键CTRL+E弹出如图所示过滤设置,选择左栏“IP address”,右栏按下图将address book中的地址拽到下面,设置好后确定,这样就这抓这两台计算机之间的包。

dlp解决方案

DLP解决方案概述数据泄漏是当今企业面临的一项重大挑战。

为了保护企业的敏感数据,许多组织已经采取了数据丢失防护(DLP)解决方案。

本文将介绍DLP解决方案,包括其定义、原理、组成部分以及实施过程。

此外,还将讨论DLP解决方案的优势和挑战。

DLP解决方案的定义DLP解决方案是一种设计用于防止敏感数据泄漏的安全措施。

敏感数据可以包括客户信息、财务记录、员工数据、知识产权等。

DLP解决方案通过监视、检测和阻止数据流动,确保敏感数据不会无意或恶意地传输、存储或使用。

DLP解决方案的原理DLP解决方案的工作原理基于以下几个核心方面:1.数据分类:DLP解决方案通过对数据进行分类,识别和标记敏感数据。

这可以通过规则引擎、关键字搜索、正则表达式等技术实现。

2.数据监视:DLP解决方案监视数据流向,包括内部网络、终端设备和云存储服务。

它可以检测数据在传输过程中是否满足安全要求,例如加密和身份验证。

3.数据阻止:DLP解决方案可以基于预定义的规则或策略,阻止敏感数据的传输、复制或存储。

当检测到违反规则的数据流动时,可以采取自动或手动的行动,例如中断传输、发送警报或生成报告。

4.数据加密:DLP解决方案可以提供数据加密功能,确保敏感数据在传输和存储过程中得到保护。

这可以通过使用数据加密算法和密钥管理技术来实现。

DLP解决方案的组成部分DLP解决方案通常由以下几个组成部分构成:1.网络监视器:用于监视企业网络中的数据流向和传输情况。

2.终端代理:安装在终端设备上的软件代理,用于监视和控制敏感数据的传输和存储。

3.数据分类工具:用于识别和标记敏感数据的工具,可以基于关键字、模式匹配、机器学习等技术进行。

4.制定规则和策略的引擎:用于定义和执行数据传输和存储的规则和策略。

5.报告和警告系统:用于记录安全事件并生成报告,并在敏感数据泄漏时发送警报。

DLP解决方案的实施过程实施DLP解决方案需要以下几个步骤:1.识别敏感数据:确定需要保护的敏感数据类型和位置。

亿赛通数据泄漏防护(DLP)方案交流

•IT行业
上海路歌信息技术有限公司 上海扬讯计算机科技有限责任公司 郴州高斯贝尔数码科技有限公司 深圳市飞毛腿软件技术有限公司 深圳市天讯龙软件技术有限公司 上海艾未软件科技有限公司 山东某科技公司
电子行业
深圳市聚作实业有限公司 深圳市捷电科技有限公司 深圳市浩科电子有限公司
石化行业
山东红星化工有限公司
Copyright © 2009 By E-SAFENET S&T Co. Ltd.
亿赛通部分用户
•政 府
中华人民共和国外交部 国务院办公厅信息办 国家监察部 国家气象局
•部 队
中国人民解放军空军 中国人民解放军第二炮兵
•通 信
深圳国人通信有限公司 宇龙通信技术有限公司 飞利浦(中国)投资有限公司 晨讯科技集团有限公司 德信无线通讯科技有限公司 北京达成无限技术有限公司
•汽车、汽车配件
中国第一汽车集团公司 河北天马汽车有限公司 河北长安汽车有限公司 简式国际汽车设计(北京)有限公司 联合汽车电子有限公司
中国人民解放军总参某部 中国人民解放军空军司令部某部 中国人民解放军海军总装备部
•设计研究
太原市规划局 工业和信息化部电子第五研究所 山西水利水电勘察设计院 上海核工程研究设计院 太原市城市规划设计研究院 北京市城市规划设计院 上海加合建筑设计有限公司
DLP产品线综述
亿赛通数据泄露防护(Data Leakage Prevention,DLP)体系采用分域安全理论,将网 络分为终端、端口、磁盘、服务器和局域网五大安全域,并以笔记本电脑、移动存储设备、数 据库为安全域特例,针对各个安全域及特例实施相应安全策略,形成终端文档加解密、端口管 理、全磁盘加密、文档安全网关、安全U盘、安全移动硬盘等一系列DLP产品,在确保网络各 个节点数据安全的基础上,构建整体一致的立体化DLP解决方案。

dlprof的使用命令 -回复

dlprof的使用命令-回复以下是有关使用dlprof的命令的详细介绍。

dlprof是一种性能分析工具,用于对深度学习模型进行分析和优化。

它可以帮助开发人员了解模型在不同层次上的运行情况,提供了有关模型性能瓶颈的信息。

使用dlprof命令,您可以收集关于模型运行的各种度量、参数和数据,以及对其进行分析和解释。

以下是使用dlprof的一些常用命令和示例:1. dlprof collect:此命令用于收集模型执行的度量和参数。

通过收集这些信息,您可以了解模型的整体性能,并识别潜在的优化机会。

例如,以下命令将收集模型执行的度量和参数,并将结果保存在profiling.json文件中:dlprof collect -o profiling.json python your_script.py2. dlprof analyze:此命令用于分析收集的度量和参数,并生成可视化报告。

通过分析报告,您可以更深入地了解模型的性能特征,并确定性能瓶颈。

例如,以下命令将分析profiling.json文件,并生成一个名为report.html的报告:dlprof analyze -i profiling.json -o report.html在报告中,您可以查看模型的整体性能指标,如运行时间、内存使用等。

您还可以查看每个层次的性能统计信息,并根据需要进行进一步的分析和优化。

3. dlprof visualize:此命令用于可视化模型执行的度量和参数。

它提供了一种直观的方式来查看模型的性能特征,并帮助您发现潜在的优化机会。

例如,以下命令将可视化profiling.json文件,并生成一个名为visualization.html的可视化报告:dlprof visualize -i profiling.json -o visualization.html在可视化报告中,您可以使用交互式的图表和图像来查看模型的性能特征。

您可以通过缩放和选择特定的时间窗口来更详细地查看性能瓶颈。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[保留] 使用DLPI来编写协议分析工具 作者:stevens_wu发表于:2007-12-13 17:10:35 【发表评论】【查看原文】【C/C++讨论区】【关闭】系统环境:solaris 10 for x86,gcc 3.4.3,100M快速以太网(偶是个初学者,本文难免存在错误,希望大家多多指教)前一阵子要写一个简单的arp协议的分析程序,在翻阅了一些资料以后,决定使用libpcap库来实现,但是后来涉及到写链路层数据的缘故(另外一个程序,这个程序就是发送一个假冒的arp request,在本文没有实现,今后有空再整理吧),所以放弃了libpcap。

由于本人使用的是solaris环境,所以无法使用bpf,但是sun公司仍然为开发者提供了一个与设备底层无关的接口DLPI,DLPI的全称是Data Link Provider Interface,通过DLPI开发者可以访问数据链路层的数据包,在早期的sunos系统中基本上采用的是NIT设备,但是现在solaris系统都使用了DLPI.关于DLPI的具体介绍大家可以访问网站/pubs/catalog/c811.htm,我这里就不多说了。

在搜索了许多资料之后发现目前关于DLPI的编程资料不多,没有具体的过程,后来翻阅了Neal Nuckolls写的一篇文章How to Use the STREAMS Data Link Provider Interface (DLPI),根据例子做了修改(主要是提供了协议分析的部分),现在把编写一个DLPI过程共享一下,希望能对大家有所帮助。

建议大家可以先看看Neal Nuckolls的文章,其中有部分涉及到流编程的,可以参考/app/docs/doc/816-4855的streams programming guide(不过这不是必须的)。

使用DLPI来访问数据链路层有几个步骤:1、打开网络设备2、将一个流 attach到一个特定的设备上,这里就是我们刚才打开的设备3、将设备设置为混杂模式(可选)4、把数据链路层sap绑定到流5、调用ioctl,设置raw模式6、配置其他模块(可选)7、刷新缓存8、接收数据进入分析阶段第一步,我们首先打开一个网络设备,在本例中我们打开的是/dev/bge设备,这是本机的网络接口,注意不是/dev/bge0,通过open调用打开,并且返回一个描述符fd=open(device, 2)第二步,attach一个流到设备上,这是通过发送DL_ATTACH_REQ原语来完成的dlattachreq(fd, ppa)int fd;u_long ppa;{dl_attach_req_t attach_req;struct strbuf ctl;int flags;attach_req.dl_primitive = DL_ATTACH_REQ;attach_req.dl_ppa = ppa;ctl.maxlen = 0;ctl.len = sizeof (attach_req);ctl.buf = (char *) &attach_req;flags = 0;if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)syserr("dlattachreq: putmsg");}dl_attach_req_t是一个定义在dlpi.h中的结构体,我们通过填写结构体来发布原语,putmsg将消息发送到一个流,以上这个函数是DLPI中发布原语的主要格式发布了DL_ATTACH_REQ原语之后,还要确认是否成功,dlokack(fd, bufp)int fd;char *bufp;{union DL_primitives *dlp;struct strbuf ctl;int flags;ctl.maxlen = MAXDLBUF;ctl.len = 0;ctl.buf = bufp;strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");dlp = (union DL_primitives *) ctl.buf;expecting(DL_OK_ACK, dlp);if (ctl.len < sizeof (dl_ok_ack_t))err("dlokack: response ctl.len too short: %d", ctl.len);if (flags != RS_HIPRI)err("dlokack: DL_OK_ACK was not M_PCPROTO");if (ctl.len < sizeof (dl_ok_ack_t))err("dlokack: short response ctl.len: %d", ctl.len);}第三步,将设备设置为混杂模式下工作(可选)dlpromisconreq(fd, DL_PROMISC_PHYS);这一个步骤也是通过发布DLPI原语来实现的,具体代码后面给出第四步,绑定流dlbindreq(fd, sap, 0, DL_CLDLS, 0, 0);dlbindack(fd, buf);第五步,设置raw模式strioctl(fd, DLIOCRAW, -1, 0, NULL)第六步,配置其他模块(在详细代码中给出)第七步,刷新数据,这是通过ioctl调用实现的ioctl(fd, I_FLUSH, FLUSHR)第八步,这是我们最关心的步骤,实际上,前面的这些步骤我们都可以忽略,大致明白有这么个过程就可以了,到时候写代码的时候照搬这个框架就可以。

使用DLPI 编程并不难,关键在于大家要了解它的框架,没必要非得自己去写一个框架来,本文就是利用了Michael R. Widner的代码,今后如果要增加功能只需要往这个框架里填就可以了。

协议分析的过程是在函数filter完成的,函数申明如下void filter(register char *cp,register u_int pktlen);该函数接收两个参数,cp是直接从设备缓存里拷贝过来的待分析数据,是链路层的封装数据,pktlen是数据的长度。

在本文中由于操作环境是以太网,因此接收的数据链路层数据是以太网封装格式,如不清楚以太网封装的可以参考《TCP/IP详解卷一:协议》,以太网封装三种标准的协议类型:IP协议、ARP协议和RARP协议。

14字节的以太网首部包括了6字节的目的地址,6字节的源地址和2字节的类型字段,IP的类型值为0x0800,ARP的类型值为0x0806,RARP的类型值为0x8035。

通过检查类型字段来区别接收到的数据是属于哪一种协议,函数实现代码如下void filter(cp, pktlen)register char *cp;register u_int pktlen;{register struct ip *ip;register struct tcphdr *tcph;register struct ether_header *eth;char *head=cp;static long line_count=0;//计数器,用来记录接收的数据次数u_short EtherType=ntohs(((struct ether_header *)cp)->;ether_type);//如果EtherType小于0x600说明这是一个符合802.3标准的数据格式,应当对数据作出调整if(EtherType < 0x600) {EtherType = *(u_short *)(cp + SZETH + 6);cp+=8; pktlen-=8;}eth=(struct ether_header*)cp;fprintf(LOG,"%-5d",++line_count);if(EtherType == ETHERTYPE_IP) //检查协议类型是否IP协议{ip=(struct ip *)(cp+SZETH);//调整指针的位置,SZETH是以太网首部长度 Mac_info(&eth->;ether_shost);//Mac_info函数打印出物理地址fprintf(LOG,"(");Ip_info(&ip->;ip_src);//Ip_info函数打印出IP地址fprintf(LOG,")");fprintf(LOG,"--->;");Mac_info(&eth->;ether_dhost);fprintf(LOG,"(");Ip_info(&ip->;ip_dst);fprintf(LOG,")");fprintf(LOG,"\n");}else if(EtherType == ARP_PROTO)//如果协议类型是ARP{cp+=SZETH;struct ether_arp *arp=(struct ether_arp *)cp;switch(ntohs(arp->;ea_hdr.ar_op))//检查arp的操作{case ARPOP_REQUEST: //如果是arp请求fprintf(LOG,"arp request:who has ");arp_ip_info(arp->;arp_tpa); //打印arp报文信息中的地址fprintf(LOG," tells ");arp_ip_info(arp->;arp_spa);fprintf(LOG,"\n");break;case ARPOP_REPLY: //arp应答fprintf(LOG,"arp reply: ");arp_ip_info(arp->;arp_spa);fprintf(LOG," is at ");Mac_info((struct ether_addr*)&arp->;arp_sha);fprintf(LOG,"\n");break;}//可以在这里添加代码打印出arp数据报的具体内容}}程序的具体实现代码如下:/* 程序sniffer.c的代码清单 */#include <sys/stream.h>;#include <sys/dlpi.h>;#include <sys/bufmod.h>;#include <stdio.h>;#include <ctype.h>;#include <string.h>;#include <sys/time.h>;#include <sys/file.h>;#include <sys/stropts.h>;#include <sys/signal.h>;#include <sys/types.h>;#include <sys/socket.h>;#include <sys/ioctl.h>;#include <net/if.h>;#include <net/if_arp.h>;#include <netinet/in.h>;#include <netinet/if_ether.h>;#include <netinet/in_systm.h>;#include <netinet/ip.h>;#include <netinet/udp.h>;#include <netinet/ip_var.h>;#include <netinet/udp_var.h>;#include <netinet/in_systm.h>;#include <netinet/tcp.h>;#include <netinet/ip_icmp.h>;#include <netdb.h>;#include <arpa/inet.h>;#define MAXDLBUF 32768#define MAXWAIT 15#define MAXDLADDR 1024#define BITSPERBYTE 8#define bcopy(s1, s2, len) memcpy(s2, s1, len)#define index(s, c) strchr(s, c)#define rindex(s, c) strrchr(s, c)#define bcmp(s1, s2, len) (memcmp(s1, s2, len)!=0) #define ERR stderrchar *device,*ProgName,*LogName;FILE *LOG;int debug=0;long databuf[MAXDLBUF];int sap=0;#define NIT_DEV "/dev/bge"#define CHUNKSIZE 4096int if_fd = -1;int Packet[CHUNKSIZE+32];int promisc = 1;int bufmod = 0;int filter_flags=0;int maxbuflen=128;void Pexit(err,msg)int err; char *msg;{ perror(msg);exit(err); }void Zexit(err,msg)int err; char *msg;{ fprintf(ERR,msg);exit(err); }#define ARP_PROTO (0x0806)#define IP ((struct ip *)Packet)#define IP_OFFSET (0x1FFF)#define SZETH (sizeof(struct ether_header)) #define ARPLEN (sizeof(struct ether_arp))#define MACLEN (6)#define IPALEN (4)#define IPLEN (ntohs(ip->;ip_len))#define IPHLEN (ip->;ip_hl)#define INET_ADDRSTRLEN 16#define MAXBUFLEN (8192)time_t LastTIME = 0;char *Ptm(t)register time_t *t;{ register char *p = ctime(t);p[strlen(p)-6]=0;return(p);}char *NOWtm(){ time_t tm;time(&tm);return( Ptm(&tm) );}void print_data(uchar_t *buf,int size){int i=0;char *p=buf;for(;i<size;i++){if(i%16 == 0) fprintf(LOG,"\n");if(i%2 == 0) fprintf(LOG," ");fprintf(LOG,"%02x",*p++&0x00ff);}fprintf(LOG,"\n");}//打印物理地址void Mac_info(struct ether_addr*mac){fprintf(LOG,"%02x:%02x:%02x:%02x:%02x:%02x", mac->;ether_addr_octet[0],mac->;ether_addr_octet[1],mac->;ether_addr_octet[2],mac->;ether_addr_octet[3],mac->;ether_addr_octet[4],mac->;ether_addr_octet[5]);}//打印ip地址char buf[MAXDLBUF];void Ip_info(struct in_addr *ip){char str[INET_ADDRSTRLEN];inet_ntop(AF_INET,ip,str,sizeof(str));if(*str)fprintf(LOG,"%s",str);}//打印ip地址的另外一个版本void arp_ip_info(uchar_t pa[]){fprintf(LOG,"%d.%d.%d.%d",pa[0],pa[1],pa[2],pa[3]); }void death(){ register struct CREC *CLe;fprintf(LOG,"\nLog ended at =>; %s\n",NOWtm());fflush(LOG);if(LOG != stdout)fclose(LOG);exit(1);}err(fmt, a1, a2, a3, a4)char *fmt;char *a1, *a2, *a3, *a4;{(void) fprintf(stderr, fmt, a1, a2, a3, a4);(void) fprintf(stderr, "\n");(void) exit(1);}voidsigalrm(){(void) err("sigalrm: TIMEOUT");}strgetmsg(fd, ctlp, datap, flagsp, caller)int fd;struct strbuf *ctlp, *datap;int *flagsp;char *caller;{int rc;static char errmsg[80];(void) signal(SIGALRM, sigalrm);if (alarm(MAXWAIT) < 0) {(void) sprintf(errmsg, "%s: alarm", caller);syserr(errmsg);}*flagsp = 0;if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) {(void) sprintf(errmsg, "%s: getmsg", caller);syserr(errmsg);}if (alarm(0) < 0) {(void) sprintf(errmsg, "%s: alarm", caller);syserr(errmsg);}if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA))err("%s: MORECTL|MOREDATA", caller);if (rc & MORECTL)err("%s: MORECTL", caller);if (rc & MOREDATA)err("%s: MOREDATA", caller);if (ctlp->;len < sizeof (long))err("getmsg: control portion length < sizeof (long): %d", ctlp->;len); }expecting(prim, dlp)int prim;union DL_primitives *dlp;{if (dlp->;dl_primitive != (u_long)prim) {err("unexpected dlprim error\n");exit(1);}}strioctl(fd, cmd, timout, len, dp)int fd;int cmd;int timout;int len;char *dp;{struct strioctl sioc;int rc;sioc.ic_cmd = cmd;sioc.ic_timout = timout;sioc.ic_len = len;sioc.ic_dp = dp;rc = ioctl(fd, I_STR, &sioc);if (rc < 0)return (rc);elsereturn (sioc.ic_len);}dlattachreq(fd, ppa)int fd;u_long ppa;{dl_attach_req_t attach_req;struct strbuf ctl;int flags;attach_req.dl_primitive = DL_ATTACH_REQ;attach_req.dl_ppa = ppa;ctl.maxlen = 0;ctl.len = sizeof (attach_req);ctl.buf = (char *) &attach_req;flags = 0;if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) syserr("dlattachreq: putmsg");}dlokack(fd, bufp)int fd;char *bufp;union DL_primitives *dlp;struct strbuf ctl;int flags;ctl.maxlen = MAXDLBUF;ctl.len = 0;ctl.buf = bufp;strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack"); dlp = (union DL_primitives *) ctl.buf;expecting(DL_OK_ACK, dlp);if (ctl.len < sizeof (dl_ok_ack_t))err("dlokack: response ctl.len too short: %d", ctl.len);if (flags != RS_HIPRI)err("dlokack: DL_OK_ACK was not M_PCPROTO");if (ctl.len < sizeof (dl_ok_ack_t))err("dlokack: short response ctl.len: %d", ctl.len);}dlbindreq(fd, sap, max_conind, service_mode, conn_mgmt, xidtest) int fd;u_long sap;u_long max_conind;u_long service_mode;u_long conn_mgmt;u_long xidtest;{dl_bind_req_t bind_req;struct strbuf ctl;int flags;bind_req.dl_primitive = DL_BIND_REQ;bind_req.dl_sap = sap;bind_req.dl_max_conind = max_conind;bind_req.dl_service_mode = service_mode;bind_req.dl_conn_mgmt = conn_mgmt;bind_req.dl_xidtest_flg = xidtest;ctl.maxlen = 0;ctl.len = sizeof (bind_req);ctl.buf = (char *) &bind_req;flags = 0;if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)syserr("dlbindreq: putmsg");}dlbindack(fd, bufp)int fd;char *bufp;{union DL_primitives *dlp;struct strbuf ctl;int flags;ctl.maxlen = MAXDLBUF;ctl.len = 0;ctl.buf = bufp;strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack"); dlp = (union DL_primitives *) ctl.buf;expecting(DL_BIND_ACK, dlp);if (flags != RS_HIPRI)err("dlbindack: DL_OK_ACK was not M_PCPROTO");if (ctl.len < sizeof (dl_bind_ack_t))err("dlbindack: short response ctl.len: %d", ctl.len);}dlpromisconreq(fd, level)int fd;u_long level;{dl_promiscon_req_t promiscon_req;struct strbuf ctl;int flags;promiscon_req.dl_primitive = DL_PROMISCON_REQ;promiscon_req.dl_level = level;ctl.maxlen = 0;ctl.len = sizeof (promiscon_req);ctl.buf = (char *) &promiscon_req;flags = 0;if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)syserr("dlpromiscon: putmsg");}syserr(s)char *s;{(void) perror(s);exit(1);}void filter(cp, pktlen)register char *cp;register u_int pktlen;{register struct ip *ip;register struct tcphdr *tcph;register struct ether_header *eth;char *head=cp;static long line_count=0;u_short EtherType=ntohs(((struct ether_header *)cp)->;ether_type);if(EtherType < 0x600) {EtherType = *(u_short *)(cp + SZETH + 6);cp+=8; pktlen-=8;}eth=(struct ether_header*)cp;fprintf(LOG,"%-5d",++line_count);if(EtherType == ETHERTYPE_IP){ip=(struct ip *)(cp+SZETH);Mac_info(&eth->;ether_shost);fprintf(LOG,"(");Ip_info(&ip->;ip_src);fprintf(LOG,")");fprintf(LOG,"--->;");Mac_info(&eth->;ether_dhost);fprintf(LOG,"(");Ip_info(&ip->;ip_dst);fprintf(LOG,")");fprintf(LOG,"\n");}else if(EtherType == ARP_PROTO){cp+=SZETH;struct ether_arp *arp=(struct ether_arp *)cp;switch(ntohs(arp->;ea_hdr.ar_op)){case ARPOP_REQUEST:fprintf(LOG,"arp request:who has ");arp_ip_info(arp->;arp_tpa);fprintf(LOG," tells ");arp_ip_info(arp->;arp_spa);fprintf(LOG,"\n");break;case ARPOP_REPLY:fprintf(LOG,"arp reply: ");arp_ip_info(arp->;arp_spa);fprintf(LOG," is at ");Mac_info((struct ether_addr*)&arp->;arp_sha); fprintf(LOG,"\n");break;}//打印出arp数据报的内容}}do_it(){long buf[MAXDLBUF];char *device;int ppa;int fd;struct strbuf data;int flags;int i;int c;int offset;int len;struct timeval t;u_int chunksize = 16 * 1024;struct sb_hdr *bp;char *p, *limp;int mrwtmp;device = "/dev/bge";ppa = 0;sap= 0x0806;if ((fd = open(device, 2)) < 0)syserr(device);dlattachreq(fd, ppa);dlokack(fd, buf);if (promisc) {dlpromisconreq(fd, DL_PROMISC_PHYS); dlokack(fd, buf);}dlbindreq(fd, sap, 0, DL_CLDLS, 0, 0);dlbindack(fd, buf);if (strioctl(fd, DLIOCRAW, -1, 0, NULL) < 0)syserr("DLIOCRAW");if (bufmod) {if (ioctl(fd, I_PUSH, "bufmod") < 0)syserr("push bufmod");_sec = 0;_usec = 500000;if (strioctl(fd, SBIOCSTIME, -1, sizeof (struct timeval), &t) < 0)syserr("SBIOCSTIME");if (strioctl(fd, SBIOCSCHUNK, -1, sizeof (u_int),&chunksize) < 0)syserr("SBIOCSCHUNK");}if (ioctl(fd, I_FLUSH, FLUSHR) < 0)syserr("I_FLUSH");if(1){data.buf = (char *) databuf;data.maxlen = MAXDLBUF;data.len = 0;while (((mrwtmp=getmsg(fd, NULL, &data, &flags))==0) || (mrwtmp==MOREDATA) || (mrwtmp=MORECTL)) {p = data.buf;limp = p + data.len;filter(data.buf, data.len);data.len = 0;}printf("finished getmsg() = %i\n",mrwtmp);}}int main(argc, argv)int argc;char **argv;{char cbuf[BUFSIZ];struct ifconf ifc;int s,ac=1,backg=0;ProgName=argv[0];device=NIT_DEV;while((ac<argc) && (argv[ac][0] == '-')) {register char ch = argv[ac++][1];switch(toupper(ch)) {case 'I': device=argv[ac++];break;case 'O': if(!(LOG=fopen((LogName=argv[ac++]),"a")))Zexit(1,"Output file cant be opened\n");break;case 's':sap=atoi(argv[ac++]);break;default : fprintf(ERR,"Usage: %s [-s] [-i interface] [-o file]\n", ProgName);fprintf(ERR," -d int set new data limit (128 default)\n");fprintf(ERR," -o <file>; output to <file>;\n");exit(1);}}fprintf(ERR,"Using logical device %s [%s]\n",device,NIT_DEV);fprintf(ERR,"Output to %s.%s%s",(LOG)?LogName:"stdout",(debug)?" (debug)":"",(backg)?" Backgrounding ":"\n");if(!LOG)LOG=stdout;signal(SIGINT, death);signal(SIGTERM,death);signal(SIGKILL,death);signal(SIGQUIT,death);if(backg && debug) {fprintf(ERR,"[Cannot bg with debug on]\n");backg=0;}fprintf(LOG,"\nLog started at =>; %s [pid %d]\n",NOWtm(),getpid()); fflush(LOG);do_it();}。

相关文档
最新文档